本文编写于 867 天前,最后修改于 867 天前,其中某些信息可能已经过时。
PHP json_encode无输出问题以及处理调试方案
问题复现
今天改php老代码,把html和php混合的输出改成json输出方便渲染,于是正常使用了while语句
//直接输出json
$r = [];
$r['id'] = 0;
while($m = $db->fetch($sql)){
$r['id'] = $r['id']+1;
$r['src'] = "/m/show.php?id=".$m['id']."&kc=".$kecheng;
$r['title'] = $m['title'];
$res[] = $r;
}
//print_r($res);
echo json_encode($res) ;
结果发现一直输出空白,但如果使用print_r()
就又有输出,怀疑是json_encode()
函数有问题
问题思路
- 首先尝试了直接输出
$res
发现没问题,显示Array说明有数值 - 然后直接
echo json_encode(某数组)
,发现也没有输出,那必定是这个函数的问题 - 查找
php版本
,发现是5.6,查了手册发现只要是5.2以上版本都支持,那为什么还又问题呢?

解决思路
首先查网上资料,发现json_encode()
函数也有调试模式json_last_error()
,只要在输出后加上var_dump(json_last_error());
就能知道函数哪里出问题了
echo json_encode(array('error' => '0', 'message' => '没有错误'));
var_dump(json_last_error());
//这里也可以是json_decode
//错误码对照
0 JSON_ERROR_NONE
1 JSON_ERROR_DEPTH
2 JSON_ERROR_STATE_MISMATCH
3 JSON_ERROR_CTRL_CHAR
4 JSON_ERROR_SYNTAX
5 JSON_ERROR_UTF8
6 JSON_ERROR_RECURSION
7 JSON_ERROR_INF_OR_NAN
8 JSON_ERROR_UNSUPPORTED_TYPE
最后我出现的是int(5)
说明是JSON_ERROR_UTF8
错误,说明是编码错误,回头想想,确实是编码问题,因为是老项目,整个编码都是GB2312不是UTF8,导致无法encode,上图可以看得出来
那么就要把gb2312编码部分的中文转换成UTF8输出
那么用iconv('gbk', 'utf-8', $data)
函数就解决了
解决问题
//直接输出json
$r = [];
$r['id'] = 0;
while($m = $empire->fetch($sql)){
$r['id'] = $r['id'] + 1;
$r['src'] = "/m/show.php?id=".$m['id']."&kc=".$kecheng;
$r['title'] = iconv('gbk', 'utf-8', $m['title']);//中文部分转换后再输出
$res[] = $r;
}
//print_r($res);
echo json_encode($res) ;
最后输出成功
