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(