数据库连接失败主因是配置、环境、驱动未对齐:hostname用'localhost'在Linux下易因Unix socket路径错误导致连接失败,应改用'127.0.0.1';PHP需启用mysqli或pdo_mysql扩展并确认php.ini路径正确;MySQL 8.0+默认caching_sha2_password认证协议与旧版PHP不兼容,需ALTER USER切换为mysql_native_password或升级PHP;多库配置须用$this->load->database('name', TRUE)显式返回实例并手动赋值变量。

数据库连接失败不是代码写错了,而是配置、环境、驱动三者没对齐。 直接改 database.php 很可能白忙——错误发生在框架加载数据库前,调试代码根本没机会执行。
hostname 写成 'localhost' 就连不上?试试 '127.0.0.1'
Linux 服务器上,'localhost' 会强制走 Unix socket,但 PHP 可能找不到 socket 文件路径(比如 /var/run/mysqld/mysqld.sock),报错 mysqli::real_connect(): (HY000/2002): No such file or directory。
改成 '127.0.0.1' 强制走 TCP/IP,绕过 socket 路径问题。
Windows 或 Docker 环境下也建议统一用 '127.0.0.1',避免 hostname 解析歧义。
PHP 扩展没加载,CI 报错却像配置错了
CodeIgniter 报 Unable to connect to your database server,但你确认账号密码全对——大概率是 mysqli 或 pdo_mysql 根本没启用。
验证方式:php -m | findstr mysqli(Windows)或 php -m | grep -i mysqli(Linux/macOS)。
常见坑:
- 改了 Apache 目录下的
php.ini,但 CLI 或 FPM 加载的是另一份——运行php --ini看真正加载的路径 - Windows 下写
extension=mysqli不生效,必须写全名extension=php_mysqli.dll - PHP 7.0+ 已移除
mysql_*函数,确保php.ini里所有extension=php_mysql.dll或extension=mysql都被注释掉
MySQL 8.0+ 认证协议不兼容,连上也报错
报错 Client does not support authentication protocol requested by server,是 MySQL 8.0 默认用 caching_sha2_password 插件,而旧版 PHP 的 mysqli 不支持。
临时解法(开发环境):
登录 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
更稳妥的做法是升级 PHP 到 7.4+ 并确认 mysqli 扩展编译时启用了 OpenSSL 支持。
多数据库配置后,第二个库死活不加载
配了 $db['second_db'],但在控制器里写 $this->load->database('second_db', TRUE) 却返回 NULL 或静默失败。
关键点:
- 必须加
TRUE参数,否则 CodeIgniter 不返回 DB 实例,而是直接赋给$this->db - 变量名要自己存:写成
$this->second_db = $this->load->database('second_db', TRUE),不能依赖自动挂载 - 别在
__construct()里提前加载,等真正要用时再加载,避免初始化阶段就因第二个库失败中断流程
最常被忽略的其实是错误发生的时机:数据库连接失败往往卡在框架启动早期,database.php 里的调试语句根本跑不到。真要定位,得在文件最顶部加 die() 或写日志到 /tmp,而不是等 $this->db->error() 返回——它已经太晚了。


















