最直接有效的方式是用代码主动触发连接并捕获结果:构造配置数组,调用$this->load->database($config, true)获取db实例,检查$db->conn_id是否为resource/object,并执行$db->query("select 1")->row()验证查询;同时开启db_debug=true、error_reporting(e_all),确保mysqli扩展启用且用户权限正确。

最直接有效的方式是用代码主动触发连接并捕获结果,而不是等插入时才暴露问题。关键不是“能不能加载数据库类”,而是“能不能真正连上并执行简单操作”。
在控制器里写一段即时测试代码
把下面这段逻辑放进任意一个临时控制器方法(比如 Test.php 的 index() 方法),访问对应 URL 就能直观看到结果:
- 先手动构造数据库配置数组(可选:从表单或 config 动态读取)
- 调用 $this->load->database($config, TRUE),第二个参数设为 TRUE 表示返回 DB 实例而非加载器
- 检查返回值是否为对象,再调用 $db->conn_id 看是否为 resource 或 mysqli object
- 进一步执行一句 $db->query("SELECT 1")->row(),确认能跑通最简查询
示例片段:
$config = [
'hostname' => '127.0.0.1',
'username' => 'root',
'password' => '',
'database' => 'testdb',
'dbdriver' => 'mysqli',
'db_debug' => TRUE
];
$db = $this->load->database($config, TRUE);
if (is_object($db) && $db->conn_id) {
$result = $db->query("SELECT 1")->row();
echo $result ? '✅ 连接成功,查询正常' : '⚠️ 连接成功但查询失败';
} else {
echo '❌ 连接失败,请检查配置或扩展';
}
开启 db_debug 并查看真实错误信息
仅靠页面没报错不等于连上了——很多连接失败会静默失败。必须打开调试开关:
- 在 application/config/database.php 中确保 $db['default']['db_debug'] = TRUE;
- 如果使用非 default 组,也要对应设置该组的 db_debug
- 配合 error_reporting(E_ALL); ini_set('display_errors', 1); 让 PHP 错误也显示出来
这样一旦连接出问题(比如 Access denied、Connection refused、Unknown database),就会明确报错,而不是返回空或假成功。
验证 MySQLi 扩展和权限是否就绪
CI3 默认用 mysqli 驱动,但很多环境漏装或禁用:
- 命令行运行 php -m | grep mysqli(Linux/macOS)或检查 php.ini 是否启用 extension=mysqli(Windows)
- 确认数据库用户对目标库有 SELECT 权限(只读测试够用),新增测试则至少需要 INSERT
- 注意 localhost 和 127.0.0.1 在 MySQL 权限体系中可能被当作不同主机,尤其 Docker 或 MySQL 8+ 环境下
用 var_dump 快速判断连接状态
不需要写完整测试页,也可以在已有控制器里加一行快速验证:
- var_dump($this->db->conn_id); —— 返回 resource 或 object 表示已连上;返回 bool(false) 就是根本没连上
- var_dump($this->db->error()); —— 如果 conn_id 有效但后续操作失败,这个能拿到最近一次 SQL 错误
- 搭配 echo $this->db->last_query(); 可确认生成的 SQL 是否符合预期











