我有一个问题,无法理解我做错了什么:
- 关于
index.php
通过onClick.js
向userZone.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末尾的代码也无法像您期望的那样工作。