PHP json_encode无输出问题以及处理调试方案

本文介绍了在PHP中遇到json_encode无输出的问题及其解决方案。问题源于老项目中GB2312编码与json_encode不兼容,通过设置json_encode的编码选项并使用iconv函数转换编码,成功解决了JSON输出空白的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()函数有问题

问题思路

  1. 首先尝试了直接输出$res 发现没问题,显示Array说明有数值
  2. 然后直接echo json_encode(某数组),发现也没有输出,那必定是这个函数的问题
  3. 查找php版本,发现是5.6,查了手册发现只要是5.2以上版本都支持,那为什么还又问题呢?

image-20210122202451468

解决思路

首先查网上资料,发现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) ;

最后输出成功

image-20210122205302493

参考资料

  1. php 解决json gbk编码中文null问题
  2. php json_encode输出空白问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值