SyntaxError: "JSON.parse: unexpected non-whitespace ..." 当从 PHP 返回 JSON

Posted

技术标签:

【中文标题】SyntaxError: "JSON.parse: unexpected non-whitespace ..." 当从 PHP 返回 JSON【英文标题】:SyntaxError: "JSON.parse: unexpected non-whitespace ..." when returning JSON from PHP 【发布时间】:2019-07-11 07:42:21 【问题描述】:

我遇到了一个问题,即从 php 查询返回的 JSON 无效,我不确定为什么;我还在学习。当datatype 被排除时,以下代码返回:

"Customer_ID":"0", "FirstName":"John", "LastName":"Smith"
"Customer_ID":"1", "FirstName":"Jane", "LastName":"Smith"

否则返回:

SyntaxError: "JSON.parse: unexpected non-whitespace character after ..."

我认为这可能是因为记录没有在单个 JSON 响应中返回,但我看不出这是问题,因为并发响应是 JSON。有任何想法吗?有什么建议吗?随意指出语义问题。

HTML:

getRecord("*", "customer", "");

JavaScript:

function getRecord(field, table, condition) 
    var request = $.ajax(
        url: "./handler.php",
        method: "GET",
        dataType: "JSON",
        cache: "false",
        data: 
            action: "SELECT",
            field: `$field`,
            table: `$table`,
            condition: `$condition`,
        ,
    );

    request.done(function(data, status, xhr) 
        console.log(data, status, xhr);
    );

    request.fail(function(xhr, status, error) 
        console.log(xhr, status, error);
    );

;

PHP:

<?php

    # IMPORT SETTINGS.
    include "settings.php";

    # FUNCTION DISPATCHER.
    switch($_REQUEST["action"]) 

        case "SELECT":
            getRecord($conn);
            break;

        default:
            printf('Connection Error: Access Denied.');
            mysqli_close($conn);
    

    # LIST OF COLUMNS THAT WE NEED.

    function getRecord($conn) 
        $table = $_REQUEST["table"];
        $field = $_REQUEST["field"];
        $condition = $_REQUEST["condition"];

        if (!empty($condition)) 
            $query = "SELECT $field FROM $table WHERE $condition";
         else 
            $query = "SELECT $field FROM $table";
        

        if ($result = mysqli_query($conn, $query)) 
            while ($record = mysqli_fetch_assoc($result)) 
                echo json_encode($record);
            
        

        # CLOSE THE CONNECTION.
        mysqli_close($conn);

    

?>

【问题讨论】:

请注意,像$query = "SELECT $field FROM $table WHERE $condition"; 这样的语句根本不安全。黑客将能够使用此类执行任何 SQL 命令。您需要验证每个参数(即$table 真的是表的名称吗?)请参阅SQL Injection。 @AlexisWilke 这是我开始意识到的,我只是想克服这个错误以找出我做错了什么。我希望尽可能保持动态,但我不确定具体如何。一个想法是将表格列入白名单,但我不确定这是否可能。有什么建议可以让代码保持动态吗? 是的,您的表格列表并检查 $table 是否是这些名称之一将起作用。 $field 的问题是您将不得不输入所有表中所有字段的所有名称(您也可以对 MySQL 执行 SELECT 以获取信息,但是每次都需要花费时间你想访问数据库!)在我的最后,我经常使用*作为字段,因为加载整个一次会比一次加载一个字段快得多。现在你遇到了另一个问题:你可能不想返回用户的密码......(即使是加密的。) 【参考方案1】:

您的 JSON 无效,因为它由多个对象组成。您需要做的是将所有结果放入一个数组中,然后回显其中的json_encode。试试这样的:

    $records = array();
    if ($result = mysqli_query($conn, $query)) 
        while ($records[] = mysqli_fetch_assoc($result)) 
        
    
    echo json_encode($records);

这将为您提供如下所示的输出:

[
    "Customer_ID":"0", "FirstName":"John", "LastName":"Smith",
    "Customer_ID":"1", "FirstName":"Jane", "LastName":"Smith"
]

您可以通过类似的方式访问 javascript 中的每个元素

let customer = data[0].FirstName + ' ' + data[0].LastName;

【讨论】:

我计划使用$.each() 来返回数据,但您的回答解决了问题;谢谢。现在我需要弄清楚如何保持动态并防止漏洞。 @artomason 是的,$.each() 可以很好地处理这些数据。 This question有很好的讨论如何防止SQL注入

以上是关于SyntaxError: "JSON.parse: unexpected non-whitespace ..." 当从 PHP 返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

SyntaxError: "JSON.parse: unexpected non-whitespace ..." 当从 PHP 返回 JSON

我该如何纠正这个错误? print("\r+ 数据包发送:" + str(sent_packets_count), end="") ^ SyntaxError:

项目构建node-sass源码报错 SyntaxError:Unexpectedtoken"?"

“无法重新声明块范围的变量”和“SyntaxError:意外的令牌'导出'”[关闭]

Django-- File "manage.py", line 16 ) from exc ^ SyntaxError: invalid syntax(

Django-- File "manage.py", line 16 ) from exc ^ SyntaxError: invalid syntax(