Laravel本地数据库连接失败的首要原因是DB_HOST=localhost触发Unix socket连接而非TCP,导致“No such file or directory”错误;应改为127.0.0.1并执行php artisan config:clear清除配置缓存。

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。这不是密码错,也不是服务没开,是路径根本对不上。
- 把
$db['default']['hostname']从'localhost'改成'127.0.0.1',强制走 TCP/IP 连接 - Docker 或 MySQL 8+ 环境下也建议统一用
'127.0.0.1',避免 hostname 解析歧义 - 改完别忘了清 CodeIgniter 的缓存(
application/cache/目录可手动删)
PHP 扩展没加载,CI 却报“配置错误”
报 Unable to connect to your database server,但账号密码全对——大概率是 mysqli 或 pdo_mysql 根本没启用。CI 在加载数据库前就失败了,调试代码压根没机会执行。
- 运行
php --ini看真正生效的php.ini路径,别只改 Apache 下那份 - Linux/macOS:用
php -m | grep -i mysqli验证;Windows:用php -m | findstr mysqli - Windows 下要写全名:
extension=php_mysqli.dll,只写mysqli不生效 - PHP 7.0+ 已移除
mysql_*函数,确认php.ini里所有extension=mysql或extension=php_mysql.dll都被注释掉
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 支持(php -i | grep openssl) - 不要在
my.cnf里硬改default_authentication_plugin,会影响其他应用
多库配置后 $this->load->database('name', TRUE) 返回 NULL
配了 $db['second_db'],但在控制器里调用 $this->load->database('second_db', TRUE) 却返回 NULL 或静默失败——关键点是漏了 TRUE 参数。
- 不加
TRUE,CI 默认把实例赋给$this->db,覆盖默认库,且不返回任何值 - 必须加
TRUE才会返回 DB 实例,然后你得手动赋值:$second_db = $this->load->database('second_db', TRUE); - 如果仍返回
NULL,说明该库配置本身就有问题(比如主机不可达、用户无权限),先单独验证这个配置项
php --ini 和 php -m 验证这一步——很多人改了配置却没确认 PHP 实际加载的是哪份 ini、哪些扩展。


















