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

为何echo json_encode无法输出合并多数据库查询后的数组?

JSON编码失败排查:多查询合并数组的问题

我之前用这段代码输出JSON数据完全正常:

$myArray = getDatabaseData($p1);
header('Content-Type: application/json');
echo json_encode($myArray);

但当我加入另一个通过4次数据库查询合并得到的数组后,json_encode直接输出为空了:

$myArray = getDatabaseData($p1); // 返回二维数组
$myArray2 = getDatabaseData2($p2); // 返回二维数组
$finalArray = array();
$finalArray['data1'] = $myArray;
$finalArray['data2'] = $myArray2;
header('Content-Type: application/json');
echo json_encode($finalArray);

测试后发现单独输出$myArray没问题,但单独输出$myArray2也失败。这里是两个数组的print_r结果:

$myArray的输出:

Array (
    [values] => Array (
        [0] => 0 [1] => 2 [2] => 3 [3] => 2 [4] => 7 [5] => 17 [6] => 6 [7] => 5 [8] => 9 [9] => 0
    )
    [keys] => Array (
        [0] => G. M. [1] => G. S. [2] => Cruz. [3] => At. [4] => Rem. C. [5] => Rem. S. [6] => Fs. [7] => Rec. [8] => B. P. [9] => V. F.
    )
)

$myArray2的输出:

Array (
    [names] => Array (
        [77] => Andr茅 [78] => Daniel [79] => R煤ben [80] => Ant锟絥io [81] => Jo茫o [83] => Jo茫o
    )
    [nums] => Array (
        [77] => 0 [78] => 2 [79] => 0 [80] => 0 [81] => 0 [83] => 6
    )
    [nums2] => Array (
        [77] => 0 [78] => 0 [79] => 4 [80] => 0 [81] => 3 [83] => 0
    )
)

请问是不是因为getDatabaseData2合并多查询导致的问题?


问题原因与解决方法

从$myArray2的输出能看出来,里面的字符串(比如Andr茅、R煤ben)明显是编码错误的特殊字符——原本应该是带重音的葡萄牙语字符(André、Rúben),但显示成了乱码。这说明你的数据库查询返回的字符串编码不是json_encode要求的UTF-8,导致编码失败。

json_encode只支持UTF-8编码的字符串,一旦遇到非UTF-8的字符(或者编码混乱的字符),就会返回false,自然输出为空。

具体解决步骤:

  1. 先排查错误原因
    在json_encode之后添加错误检查,确认具体问题:

    $json = json_encode($finalArray);
    if ($json === false) {
        echo "JSON编码错误:" . json_last_error_msg();
    } else {
        echo $json;
    }
    

    大概率会提示“Malformed UTF-8 characters, possibly incorrectly encoded”之类的错误。

  2. 修复数据库连接编码
    确保你的数据库连接使用UTF-8编码(推荐用utf8mb4支持更多字符):

    • 如果用mysqli:
      mysqli_set_charset($conn, 'utf8mb4');
      
    • 如果用PDO:
      $pdo = new PDO('mysql:host=localhost;dbname=your_db;charset=utf8mb4', 'user', 'pass');
      

    这样查询返回的字符串就是正确的UTF-8编码,不需要额外转码。

  3. 如果已经拿到乱码数组,递归转码
    如果没法修改数据库连接,就手动把数组里的所有字符串转成UTF-8:

    function convertToUtf8($array) {
        array_walk_recursive($array, function(&$item, $key) {
            if (is_string($item) && !mb_check_encoding($item, 'UTF-8')) {
                $item = mb_convert_encoding($item, 'UTF-8', 'ISO-8859-1');
            }
        });
        return $array;
    }
    
    // 使用转码后的数组
    $myArray2 = convertToUtf8(getDatabaseData2($p2));
    $finalArray['data2'] = $myArray2;
    echo json_encode($finalArray);
    

    这里假设你的数据库原本用的是ISO-8859-1编码,如果不是,需要替换成对应的原编码(比如Windows-1252)。

总之,核心问题是字符编码不匹配,和合并多查询本身无关——只是合并后的数组里包含了编码错误的字符,才导致json_encode失败。

内容的提问来源于stack exchange,提问作者user9324524

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:56:07