数据库连接失败需依次排查环境、配置、权限、服务四层:先临时开启错误报告(ini_set('display_errors',1); error_reporting(e_all))获取具体错误;再核对host/port/账号/库名是否与实际环境完全匹配;确认mysql服务运行并监听端口;验证用户授权主机及防火墙策略;最后检查php是否启用pdo_mysql等扩展。

数据库连接失败,不是代码写错了,而是环境、配置、权限、服务四层里有一处没对上。直接看错误信息最省时间,别猜。
先让错误自己说话
生产环境通常屏蔽错误,导致白屏或笼统提示。临时加几行调试代码,把底层报错打出来:
- 在连接前加:ini_set('display_errors', 1); error_reporting(E_ALL);
- 用 PDO 时,立刻设置异常模式:$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- 包在 try-catch 里,echo $e->getMessage(); 就能看到具体是“Access denied”、“Connection refused”,还是“Unknown database”
核对配置参数是否真实匹配
框架的 .env 或 database.php 里写的值,必须和数据库实际运行环境完全一致:
- host:本地开发写 127.0.0.1 比 localhost 更可靠(避免 socket 连接歧义);远程或 Docker 环境必须填 IP 或服务名,不能留 localhost
- port:MySQL 默认 3306,但有些云数据库(如阿里云 RDS)可能改过端口,确认命令行能连:mysql -h 127.0.0.1 -P 3306 -u user -p
- 用户名密码:复制粘贴容易带空格或不可见字符,手动重输一遍;密码含 @ / : ? 等符号时,Laravel 的 DSN 中需 URL 编码
- 数据库名:确认该库已创建,且拼写大小写完全一致(Linux 下表名和库名区分大小写)
检查 PHP 是否真能连上数据库服务
命令行能连 ≠ PHP 能连。两者可能走不同路径或受不同策略限制:
- 运行 php -m | grep -i pdo 和 php -m | grep -i mysqli,确认 pdo_mysql 和 mysqli 已启用
- PHP 8.2+ 不再支持旧版认证插件,若 MySQL 是 8.0+,用户得用 mysql_native_password:ALTER USER 'user'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd';
- Docker 环境常见问题:PHP 容器没装 pdo_mysql 扩展,Alpine 镜像需额外 apk add php82-pdo_mysql
- SELinux 或防火墙可能拦截 PHP 进程出站连接,临时关闭测试:setenforce 0 或 ufw disable
验证数据库服务本身是否就绪
很多问题根本卡在服务没起来,而不是代码问题:
- 查服务状态:systemctl status mysql(Ubuntu/Debian)或 systemctl status mysqld(CentOS/RHEL)
- 查端口监听:netstat -tuln | grep :3306,确保是 LISTEN 状态,且绑定地址不是 127.0.0.1:3306(这样外部连不上)
- 查用户权限:SELECT host, user FROM mysql.user;,如果目标用户 host 是 localhost,而 PHP 在另一台机器或容器里跑,就得授权 'user'@'%' 或具体 IP
- 用 telnet 数据库IP 3306 或 nc -zv 数据库IP 3306 测试网络通路,不通就查安全组、iptables、云平台防火墙规则
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











