Ajax结果在开发服务器和生产服务器之间是不同的


Ajax result differs between development and production server

我有一个小的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%,但是你明白了

的意思