PHP中json_encode返回空值,循环可输出数组求助排查
解决json_encode返回空的问题
嘿,我之前也碰到过一模一样的情况——循环里能看到数组有数据,但转JSON就空了,大概率是编码或者数据类型的坑,给你几个实用的排查和解决办法:
1. 先搞定编码问题(最常见原因)
JSON只认UTF-8编码,如果你的数据库返回的是GBK或者其他编码的字符串,json_encode直接就罢工了。你可以这么处理:
- 先给数据库连接设置UTF-8编码:
mysqli_set_charset($db_conn, 'utf8mb4'); // 用utf8mb4还能支持emoji,更稳妥 - 如果已经查出来数据了,就循环转码每个字段:
$all_data = []; while ($row = mysqli_fetch_assoc($query_result)) { // 把每个字段转成UTF-8 foreach ($row as $key => $val) { $row[$key] = mb_convert_encoding($val, 'UTF-8', 'auto'); } $all_data[] = $row; }
2. 检查数组里有没有“不可序列化”的东西
如果数组里混了资源类型(比如数据库句柄、文件指针),或者没实现JsonSerializable的对象,json_encode也会返回空。你可以用var_dump($all_data)看一下最终数组的结构,要是有奇怪的类型,直接过滤掉:
while ($row = mysqli_fetch_assoc($query_result)) { // 删掉不需要的资源或特殊字段 unset($row['some_resource_field']); $all_data[] = $row; }
3. 让PHP告诉你到底错在哪
有时候json_encode失败不会抛错,但可以用json_last_error_msg()拿到具体错误信息,这比瞎猜管用多了:
$json_result = json_encode($all_data); if ($json_result === false) { die('JSON编码失败:' . json_last_error_msg()); }
比如常见的错误提示是Malformed UTF-8 characters,那就是编码问题;如果是Invalid value type,就是有不可序列化的数据。
4. 别漏了初始化总数组
最后别忘了在循环前先把总数组声明为空,不然循环里往未定义的变量里加元素,最后可能还是空的:
$all_data = []; // 必须先初始化! while ($row = mysqli_fetch_assoc($query_result)) { $all_data[] = $row; }
按照这几步来,应该就能解决你的问题了~
内容的提问来源于stack exchange,提问作者Abdu Hawi
相关产品推荐
相关产品推荐

