mysqli_connect() 连接失败主因是 mysql 服务未运行、端口不通或认证插件不兼容,而非代码错误;应先检查服务状态、端口连通性、bind-address 配置及用户认证方式。

mysqli_connect() 连不上,先别改代码
绝大多数连接失败根本不是 PHP 写错了,而是 MySQL 服务没起来、端口不通或权限不对。直接执行 sudo systemctl status mysql(Linux)或检查 Windows 服务里 mysql 是否正在运行。如果服务停了,mysqli_connect() 无论参数怎么填都会报 (HY000/2002): Connection refused——这表示压根没连到 MySQL 进程。
确认服务在跑之后,用 telnet localhost 3306 或 nc -zv localhost 3306 测试端口可达性。失败就说明 MySQL 没监听该地址或被防火墙拦了。查配置文件(如 /etc/mysql/mysql.conf.d/mysqld.cnf)里的 bind-address,必须是 127.0.0.1 或 0.0.0.0,不能是 localhost(某些系统下会走 socket 而非 TCP,而 mysqli_connect() 强制走 TCP)。
面向对象写法比过程式更不容易崩
过程式写法里,mysqli_connect() 返回 false 时如果不显式判断,后续所有 mysqli_query($conn, ...) 都会触发 Warning: mysqli_query(): invalid mysqli object。而面向对象方式下,$conn = new mysqli(...) 实例化后,$conn->connect_error 属性能立刻告诉你错在哪,且后续调用 $conn->query() 失败也只返回 false,不会静默出错。
推荐这样写:
$host = 'localhost';
$user = 'root';
$pass = 'your_pass';
$db = 'test_db';
$port = 3306;
$conn = new mysqli($host, $user, $pass, $db, $port);
if ($conn->connect_error) {
die('连接失败: ' . $conn->connect_error);
}
$conn->set_charset('utf8mb4');
-
$port参数必须显式传,尤其当你改过 MySQL 默认端口时 - 测试阶段可先去掉
$db参数,只连服务器,确认基础连接通了再加库名 -
set_charset('utf8mb4')别漏,否则中文可能乱码;utf8在 MySQL 8+ 已不推荐
PHP 8.5.5 + MySQL 8.0+ 的认证插件坑
如果你用的是 MySQL 8.0+,默认用户认证插件是 caching_sha2_password,而老版本 mysqli 扩展(包括 PHP 8.5.5 自带的)不支持它,会卡在连接阶段,错误信息通常是 Authentication plugin 'caching_sha2_password' cannot be loaded。
解决方法是在 MySQL 里重置用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';
- 注意把
'your_user'@'%'换成你实际连接用的用户名和 host(比如'root'@'localhost') - 执行完要
FLUSH PRIVILEGES; - 远程连接时,确保授权的是
'user'@'%',不是'user'@'localhost'(后者在某些部署下走 Unix socket,mysqli 强制走 TCP 就会失败)
测试连接成功后,马上验证查询是否真可用
连上不等于能查。很多情况是连接成功但数据库不存在、表没建、或字符集不匹配导致 query() 返回 false 却没报错。
建议加一行最小验证:
$result = $conn->query("SELECT 1 AS ok");
if (!$result || $result->num_rows == 0) {
die('基础查询失败: ' . $conn->error);
}
- 不要只依赖
connect_error,它只管连接层,不管 SQL 层 -
$conn->error是每次操作后的最新错误,比全局mysqli_error()更准 - 如果项目已有 PDO,别为“统一”硬切 mysqli——混用反而增加维护成本,保持现状更稳
真正容易被忽略的,是 MySQL 的 bind-address 配置和认证插件这两处。代码写得再标准,这两点没对,连接永远在门外。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











