PHP连接MySQL失败需按四步排查:先捕获真实错误信息,再验证MySQL服务是否监听端口,接着核对“user@host”授权与连接参数,最后检查PHP扩展启用及认证插件兼容性。

PHP 8.5.7 环境下 MySQL 连接失败,不是代码写错的问题,而是环境链路上某个环节断了。排查要讲顺序、看证据,不能靠猜。下面按真实调试逻辑分四步走,每步都带可执行命令和关键判断点。
第一步:让错误自己说话——捕获真实报错信息
别让连接失败沉默。无论用 mysqli 还是 PDO,必须立刻输出错误内容:
-
mysqli 方式:在
mysqli_connect()后加判断:if (!$conn) { die('MySQL Error: ' . mysqli_connect_error()); } -
PDO 方式:用 try-catch 包裹构造过程:
try { $pdo = new PDO($dsn, $user, $pass); } catch (PDOException $e) { echo $e->getMessage(); }
常见错误含义直读:
Connection refused → MySQL 没启动,或端口不通
Access denied for user → 用户名/密码错,或 'user'@'host' 不匹配
Unknown MySQL server host → host 字符串拼错、DNS 解析失败、Docker 容器名写错
No such file or directory → localhost 强制走 socket,但路径不对;换 127.0.0.1 即可解决
第二步:确认 MySQL 服务真正在监听且可达
一键环境(如 phpStudy、XAMPP)界面上的“绿色图标”不等于服务活着。必须验证进程和端口:
立即学习“PHP免费学习笔记(深入)”;
- Windows:打开
services.msc,找 MySQL80 或类似服务,确认状态为“正在运行”;若失败,右键启动,并设为“自动” - Linux/macOS:
sudo systemctl status mysql或brew services list | grep mysql查状态;未运行则sudo systemctl start mysql - 终端检查端口监听:
Linux/macOS 执行ss -tlnp | grep :3306或lsof -i :3306
Windows 执行netstat -ano | findstr :3306
无输出 = MySQL 没监听 TCP,需检查my.cnf中是否含skip-networking,以及bind-address是否为127.0.0.1或0.0.0.0(避免只写::1)
第三步:核对连接参数与用户授权细节
账号密码对 ≠ 能连上。“user”@“host” 是完整身份标识,必须严丝合缝:
- 登录 MySQL 执行:
SELECT User, Host FROM mysql.user;,看你要用的用户对应 Host 是localhost、127.0.0.1还是% - 本地开发强烈建议统一用
127.0.0.1(强制走 TCP),避开localhost引发的 socket 路径歧义 - Docker 或远程部署时,用户 Host 必须是具体 IP 或
%,并执行:CREATE USER 'your_user'@'%' IDENTIFIED BY 'your_pass';GRANT ALL ON your_db.* TO 'your_user'@'%';FLUSH PRIVILEGES; - 命令行直连验证:
mysql -h 127.0.0.1 -P 3306 -u your_user -p,能通再比对 PHP 配置
第四步:检查 PHP 扩展、版本兼容与认证插件
哪怕所有参数全对,扩展没开或认证不兼容,连接照样失败:
- 运行
php -m | grep -i "mysqli\|pdo_mysql"(Linux/macOS)或php -m(Windows 手动查),确认mysqli、pdo、pdo_mysql全部在列表中 - PHP CLI 和 Web SAPI 可能加载不同
php.ini,用php --ini和phpinfo()分别确认路径,编辑对应文件启用扩展:
Linux/macOS:extension=mysqli和extension=pdo_mysql
Windows:extension=php_mysqli.dll和extension=php_pdo_mysql.dll - MySQL 8.0+ 默认用
caching_sha2_password插件,PHP 8.5.7 虽支持,但某些旧客户端或 Docker Alpine 镜像仍可能出问题。保险起见可切换回传统插件:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';FLUSH PRIVILEGES;



















