You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:26:56