我最近将我的开发服务器从PHP 5.4升级到PHP 5.6,并且在尝试测试时遇到了一个奇怪的错误。我的所有PHP代码都通过我的主视图将数据作为数组或字符串返回,它使用以下代码将数据作为JSON发送回任何Ajax查询。 (我为了测试目的而停用了MIME类型)
public static function SendData($data)
{
$response = array(
'status' => true,
'message' => $data
);
//header('Content-type: application/json');
exit(json_encode($response, JSON_HEX_APOS));
}
由此我的Javascript代码使用该数据,通常会立即将其解析为JSON,因为MIME类型告诉JQuery这样做并处理它。它在PHP 5.4中工作,但自从我升级后,我的响应被Jquery修改。在FireBug中查看服务器的响应,我发现它是有效的JSON(使用JSONlint测试)
{"status":true,"message":"Didier Tartempion|dtartempion@example.com|Gestion de commerce"}
但是当我在firebug中检查以下Jquery代码时
$.ajax({
url:"Connect.php",
type : 'POST',
data : data,
success:function(result)
{
//JSON processing, for now I debugg with
alert (result);
},
error: function(qXHR, textStatus, errorThrown)
{
alert(textStatus);
}
});
成功的结果变量实际上包含我奇怪格式化的响应,在使用firebug watch时看起来像这样:
"\n{"status":true,"message":"Didier Tartempion|dtartempion@example.com|Gestion de commerce"}"
因此,JQuery无法解析此问题,JSONlint表示它无效。甚至可能是新服务器的PHP5.6还有什么东西会导致这种奇怪的行为?
由于
答案 0 :(得分:0)
只是回显数据
echo json_encode($response, JSON_HEX_APOS);
答案 1 :(得分:0)
我建议您使用return
代替exit
public static function SendData($data)
{
$response = array(
'status' => true,
'message' => $data
);
//header('Content-type: application/json');
return json_encode($response, JSON_HEX_APOS);
}
在您的ajax通话中添加dataType
并添加console.log()
$.ajax({
url:"Connect.php",
type : 'POST',
data : data,
dataType : 'json'
success:function(result)
{
//JSON processing, for now I debugg with
console.log(result);
},
error: function(qXHR, textStatus, errorThrown)
{
console.log(textStatus);
}
});
收到回复后检查并检查浏览器控制台。你所有的问题都解决了。
答案 2 :(得分:0)
我问了一位我工作的高级程序员,他建议我检查是否有任何隐藏字符添加到响应中。在PHP中转换为十六进制时,没有找到隐藏的字符,但是当尝试在JS中发出警报时出现了一个。
我将此代码添加到我的成功函数
function toHex(str) {
var hex = '';
for(var i=0;i<str.length;i++) {
hex += ''+str.charCodeAt(i).toString(16);
}
return hex;
}
alert(toHex(result));
我注意到新服务器中添加了十六进制字符“feff”。通过互联网查看,我发现这是BOM char,用于通知浏览器文件已编码。我必须使用这个small PHP script并在服务器上执行它以消除错误。
显然,当您在notepad ++中打开文件并保存它时会发生类似这样的事情,它可能会破坏编码。