应通过CodeIgniter实例获取已解析的数据库配置:先调用get_instance(),再load->database()确保初始化,最后访问$CI->db->hostname等属性;直接require database.php不可行,因其变量作用域受限且缺失运行时处理逻辑。

自定义类库中怎么拿到 database.php 里的配置
自定义类库(比如 application/libraries/My_service.php)默认拿不到 database.php 里的 $db['default'] 配置,因为 CI 的数据库配置是懒加载的,且只在 $this->db 初始化时才解析。直接读取 database.php 文件内容不可靠——它本质是 PHP 脚本,不是纯配置数组。
正确做法是通过 CodeIgniter 实例获取已解析好的配置:
- 在类方法里先调用
$CI =& get_instance() - 再用
$CI->load->database()确保数据库驱动已初始化(否则$CI->db可能为null) - 之后访问
$CI->db->hostname、$CI->db->username等属性即可(注意:这些是运行时解析后的值,已合并了$active_group和默认值)
为什么不能直接 require database.php 或读取 $db 数组
直接 require APPPATH.'config/database.php' 会执行整个文件,但其中 $db 是局部变量,外部无法访问;而且 $active_group 是全局变量,没上下文时无法确定该取哪一组。更关键的是,CI 会对配置做运行时处理(比如拼接 DSN、检查 dbdriver 是否支持),硬读原始数组会漏掉这些逻辑。
常见错误现象:
-
Notice: Undefined variable: db—— 因为$db在database.php中是函数作用域内变量 - 读到的
'hostname' => 'localhost'看似正确,但实际连接时却连错地址 —— 比如$active_group = 'production'但没加载对应分组
在自定义类里安全复用数据库连接
如果目标不是“读配置”,而是“执行查询”,那就别折腾配置提取,直接复用已初始化的 $this->db 更稳妥:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 确保
autoload.php已启用'database'(否则get_instance()后仍需手动load->database()) - 在类方法中写:
$CI->db->query('SELECT ...')或$CI->db->get('table') - 若需切换连接组(比如日志写进另一个库),用
$CI->load->database('log', TRUE),返回新 DB 实例,不影响默认连接
注意:TRUE 参数表示返回对象而非赋给 $CI->db,避免覆盖主连接。
自定义配置文件和 database.php 的关系别搞混
有人试图把数据库凭证挪到 config/my_db.php 里再 $this->config->load('my_db'),这是错的。CI 的数据库加载机制不认这种配置——database.php 是硬编码路径,框架启动时强制读取并初始化 $db 全局结构。你加的 my_db.php 里哪怕字段名一样,也不会被数据库驱动识别。
真正需要分离敏感配置(比如生产环境密码),应该:
- 保持
database.php结构不变,但把值换成$_ENV['DB_HOST']这类环境变量 - 或用
if (ENVIRONMENT === 'production')分支硬编码不同配置 - 绝不要删掉
$db['default']数组或改文件名——CI 框架只认这个路径和变量名
database.php 里的配置一旦写死,就只能靠 CI 自身加载流程生效;任何绕过它的“手动读取”都会丢失驱动兼容性判断、字符集处理、错误模式设置等关键环节。

















