CodeIgniter支持在控制器中手动构建数据库连接参数并动态加载,适用于多租户等场景;需传入含hostname、username、password、database、dbdriver等键的配置数组,并设第二个参数为TRUE获取实例,连接仅限当前请求有效。

CodeIgniter 允许你在控制器中不依赖 application/config/database.php 的预设配置,而是临时、手动构建数据库连接参数并加载连接。这种方式特别适合多租户、动态数据库切换或安装向导等场景。
用 $this->load->database() 传入配置数组
这是最直接的方式:把数据库连接参数组织成一个关联数组,作为第一个参数传入 database() 方法,并将第二个参数设为 TRUE,表示返回数据库实例而非继续链式调用加载器。
- 必须包含的键:
hostname、username、password、database、dbdriver - 推荐补充:
dbprefix、char_set、dbcollat、db_debug(开发时设为TRUE便于排查) - 示例代码:
$config = [
'hostname' => '192.168.1.100',
'username' => 'app_user',
'password' => 's3cr3t',
'database' => 'client_db_001',
'dbdriver' => 'mysqli',
'dbprefix' => '',
'char_set' => 'utf8mb4',
'dbcollat' => 'utf8mb4_unicode_ci',
'db_debug' => TRUE
];
$db = $this->load->database($config, TRUE);
if ($db && $db->conn_id) {
echo "连接成功";
} else {
echo "连接失败:" . $db->error()['message'] ?? '未知错误';
}
连接后立即执行简单查询验证
光判断 $db 是否存在不够可靠,建议进一步检查 $db->conn_id(底层资源句柄)是否有效,或执行一条轻量查询(如 SELECT 1)确认连通性。
-
$db->query('SELECT 1')->row()可用于快速验证 - 若查询出错,可用
$db->error()获取具体错误信息(含 SQLSTATE 和 message) - 注意:该连接仅在当前请求生命周期内有效,不会影响全局默认连接
连接多个数据库并在同一控制器中并行使用
你可以创建多个独立连接实例,分别赋值给不同变量,互不干扰。
- 例如同时操作主库和日志库:
$main_db = $this->load->database($main_config, TRUE);$log_db = $this->load->database($log_config, TRUE);- 后续操作都通过对应变量调用,如
$main_db->get('users')或$log_db->insert('logs', $data)
避免常见坑点
手动连接虽灵活,但容易忽略细节导致失败:
-
驱动名拼写必须准确:比如 MySQL 是
mysqli(不是mysql),PostgreSQL 是postgre,SQLite3 是sqlite3 -
端口未显式指定时,CI 不会自动补全:若数据库非默认端口(如 PostgreSQL 的 5432),需加
'port' => '5432' -
字符集与排序规则要匹配数据库实际设置,否则可能报
Collation mismatch -
不要重复加载同名连接组:CI 内部会缓存已加载的连接,手动传参方式不受
$active_group影响,无需担心覆盖


















