codeigniter多数据库靠配置多个$db键并调用$this->load->database('key', true)返回独立对象实现;不传true会覆盖$this->db导致原库失效,动态连接需手动拼全配置且字段缺一不可。

CodeIgniter 多数据库支持不是靠插件或运行时开关,而是靠配置数组结构 + $this->load->database() 的参数控制。不传第二个参数就等于“干掉当前 $this->db”,这是绝大多数人连不上第二库的根源。
database.php 里怎么加多个数据库配置
直接在 application/config/database.php 里定义多个 $db 键,比如 $db['default'] 和 $db['log_db']。每个键必须是完整、独立的连接配置数组。
-
'dbdriver'必须显式写对,如'mysqli';写成'mysql'或留空会导致静默失败 -
'pconnect'必须用大写布尔值TRUE或FALSE;小写的false会被当字符串处理,连接报错 - 所有键名必须是字符串字面量,
$db[$name]这种动态变量名在配置文件里完全无效 - 如果两个库在同一台 MySQL 服务器上,确认
'username'对目标库有对应权限(比如SELECT、INSERT),否则连得上但查不到表
$this->load->database() 的第二个参数到底要不要传 TRUE
要。不传或传 FALSE 就会覆盖 $this->db 实例,旧连接立刻丢失——你调一次 $this->load->database('report_db'),之后所有 $this->db->query() 都走新库,原库彻底不可达。
- 传
TRUE:返回新 DB 对象,$this->db不变,可并行操作:$report_db = $this->load->database('report_db', TRUE) - 不传或传
FALSE:把新连接赋给$this->db,原实例被替换 - 别用
null或字符串'true'代替布尔值TRUE,CI 会按false处理 - 模型里固定用第二库?建议在构造函数里一次性赋值:
$this->db = $this->load->database('report_db', TRUE)
用户填的数据库信息怎么连(比如数据导入页)
不能往 database.php 里硬塞变量——它在框架启动最早阶段加载,此时 $_POST、Session、环境变量全不可用。必须在控制器或模型里实时拼数组,再喂给 $this->load->database()。
- 字段必须和
database.php里的一致,尤其不能漏:'hostname'、'username'、'password'、'database'、'dbdriver'、'char_set'、'dbcollat' - 少一个字段可能连不上,或中文变问号;
'dbdriver'拼错(比如写成'mysql')也会失败且无明确提示 - 示例片段:
$db_config = ['hostname' => $input_host, 'username' => $input_user, 'password' => $input_pass, 'database' => $input_db, 'dbdriver' => 'mysqli', 'char_set' => 'utf8mb4', 'dbcollat' => 'utf8mb4_unicode_ci']
跨数据库事务为什么总不生效
CI 的 trans_start() / trans_complete() 只绑定在当前 DB 对象上,跨对象事务不成立。这不是配置问题,是设计限制。
- 不能在
$this->db里trans_start(),再用$log_db执行查询 - 一个事务的所有操作必须用同一个 DB 对象完成,比如全部走
$log_db->trans_start()+$log_db->insert() - 跨库原子性需应用层协调:先写主库,再调远程接口写日志库,失败则人工补偿
最易忽略的点是:database.php 里配好两套参数 ≠ 能同时用;$this->load->database('xxx') 不带 TRUE 就等于主动断开前一个连接;动态连库时漏掉 'char_set' 或 'dbcollat',可能让中文字段全变问号,但错误日志里根本不会提。











