解析来自 Ajax 调用的 JSON 响应时出现问题

Issue parsing JSON response from an Ajax call

提问人:jmatt 提问时间:10/20/2023 最后编辑:Nickjmatt 更新时间:10/20/2023 访问量:82

问:

我使用 Ajax 调用从数据库中查找单个记录,响应返回并且 JSON.parse 不起作用(“意外的标识符”对象“”),但是当我尝试访问其中的任何值作为对象时,我也未定义。

Ajax 调用是:

 $.ajax({
                type        : 'POST', // define the type of HTTP verb we want to use (POST for our form)
                url         : 'php/mannoteslookup.php', // the url where we want to POST
                data        : formData, // our data object
                dataType    : 'json', // what type of data do we expect back from the server
                encode        : true,
                success: function(data) {
                    console.log(data);
                    JSON.parse(data);
                    var name = data.lastname;
                    console.log(name);
                    $('#notes-modal-title').append(name);
                },
                error: function(error) {
                    console.log(error);
                }
            })

json 是从以下 php 代码段返回的:

$sql = "SELECT lastname, journal, progress_notes FROM myrecords WHERE id=" . $id;
$result = $conn->query($sql); 
$dbdata = [];
while ($row = $result->fetch_assoc()) {
    $dbdata[] = $row;
}
echo json_encode($dbdata);

以下是返回的内容:

[{"lastname":"Smalls","journal":"Nature Medicine","progress_notes":"2023-10-19 - Form notification received\r\n"}]

我对此还很陌生,但我尝试在 php 中添加一个指定 json 的标头,这似乎删除了键周围的引号,但没有改变任何东西。我一定错过了什么,非常感谢任何建议/帮助。

javascript php json ajax

评论

1赞 Jaromanda X 10/20/2023
JSON.parse(data);返回解析后的数据,并且您忽略返回的值 - 不过,我认为您可能已经得到了一个对象 - 不确定,自从我使用 jquery 以来已经有 15 年了
2赞 Nico Haase 10/20/2023
这是JS错误还是PHP错误?此外,请注意,您的查询极易受到 SQL 注入的攻击。查看准备好的声明以避免被黑客入侵SELECT

答:

1赞 Deepak Mane 10/20/2023 #1

按以下方式使用。数据以具有多个对象的数组形式传入

var 名称 = data[0].lastname;

评论

0赞 jmatt 10/20/2023
非常感谢您的快速回复,这很有帮助!
2赞 Nick 10/20/2023 #2

此处不需要 JSON.parse,因为您指定了 .无论如何,您实际上并没有使用它,因为您没有从中分配输出。所以已经是一个 JavaScript 数组,而不是一个 JSON 字符串。dataType : 'json'data

data是一个数组,因为 PHP 中的这段代码将所有结果(如果有的话)放入一个数组中。

$dbdata = [];
while ($row = $result->fetch_assoc()) {
    $dbdata[] = $row;
}

如果(正如我从您的查询中怀疑的那样)您只期望查询有一个结果,您可以简单地使用

$dbdata = $result->fetch_assoc();

无论哪种方式,在你的JS中,你都需要检查一个不返回任何结果的查询,你可以使用可选的链接来做,例如

// array
name = data[0]?.lastname ?? 'Not found';
// result
name = data?.lastname ?? 'Not found';

请注意,通过直接在查询 () 中使用表单数据,您容易受到 SQL 注入的影响。我建议阅读这个问答,看看它是关于什么的,以及如何使你的代码安全。$id