db_connect()用于按需创建独立于默认配置的数据库连接,适合多库切换、CLI脚本、动态租户等场景;传入snake_case配置数组,驱动名须大驼峰,推荐配合env()和显式close()使用。

CodeIgniter 4 中 db_connect() 是一个灵活、轻量的函数,用于按需创建**独立于默认配置的数据库连接**,不走自动加载流程,也不依赖 .env 里 database.default.* 的预设。它适合临时切换库、多租户场景、后台任务或调试时绕过主配置验证。
什么时候该用 db_connect()
不是每次查库都要调它——CI4 默认已通过 .env 自动初始化 default 连接,并注入到控制器/模型中。只有当你需要:
- 连接一个跟主库完全不同的数据库(比如日志库、客户专属库)
- 在未启用自动连接的上下文里手动建连(如命令行脚本、自定义服务类)
- 测试某组临时凭证是否有效,又不想改
.env - 实现动态库切换逻辑(如用户登录后根据 session 切换所属数据库)
基本用法:传入配置数组
直接传一个关联数组给 db_connect(),结构和 .env 中的字段一一对应,但键名用下划线(snake_case),不是点号语法:
$customDB = db_connect([
'hostname' => 'localhost',
'username' => 'your_user',
'password' => 'your_pass',
'database' => 'another_db',
'DBDriver' => 'MySQLi',
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_unicode_ci'
]);返回的是一个 CodeIgniter\Database\ConnectionInterface 实例,可直接调用查询方法:
$result = $customDB->query("SELECT * FROM users LIMIT 5")->getResult();注意驱动名称大小写和拼写
CI4 对驱动名敏感,必须用大驼峰格式:
-
正确:
'DBDriver' => 'MySQLi'、'DBDriver' => 'Postgre'、'DBDriver' => 'SQLite3' -
错误:
'dbdriver' => 'mysqli'、'DBDRIVER' => 'MYSQLI'—— 这会导致连接失败且无明确报错
如果不确定当前环境支持哪些驱动,可查看 system/Database/ 目录下的子文件夹名,或运行 print_r(spl_classes()); 搜索相关类。
配合环境变量更安全
不建议把密码硬编码在代码里。可以结合 env() 函数从 .env 读取,同时保持配置干净:
$customDB = db_connect([
'hostname' => env('CUSTOM_DB_HOST', 'localhost'),
'username' => env('CUSTOM_DB_USER'),
'password' => env('CUSTOM_DB_PASS'),
'database' => env('CUSTOM_DB_NAME'),
'DBDriver' => env('CUSTOM_DB_DRIVER', 'MySQLi')
]);然后在 .env 中添加这几行(不会影响默认库):
CUSTOM_DB_HOST=localhost CUSTOM_DB_USER=tenant1_user CUSTOM_DB_PASS=abc123! CUSTOM_DB_NAME=tenant1_main CUSTOM_DB_DRIVER=MySQLi
别忘了关闭连接(可选但推荐)
db_connect() 创建的是非持久连接,默认请求结束会释放。但如果在长生命周期脚本(如 CLI 命令)中反复调用,建议显式关闭避免资源堆积:
$customDB->close();
或者用 try...finally 包裹确保执行:
$db = db_connect($config);
try {
return $db->table('logs')->insert($data);
} finally {
$db->close();
}不复杂但容易忽略


















