codeigniter 2 升级至 3 后数据库连不上,主因是 dbdriver 必须从 'mysql' 改为 'mysqli' 或 'pdo',因 ci3 彻底移除已废弃的 mysql 驱动;同时需启用 php mysqli 扩展,并显式设置 active_record = true(ci3 默认为 false),且开启 db_debug 与日志权限以捕获真实错误。

CodeIgniter 2 升级到 3 后数据库连不上,不是配置写错了,而是 dbdriver 值和底层扩展已不兼容——CI2 的 mysql 驱动在 CI3 中彻底移除,必须切换为 mysqli 或 pdo,否则 $this->db 初始化直接失败,且无明确报错。
CI2 的 mysql 驱动在 CI3 中完全不可用
CI2 允许配置 dbdriver = 'mysql',它依赖已废弃的 PHP mysql_* 函数;CI3 从第一个 alpha 版起就删掉了该驱动支持。即使你保留原配置,框架加载时会静默跳过数据库初始化,后续调用 $this->db->query() 必然报 Fatal error 或返回 NULL。
- 检查
application/config/database.php,确认dbdriver不是'mysql'—— 这个值在 CI3 中非法 - 必须改为
'mysqli'(推荐)或'pdo'(需额外配dsn) - 若强行保留
'mysql',CI3 日志里通常只记一句Unable to load the requested database driver,但不会中断脚本,容易误判为逻辑问题
mysqli 驱动启用后仍连不上?先验 PHP 环境
CI3 要求 PHP 启用 mysqli 扩展,且不能与旧版 mysql 扩展共存。很多升级失败案例,实际卡在 PHP 层——CI2 可能跑在带 mysql.so 的 PHP 5.4 上,而 CI3 需要 mysqli 已加载且工作正常。
- 运行
php -m | grep -i mysqli(Linux/macOS)或php -m | findstr mysqli(Windows),确认输出含mysqli - 检查
php --ini输出的配置路径,确保对应php.ini中未注释extension=mysqli(Windows 下是extension=php_mysqli.dll) - 若服务器同时跑 CI2 和 CI3 应用,注意 PHP-FPM pool 或 Apache vhost 的 php.ini 是否隔离——一个环境改了,另一个可能没生效
从 CI2 迁移时 active_record 行为差异
CI2 默认开启 active_record = TRUE,所有查询走 Query Builder;CI3 将其改为可选,并默认设为 FALSE。如果你的模型里大量使用 $this->db->where()->get() 却没显式初始化 QB,升级后会因 $this->db 未绑定 QB 实例而报错或返回空结果。
- 在
database.php中显式设$db['default']['active_record'] = TRUE,保持行为一致 - 更推荐逐步替换:把
$this->db->where('id', $id)->get('users')改为$this->db->from('users')->where('id', $id)->get(),避免未来 CI4 迁移再踩坑 - 注意
active_record仅影响 QB 方法链,不影响原生query()或事务操作
最易被忽略的是:CI2 的 db_debug = TRUE 会在页面底部输出 SQL 和错误,而 CI3 默认关闭该行为,且错误日志路径也变了(application/logs/ 下需手动开 chmod)。不打开日志,你根本看不到 mysqli_real_connect(): (HY000/1045): Access denied 这类关键线索。











