我有一个小的ajax脚本,获取一些json数据,并在用户选择时填充一些表单字段。
我注意到今天早上有一个错误,当我在我的开发服务器上运行ajax,但当运行生产端它工作。我假设这是由于服务器之间错误报告的一些差异,但我不知道为什么。
Dev PHP版本:5.3.13PHP版本:5.3.16
我已经跟踪了一些变量的错误,这些变量只有在数据库中出现额外的行时才会设置。我正在检索1到3行。
第一行被赋值给$array1,其他行被赋值给$sec_row[0]和$sec_row[1]。
$array1 = ('Name'=>'George','Address'=>'52 Smith St',....etc);
$sec_row[0] = ('Alias1'=>'Jorge','Location'=>'SimCity',....etc);
echo json_encode(array('result1'=>$array1,'result2'=>$sec_row[0],'result3'=>$sec_row[1]);
注意$sec_row只在发现额外的结果时设置。
当$sec_row未定义时,ajax返回result2和result3为NULL。但是在我的本地主机上的开发服务器上,它给了我一个"未定义的索引"(如果只有$sec_row[0]设置)或"未定义的变量"(如果没有$sec_row设置)错误。
在编码json之前,我已经通过手动设置$sec_row在本地修复了错误,但我不明白为什么我需要在本地而不是在生产服务器上这样做。
关于什么设置可能导致这个问题有什么建议吗?
因为你可能已经打开了display_errors
,所以它会在JSON中间生成未定义的索引错误,使其成为无效的JSON,无法在JS端解析。
除了修复错误之外,最简单的方法就是关闭error_reporting。但是您应该通过检查是否设置了索引,然后输出值(或null
)来修复这个错误。
json_encode(array(
'result1'=>$array1,
'result2'=>isset($sec_row[0]) ? $sec_row[0] : null,
'result3'=> isset($sec_row[1]) ? $sec_row[1] : null
);
实际上,我会尝试纠正错误,而不是简单地忽略它…试着这样做:
$result = array('result1' => $array1);
if (isset($sec_row[0]))
$result['result2'] = $sec_row[0];
if (isset($sec_row[1]))
$result['result3'] = $sec_row[1];
echo json_encode($result);
这与服务器上的error_reporting级别有关因此,要么关闭它们——将以下内容添加到脚本的顶部,要么直接在php.ini中(如果您可以访问它)——查找display_errors,将其设置为0
error_reporting(0);
@ini_set('display_errors', 0);
或者为什么不事先构建json_encode即假设始终只有1个$result1
for($x = 0; $x <= count($sec_row); $x++) {
$more_json .= "'result'".$x+2 ."=> ".$sec_row[$x].","
}
# strip the last comma off
$more_json = rtrim($more_json ,',');
echo json_encode(array('result1'=>$array1, $more_json);
我没有测试过这个,所以语法可能不是100%,但是你明白了