connection refused错误表明php根本未连上mysql进程,需先执行①sudo systemctl status mysql确认服务运行;②ss -tlnp | grep :3306检查端口监听;③telnet localhost 3306测试连通性。

mysqli_connect() 报 Connection refused 怎么快速定位
这不是密码错,而是根本没连上 MySQL 进程。先别改 PHP 代码,执行这三步:
① sudo systemctl status mysql 确认服务在运行;
② ss -tlnp | grep :3306 看监听地址是不是 *:3306(不是 127.0.0.1:3306);
③ telnet localhost 3306 或 nc -zv localhost 3306 测试端口通不通。不通就卡在服务、配置或防火墙层,PHP 代码再对也白搭。
面向对象写法比过程式更不容易漏错
过程式 mysqli_connect() 返回 false 时,后续所有 mysqli_query() 都会触发 warning 并静默失败;而面向对象方式下,$conn->connect_error 是明确属性,$conn->query() 失败直接返回 false,不会误判。推荐写法:
$conn = new mysqli('localhost', 'webuser', 'p@ssw0rd', 'myapp', 3306);
if ($conn->connect_error) {
error_log('MySQL connect failed: ' . $conn->connect_error);
die('Service unavailable');
}
$conn->set_charset('utf8mb4');
注意:set_charset('utf8mb4') 必须在连接成功后立即调用,不能靠 SQL 里的 SET NAMES 补救;myapp 是默认库名,但跨库查询时它不生效,建议后续用 db.table 全限定写法。
MySQL 8.0+ 用户认证插件不兼容怎么办
PHP 8.1 的 mysqli 默认不支持 caching_sha2_password 插件,连不上常见于 root 或新用户报 Access denied for user 却密码没错。登录 MySQL 执行:
ALTER USER 'webuser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'p@ssw0rd'; FLUSH PRIVILEGES;
如果是远程连接,把 'localhost' 换成对应 IP,比如 '192.168.1.100';别用 '%',云服务器常因安全组拦截导致实际无效。
测试脚本里别硬编码数据库名
测试连接是否成功,重点是验证凭证和服务可达性,不是查数据。最简脚本应只做连接和字符集设置,不带库名参数更稳妥:
$conn = new mysqli('localhost', 'webuser', 'p@ssw0rd');
if ($conn->connect_error) {
die('Connect failed: ' . $conn->connect_error);
}
echo "Connected OK";
这样能排除“库不存在”或“权限不足”的干扰;确认连接通了,再加第四参数 'myapp' 和 select_db() 测试库级权限。远程连接时,主机名别写 localhost——它走 socket,得用真实 IP 或域名。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











