CodeIgniter数据库连接失败的五大原因及解决方案:①验证MySQL服务状态与端口监听;②将hostname从localhost改为127.0.0.1避免Unix socket路径问题;③确认mysqli扩展已启用且php.ini配置正确;④MySQL 8.0+需调整用户认证插件或升级PHP;⑤多数据库加载须传TRUE参数并完整定义配置。

CodeIgniter项目启动时提示“Unable to connect to your database server using the provided settings”,但数据库账号密码确认无误,服务也在运行——这说明错误不在代码逻辑层,而是配置、环境或驱动三者未对齐。
先验证数据库服务是否真正就绪
别急着改代码,先确认MySQL本身是否可连:在服务器终端执行 mysql -h 127.0.0.1 -P 3306 -u root -p,输入密码后能进入MySQL命令行才代表服务监听正常。如果报错“Can’t connect to MySQL server”,说明MySQL根本没启动或端口被占;若提示“Access denied”,说明用户权限或主机限制有问题。
检查MySQL服务状态:systemctl status mysql(Ubuntu/Debian)或 systemctl status mysqld(CentOS/RHEL)。服务显示inactive?直接运行 systemctl start mysql 启动。
确认端口监听:netstat -tuln | grep :3306 必须看到 LISTEN 状态。没有?可能是MySQL配置了 bind-address = 127.0.0.1 但PHP运行在Docker容器里,此时需改为 0.0.0.0 或添加对应host授权。
hostname写成'localhost'就失败?立刻换掉
Linux环境下,【hostname设为'localhost'会强制走Unix socket路径】,而PHP可能找不到socket文件(如/var/run/mysqld/mysqld.sock),报错“mysqli::real_connect(): (HY000/2002): No such file or directory”。
打开 application/config/database.php,把 'hostname' => 'localhost' 改成 'hostname' => '127.0.0.1'。Windows和Docker环境也建议统一用 127.0.0.1,避免DNS解析歧义。
改完别忘了清缓存:删掉 app/cache 目录下所有文件,否则CI可能仍读旧配置。
PHP扩展没启用,错误却像配置错了
运行 php -m | grep -i mysqli(Linux/macOS)或 php -m | findstr mysqli(Windows),看输出里有没有 mysqli。没有?说明扩展根本没加载。
查真实生效的php.ini:php --ini,注意输出里的 “Loaded Configuration File” 路径——你改的那份可能不是它。
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') 却静默失败或返回NULL?
第一步:必须加 TRUE 参数,即 $second_db = $this->load->database('second_db', TRUE); ——否则CI只初始化不返回实例。
第二步:手动赋值给变量,不能直接链式调用:$this->load->database('second_db', TRUE)->query(...) 是错的,因为返回的是DB对象,但没保存引用。
第三步:确认 $db['second_db'] 数组定义完整,尤其 'dbdriver' 和 'database' 字段不能漏。缺一个字段,整个配置就会被CI忽略。


















