错误:“JSON.parse:JSON 数据第 1 行第 1 列的意外字符”,当包含其他 php 文件时


Error: "JSON.parse: unexpected character at line 1 column 1 of the JSON data" when include additional php file

我有一个问题,无法理解我做错了什么:

  • 关于index.php通过onClick.jsuserZone.php提交数据的button
  • userZone.php将创建一个字符串数组并编码为JSON
  • onClick.js会将解码的JSON结果显示为警报。

这工作正常,直到我从以下位置userZone.php更改一个简单的行:

//include($_SERVER['DOCUMENT_ROOT']."/engine/db.php"); 

自:

include($_SERVER['DOCUMENT_ROOT']."/engine/db.php");

-> db.php 应包含进一步的数据库连接设置,但当前为空文件。

一旦我包含空文件db.php,Firebug 就会告诉我:

语法错误:JSON.parse:JSON 数据第 1 行第 1 列处的意外字符 var json = JSON.parse(data);

完整的项目可以在这里找到:http://meet24.ch/StackOverFlow.zip

您的问题是您使用 BOM 文件保存为 UTF8。

虽然文件的开头看起来像,但在<?之前没有任何字符:

<?
  // ####################################################################################################################
  header('Cache-Control: no-cache, must-revalidate');
实际上,前面

有一个字节顺序标记<?此字符不可见,但将被解析。由于<? ?>之外的所有内容都将包含在输出中,因此 BOM 将与来自服务器的响应一起发送。

这不仅会破坏 JSON 解析,还会破坏压缩(在 php 中完成时),因为它会阻止发送标头。在服务器日志中,您还应该看到类似Warning: Cannot modify header information - headers already sent by的内容,这是由BOM引起的。

使用 php 时,应始终确保将文件另存为 UTF8,而不使用 BOM。

选中"$request" - 看起来它未定义。尝试使用这个:

 if ($_POST['request'] == 'jsonTest')

而不是:

 if ($request == 'jsonTest')

检查来自 ajax 的响应。

文件db.php不为空。以下是非评论内容:

header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jan 1996 00:00:00 GMT');
header('Content-type: application/json');
header('Content-Type: text/html; charset=utf-8');
session_start();

header调用告诉服务器发送特定的 HTML 标头行。在这种情况下,他们告诉浏览器该页面是使用字符集 UTF-8 的 HTML 页面,不应缓存。

session_start告诉服务器您要使用 $_SESSION 对象。此函数调用应该是您要做的第一件事。如果你只有很少的额外空间或 UTF 字节顺序标记,你会收到一条错误消息:"标头已发送"。

在项目中,将 db.php 包含在文件 userZone.php 的第 8 行。但在此之前,您已经发送了标头。因此,标头被发送两次,一次在userZone中.php一次在db.php中。然后你在 db.php 中调用session_start。您没有在项目中使用会话变量,因此它似乎毫无意义。不过,这可能不是导致错误的原因。userZone.php末尾的代码也无法像您期望的那样工作。