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

CodeIgniter框架数据库查询数组转JSON失败问题排查求解

问题原因及解决方案

常见故障原因

  • 字符编码不兼容:json_encode 要求所有输入字符串必须为UTF-8编码,若数据库返回的结果包含非UTF-8字符(比如GBK编码的中文、特殊符号),会导致编码失败,返回空值或错误内容。
  • 控制器代码存在语法缺陷:你贴出的控制器index方法缺失闭合的大括号,实际运行会触发PHP语法错误,打断正常输出。
  • 输出格式不规范:使用print_r输出JSON字符串虽不会直接导致错误,但如果开启了调试模式或代码存在其他前置输出(比如空格、报错信息、BOM头),会破坏JSON的格式完整性,导致前端无法解析。
  • 数据库配置编码错误:CodeIgniter的数据库配置未指定UTF-8编码,查询返回的结果自动使用系统默认编码,和json_encode要求不匹配。

具体解决步骤

1. 修正数据库编码配置

打开application/config/database.php,确认以下配置项的值:

$db['default']['char_set'] = 'utf8';
$db['default']['dbcollat'] = 'utf8_general_ci';

同时确认你的MySQL数据库表、字段的编码统一为UTF-8(优先使用utf8mb4兼容emoji等特殊字符)。

2. 修正控制器代码

替换原有控制器逻辑,使用CodeIgniter官方推荐的Output类输出JSON,避免手动处理header和输出导致的异常,同时添加编码错误调试逻辑:

class Api2 extends CI_Controller {
    
    function __construct() {
        parent::__construct();
        $this->load->model('Book_model');
    }

    function index() {
        $books = $this->Book_model->get_all_books();
        
        // 编码异常处理:如果存在非UTF-8内容,先统一转码
        array_walk_recursive($books, function(&$item) {
            if (is_string($item)) {
                $item = mb_convert_encoding($item, 'UTF-8', 'auto');
            }
        });
        
        $output = [
            'data' => $books
        ];
        
        // JSON_UNESCAPED_UNICODE参数避免中文被转义
        $json = json_encode($output, JSON_UNESCAPED_UNICODE);
        
        // 捕获编码错误
        if (json_last_error() !== JSON_ERROR_NONE) {
            $json = json_encode([
                'code' => 500,
                'msg' => 'JSON编码失败:' . json_last_error_msg()
            ], JSON_UNESCAPED_UNICODE);
        }
        
        // 调用CI输出类处理响应
        $this->output
             ->set_content_type('application/json', 'utf-8')
             ->set_output($json);
    }
}

3. 清理多余输出

移除所有PHP文件末尾的?>标记,避免文件末尾的空格、换行被意外输出,同时关闭框架的调试模式,避免调试信息插入到JSON响应中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 08:15:01