“unable to connect to your database server”根本原因是配置与运行环境不匹配,需优先检查hostname(localhost/127.0.0.1)、mysql服务状态、用户权限(host精确匹配)、驱动兼容性(ci3用mysqli,php7+禁用mysql_*)及防火墙/selinux拦截。

数据库连接报错提示“Unable to connect to your database server”
这基本是配置项和运行环境不匹配导致的,不是代码写错了。先确认 $db['default']['hostname'] 值:本地开发常用 'localhost',但很多 Linux 服务器(尤其是用 socket 连接 MySQL 的)实际需要改成 '127.0.0.1' —— 因为 localhost 会强制走 Unix socket,而 127.0.0.1 才走 TCP/IP。
常见错误现象:
-
mysqli::real_connect(): (HY000/2002): No such file or directory→ 说明 PHP 尝试连 socket 文件失败,路径不对或 mysqld 没启动 -
Connection refused→ MySQL 服务没运行,或绑定了非127.0.0.1地址(比如只监听内网 IP) - 测试域能连、上线域连不上 → 很可能数据库账号没授权远程访问,检查
GRANT是否包含'user'@'%'或对应域名/IP
调试时加 print_r($db['default']) 没反应?
因为 CodeIgniter 在加载数据库前就报错了,database.php 文件末尾的调试代码根本没执行到。真正有效的调试位置在 system/database/DB_driver.php 的 connect() 方法开头,或者更直接:在 application/config/database.php 最顶部插入:
if (PHP_SAPI !== 'cli') {
header('Content-Type: text/plain');
error_log(print_r($_SERVER, true), 3, '/tmp/ci-db-debug.log');
die('DB config loaded, check /tmp/ci-db-debug.log');
}
这样能绕过框架初始化流程,第一时间看到配置是否被正确读取。
mysql_connect() 报错 “No such file or directory”
这是典型的旧版 CodeIgniter 2.x 遗留问题:mysql_* 函数在 PHP 7.0+ 已被彻底移除,调用必崩。不要手动补 mysql_connect() 调试代码 —— 它只会让你更困惑。
正确做法:
- 确认你用的是 CI3 还是 CI4:CI3 默认用
mysqli,CI4 强制用PDO - CI3 下检查
$db['default']['dbdriver']必须是'mysqli'(不是'mysql') - CI4 下看
app/Config/Database.php中$default->DBDriver是否为'MySQLi'或'PDO',且扩展已启用(php -m | grep -i mysqli) - 如果服务器只装了
pdo_mysql没装mysqli,CI3 会静默 fallback 失败,必须显式指定驱动
数据库账号密码没错,还是连不上
别急着改配置,先手工验证连接是否通:
在服务器上执行:mysql -h $HOST -u $USER -p$PASS -D $DBNAME(注意 -p 和密码之间**不能有空格**)
如果命令行也连不上,问题一定出在权限或服务端:
- MySQL 用户权限没刷:执行
FLUSH PRIVILEGES; - host 白名单限制太死:用
SELECT host,user FROM mysql.user;看账号绑定的 host 是localhost、127.0.0.1还是% - SELinux 或防火墙拦截:临时关掉试试
setenforce 0和systemctl stop firewalld - MySQL 配置了
skip-networking或bind-address = 127.0.0.1但没开远程端口
真实环境中,最常被忽略的是 MySQL 用户 host 字段和 PHP 连接时使用的 hostname 不一致 —— 它们必须精确匹配,'user'@'localhost' 和 'user'@'127.0.0.1' 是两个完全不同的账号。











