mysqli_connect() 返回 false 时应立即用 mysqli_connect_error() 输出具体错误,常见原因包括连接拒绝、权限不足或 host 不匹配,需结合 CURRENT_USER() 和 php -m 排查。

mysqli_connect() 返回 false 怎么快速定位原因
直接查 mysqli_connect() 的返回值,别只写 mysqli_connect(...) 就完事。它失败时返回 false,但错误细节藏在 mysqli_connect_error() 里:
$conn = mysqli_connect($host, $user, $pass, $db, $port);
if (!$conn) {
echo "连接失败:". mysqli_connect_error(); // 这句必须加
exit;
}
常见输出如 Connection refused(端口不通)、Access denied for user(账号密码错)、Unknown MySQL server host(主机名解析失败)——每种对应不同排查路径。
“Access denied” 但账号密码确认无误?检查用户权限和 host 匹配
MySQL 用户是 'user'@'host' 组合,不是单看用户名。比如你用 localhost 连,但用户只授权了 'myuser'@'127.0.0.1',就会拒绝。
- 登录 MySQL 后执行
SELECT User, Host FROM mysql.user;看实际注册的 host - 用
SELECT CURRENT_USER();查当前连接匹配的是哪个用户 - 本地测试优先用
127.0.0.1而非localhost,因为后者可能走 socket,行为不一致 - 远程连接确保用户 host 是
'%'或具体 IP,且 MySQL 服务绑定了非127.0.0.1的地址(检查bind-address配置)
PHP 报 “Call to undefined function mysqli_connect()”
这不是数据库问题,是 PHP 缺扩展。尤其在 Docker、Mac M1/M2、或精简版 PHP(如某些 Windows 便携包)中高频出现。
立即学习“PHP免费学习笔记(深入)”;
- 运行
php -m | grep mysqli确认模块是否加载 - 没输出?检查
php.ini中是否启用了extension=mysqli(注意不是mysql,那是废弃的旧扩展) - Linux 上可能需要装
php-mysql或php-mysqli包(Ubuntu/Debian)或php-mysqlnd(推荐,支持原生驱动) - Windows 下确认
php_mysqli.dll文件存在,且extension_dir路径正确
连接成功但查询报错 “MySQL server has gone away”
这通常不是初始连接失败,而是连接空闲超时被 MySQL 主动断开,后续再用就崩了。常见于长脚本、CLI 模式或连接复用不当。
- 检查 MySQL 的
wait_timeout和interactive_timeout值(默认常为 28800 秒,即 8 小时;但某些云数据库设得极短,如 60 秒) - PHP 端不要长期持有连接变量并跨多处使用;必要时用
mysqli_ping($conn)预检,失败则重连 - 避免在循环里反复
mysqli_query()却不释放结果集,累积会触发内存或连接异常 - 如果用 PDO,注意
PDO::ATTR_PERSISTENT => true不能解决这个,持久连接反而更容易暴露 timeout 问题
真正卡住的往往不是语法或配置项本身,而是错误信息没打出来、用户 host 没对上、或者扩展根本没启用——先盯住那行 mysqli_connect_error() 输出,再查 CURRENT_USER() 和 php -m,90% 的连接失败就落在这三个点上。



















