0

我有一个小的 ajax 脚本,它获取一些 json 数据并在用户进行选择时填充一些表单字段。

今天早上我注意到,当我在开发服务器上运行 ajax 时出现错误,但在运行生产端时它可以工作。我假设这是由于服务器之间的错误报告存在一些差异,但我不知道为什么。

开发 PHP 版本:5.3.13 产品 PHP 版本: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 在本地修复了错误,但我不明白为什么我需要在本地而不是在生产服务器上执行此操作。

关于什么设置可能导致这种情况的任何建议?

4

3 回答 3

1

因为您可能已经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
);
于 2013-03-06T00:14:47.440 回答
0

实际上,我会尝试纠正错误而不是简单地忽略它......尝试做这样的事情:

$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);
于 2013-03-06T00:16:59.813 回答
0

它与服务器上的 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%,但你明白了

于 2013-03-06T00:18:26.923 回答