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

PHP中将数组转为JSON遇报错,寻求正确实现方案

问题分析与解决方案

我来帮你梳理下问题,然后给出靠谱的解决步骤:

1. 第一种方法报错的原因

utf8_encode() 只能处理单个字符串,但你直接把 fetchAll() 返回的数组传进去了,自然会触发类型不匹配的警告。你要做的是把数组里的每一个字符串转成UTF-8编码,而不是给整个数组套这个函数。

2. 最省心的解决方案:从根源解决编码问题

其实不用事后转码,在PDO连接数据库的时候直接指定UTF-8编码,这样fetchAll()拿到的数组本身就是UTF-8格式的,后续转JSON一步到位:

// 连接数据库时指定编码(推荐用utf8mb4支持全表情和特殊字符)
$dsn = 'mysql:host=你的主机地址;dbname=你的数据库名;charset=utf8mb4';
$pdo = new PDO($dsn, '用户名', '密码');

// 直接转JSON即可
$this->resul = json_encode($this->sqry->fetchAll(PDO::FETCH_ASSOC));

3. 已拿到非UTF-8数组的补救办法

如果没法修改PDO连接参数,可以用递归遍历的方式,把数组里的每个字符串都转成UTF-8:

$rawArray = $this->sqry->fetchAll(PDO::FETCH_ASSOC);
// 递归处理数组内的所有字符串
array_walk_recursive($rawArray, function(&$value) {
    if (is_string($value)) {
        $value = utf8_encode($value);
    }
});
$this->resul = json_encode($rawArray);

4. 第二种方法的错误根源

你输出的时候加了<br>标签,这会让响应内容里混入非JSON字符,直接破坏了JSON的格式,所以前端解析时会报错。而且设置header('Content-type: application/json')后,响应内容必须是纯JSON字符串,不能有任何多余的内容(包括换行、空格、HTML标签)。

正确的输出方式应该是:

header('Content-type: application/json');
// 直接输出JSON,不要加任何额外字符
echo json_encode($this->fresul);
exit; // 确保后面没有意外输出

总结

优先选择在PDO连接时指定UTF-8编码,这是最简洁的方案;如果必须转码,用递归处理数组内的每个字符串;输出JSON时一定要保证内容纯净,同时正确设置响应头。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:01:45