mysqli_connect()失败返回false但无报错,需立即检查返回值并调用mysqli_connect_error()获取真实原因;常见原因包括未开启错误提示、错误被@抑制、MySQLi扩展未启用、连接被拒绝或权限不足。
mysqli_connect_error()
PHP 连数据库失败却看不到具体错误,大概率是没开启错误提示或没捕获返回值。mysqli_connect() 失败时返回 false,但不会自动抛异常,必须手动调用 mysqli_connect_error() 才能拿到真实原因。
常见遗漏点:
false 调用 mysqli_query(),导致后续报“expects mysqli object”类错误@ 抑制,或 display_errors = Off + log_errors = Off 导致完全静默php -m | grep mysqli 确认)建议写法:
$conn = mysqli_connect($host, $user, $pass, $db, $port);
if (!$conn) {
die('连接失败:' . mysqli_connect_error());
}
Connection refused 表示 PHP 尝试 TCP 握手失败,不是账号密码错,而是根本连不到 MySQL 进程。
按顺序排查:
systemctl status mysql(Linux)或任务管理器里看 mysqld.exe(Windows)127.0.0.1:3306,但配置文件中 bind-address 设为 127.0.0.1 时无法从容器或远程连接;Docker 场景常用 host.docker.internal 或宿主机 IPfirewall-cmd --list-ports 看 3306 是否放行;云服务器还要查安全组规则telnet 127.0.0.1 3306 或 nc -zv 127.0.0.1 3306 验证端口可达性Access denied for user 'xxx'@'yyy' 是最典型的权限类错误,但 yyy 不一定是你想象的来源地址。
关键点:
'user'@'host' 组合,'root'@'localhost' 和 'root'@'%' 是两个不同用户,后者才允许远程连接$host 值决定匹配哪个 @host:填 127.0.0.1 匹配 @'127.0.0.1',填 localhost 在 Unix 套接字下可能走 socket 而非 TCP,行为不一致caching_sha2_password 插件,老版本 PHP(ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';CLI 和 Web(如 Apache mod_php / FPM)可能加载不同的 php.ini,导致一个环境能连、另一个不能。
验证步骤:
页面,搜 pdo_mysql,确认已启用且版本匹配php -m | grep pdo 和 php --ini,对比配置路径是否与 Web 环境一致php:alpine)需手动安装扩展:docker-ph
p-ext-install pdo_mysql,仅 apk add php-pdo 不够php.ini 必须重启 php-fpm 进程,reload 不一定生效连接字符串中主机名、端口、字符集(?charset=utf8mb4)漏写或写错,也会静默失败或报语法错误,这类细节最容易在迁移环境时被忽略。