PHP源码搭建时数据库连不上,不是代码写错了,而是环境、配置、权限、扩展几个环节中某一处没对上。关键不是猜,是按顺序验证——先让错误说话,再一层层往下压。
立即捕获真实错误信息
别让连接失败沉默。在 mysqli_connect() 或 new PDO() 后必须加错误输出:
- mysqli:用 if (!$conn) { echo "错误:" . mysqli_connect_error(); exit; }
- PDO:用 try-catch 包裹,catch (PDOException $e) { echo $e->getMessage(); }
常见错误直读:
-
Connection refused → MySQL服务没启动,或端口被拦
-
Access denied for user → 用户名/密码错,或 'user'@'host' 不匹配
-
Unknown MySQL server host → host 值拼错、DNS不通、容器名写错
-
No such file or directory → localhost 走 socket 失败,换 127.0.0.1 即可
确认MySQL服务真正在运行且监听正确
一键环境(如phpStudy、XAMPP)里“绿色图标”不等于服务活着:
立即学习“PHP免费学习笔记(深入)”;
- 打开控制面板,看 MySQL 状态是否为“已启动”;若失败,点“日志”查 mysql_error.log
- 命令行验证:Windows 运行 netstat -ano | findstr :3306,Linux/macOS 运行 ss -tlnp | grep 3306
- 检查 my.cnf 或 my.ini:确认没有 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 或 %,并执行:GRANT ALL ON your_db.* TO 'user'@'%' IDENTIFIED BY 'pass'; FLUSH PRIVILEGES;
检查PHP扩展是否启用且版本兼容
哪怕参数全对,pdo_mysql 或 mysqli 没开,连接就卡在第一步:
- 运行 php -m | grep -i pdo(Linux/macOS)或 php -m(Windows 手动查找),确认 pdo、pdo_mysql、mysqli 都在列表中
- Laravel 要求 ctype、json、mbstring;Symfony 需 intl;Laravel 10+ 要求 PHP ≥ 8.1
- MySQL 8.0+ 默认用 caching_sha2_password 认证插件,PHP 7.4 以下不支持 → 执行:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pass'; FLUSH PRIVILEGES;