PHP将MySQL查询值推入数组时含Beschreibung字段后json_encode输出为空问题
问题原因
输出为空是json_encode()执行失败返回false导致的。PHP的json_encode要求所有待处理的字符串必须为UTF-8编码,一旦遇到不符合编码要求的内容就会直接返回false,不会输出任何内容。你提到的Beschreibung是Text类型,通常存储的内容较长、可能包含特殊字符或者非UTF-8编码的内容,就是触发这个问题的原因。
解决方法
- 第一步:先确保数据库连接的编码统一为UTF-8,在执行SQL查询前添加编码设置代码:
如果你用的是mysqli扩展:
如果你用的是PDO扩展,在初始化连接时就指定编码:$conn->set_charset('utf8mb4');
用$pdo = new PDO('mysql:host=xxx;dbname=xxx;charset=utf8mb4', 'username', 'password');utf8mb4而不是普通的utf8,可以支持emoji等4字节的特殊字符,避免这类字符导致的编码错误。 - 第二步:对Text字段内容做编码兜底转换,避免意外编码导致失败,修改数组中对应字段的赋值逻辑:
这段代码会自动识别常见编码并转换为标准UTF-8,兼容大部分异常编码场景。"Beschreibung" => mb_convert_encoding($row["Beschreibung"], 'UTF-8', 'UTF-8,GBK,ISO-8859-1'), - 第三步:添加错误排查逻辑,方便后续定位其他潜在问题,修改输出部分的代码:
$json = json_encode($data); if (json_last_error() !== JSON_ERROR_NONE) { // 开发环境可以直接输出错误信息,生产环境可以写入日志 echo "JSON编码错误:" . json_last_error_msg(); } else { echo $json; }
可选优化
你当前用的array_push($data, $arr)可以简化为$data[] = $arr,不需要调用函数,性能略好,逻辑也更直观。
内容的提问来源于stack exchange,提问作者Simon Giesen
相关产品推荐
相关产品推荐

