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
相关产品推荐
相关产品推荐

