codeigniter 2 升级到 3 需修改数据库驱动为 mysqli、调整 $db 数组结构(如用 $query_builder 替代 $active_record)、重写连接验证逻辑(改用 $db->initialize() 判断)、显式声明 $active_group。

CodeIgniter 2 升级到 3 时,数据库配置不是简单替换文件就能跑通的,核心变化集中在驱动、配置结构和连接行为上。尤其要注意 mysqli 驱动强制启用、$db 数组结构微调、以及动态连接校验方式的差异——这些不改,很容易出现“连得上但查不出”或“报错却没提示”的情况。
数据库驱动必须从 mysql 改为 mysqli
CI2 默认支持 mysql(已废弃),而 CI3 完全移除了该驱动。若 config/database.php 中仍保留:
-
$db['default']['dbdriver'] = 'mysql';→ 必须改为'mysqli' - 同时确认主机、端口、字符集等参数兼容 mysqli,例如
'char_set' => 'utf8mb4'更稳妥 - 如果使用 PDO,需显式指定
'dbdriver' => 'pdo'并配好'dsn',不能只靠旧写法
配置数组结构更严格,部分键名已弃用
CI3 的 $db 数组不再接受 CI2 中某些宽松字段,否则可能静默失效:
-
$active_record已彻底移除,改用$query_builder = TRUE;(在 config/database.php 中设置) -
cache_on和cachedir仍存在,但缓存机制底层已重构,建议检查缓存目录权限和路径是否可写 -
stricton默认为FALSE,但在开发环境设为TRUE可提前暴露 SQL 模式问题
动态连接验证逻辑必须重写
CI2 中常用 $this->load->database($config) 后直接判断返回值,CI3 不再适用:
-
$this->load->database($config, TRUE)总是返回对象(即使连接失败),不能用if()判真假 - 正确做法是:先加载,再调用
$db->initialize(),它在成功时返回TRUE,失败则返回FALSE - 示例:@
$db = $this->load->database($config, TRUE); if (@$db->initialize()) { /* 连接有效 */ } else { /* 提示账号密码错误或服务不可达 */ }
默认连接组名与自动加载行为变化
CI3 要求 $active_group 显式声明,且不再默认加载所有组:
- 确保
$active_group = 'default';存在于 config/database.php 顶部 - 若项目用了多库(如日志库、用户库),各组必须独立定义,不能依赖 CI2 的隐式 fallback
-
$this->db仅指向$active_group对应的连接;切换需手动$this->load->database('other_group', TRUE)











