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

CodeIgniter数据库连接失败,不是代码写错了,而是配置、环境、驱动三者没对齐。错误往往发生在框架加载数据库之前,调试代码根本没机会执行,所以不能只盯着控制器或模型查——得从底层连通性开始逐层验证。
先看 hostname 和端口是否真能通
hostname 写成 'localhost' 在 Linux 下容易失败,因为会强制走 Unix socket,但 PHP 可能找不到 mysqld.sock 路径(比如 /var/run/mysqld/mysqld.sock),报错 “No such file or directory”。换成 '127.0.0.1' 就能强制走 TCP/IP,绕过 socket 问题。Windows 或 Docker 环境也建议统一用 '127.0.0.1',避免 DNS 解析歧义。
还要确认端口是否匹配:MySQL 默认是 3306,如果改过端口,database.php 里必须同步更新 'port' 项;同时用命令验证服务是否监听:
netstat -tuln | grep :3306
再试试命令行直连:
mysql -h 127.0.0.1 -P 3306 -u your_user -p
检查 PHP 扩展有没有真正启用
报错 “Unable to connect to your database server” 却账号密码全对?大概率是 mysqli 或 pdo_mysql 根本没加载。别只改 Apache 的 php.ini——CLI、FPM 可能加载另一份,先运行:
php --ini
看清真正生效的配置路径,再打开对应 php.ini,确认:
- Linux/macOS:有 extension=mysqli(PHP 7.0+ 不要写 mysql_*)
- Windows:写全名 extension=php_mysqli.dll
- 所有旧版 mysql 扩展(如 php_mysql.dll)必须注释掉
MySQL 8.0+ 用户认证协议不兼容
报错 “Client does not support authentication protocol requested by server”,说明 MySQL 8.0 默认用 caching_sha2_password,而老版本 PHP 的 mysqli 不支持。开发环境可临时修复:
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 参数:
-
错误写法:
$this->load->database('second_db');→ 框架默认赋给$this->db,覆盖主库 -
正确写法:
$second_db = $this->load->database('second_db', TRUE);→ 显式返回 DB 实例
否则变量为空,后续调 $second_db->query() 就直接报错或静默失败。











