数据库连接失败应先查看pdoexception的message字段明确错误类型,再检查mysql服务状态、配置匹配性、环境变量加载及mysql 8.0认证插件兼容性。

数据库连接失败不是配置改了就能好,关键得顺着错误信息一层层往下查。先看报错具体内容,再验证 MySQL 实际状态,最后确认 ThinkPHP 配置是否真被加载、用的是哪一套参数。
看清楚 PDOException 的 message 字段
ThinkPHP 本身不生成底层连接错误,真正说话的是 PDO。日志里只要出现 PDOException,就立刻盯住它的 message 内容:
- Connection refused → MySQL 没启动,或端口不对,或防火墙/安全组拦了
-
Access denied for user 'xxx'@'yyy' → 账号密码错,或该用户在 MySQL 的 host 权限不匹配(比如配了
127.0.0.1却只授权了localhost) - No such file or directory → 试图走 Unix socket 连接,但 sock 文件路径不对(常见于 Mac M1 或 Docker 环境)
手动验证 MySQL 是否真能连上
别依赖 ThinkPHP 报错来判断,直接用命令行测最准:
- 执行:
mysql -h 127.0.0.1 -P 3306 -u root -p(注意用127.0.0.1,不是localhost) - 如果这步都连不上,ThinkPHP 肯定也连不上,问题一定出在 MySQL 服务或网络层面
- Docker 环境请换为容器名(如
mysql)或host.docker.internal - 云服务器要确认安全组放行 3306,且 MySQL 用户的
host字段设为%或具体 IP
确认 ThinkPHP 配置是否生效
很多人改了 database.php 却没效果,其实是环境变量或加载逻辑没走通:
-
.env文件必须放在项目根目录(和think命令同级),不能丢进config/或app/ -
APP_DEBUG = true必须开启,否则.env不加载 - 键名要全大写+下划线:
DB_HOST✅,db_host❌ - 临时加一行:
dump(env('DB_HOST'));,输出null就说明.env没起作用
MySQL 8.0+ 认证插件不兼容
报错含 caching_sha2_password,不是密码错了,是 PHP 版本太低或驱动不支持:
- 登录 MySQL 执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 若 plugin 是
caching_sha2_password,改为:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 执行后记得
FLUSH PRIVILEGES; - 不建议降级 MySQL,调整认证方式更稳妥
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











