为何echo json_encode无法输出合并多数据库查询后的数组?
我之前用这段代码输出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,自然输出为空。
具体解决步骤:
先排查错误原因
在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”之类的错误。
修复数据库连接编码
确保你的数据库连接使用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编码,不需要额外转码。
- 如果用mysqli:
如果已经拿到乱码数组,递归转码
如果没法修改数据库连接,就手动把数组里的所有字符串转成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

