ThinkPHP数据库连接失败核心是后端连通性或配置问题:先验证Db::table('user')->find()能否执行,再查PDOException message定位“Connection refused”“Access denied”或“No such file”三类错误,结合mysql命令直连、.env加载条件及MySQL 8.0+认证插件兼容性排查。

ThinkPHP数据库连接失败,核心原因不是代码写错了,而是后端服务连通性或配置有效性出了问题。关键要跳过前端干扰,直接验证控制器里 Db::table('user')->find() 这一句能不能跑通。
看PDOException的message字段定位错误类型
打开 runtime/log/ 下最新日志,找到带 PDOException 的那条记录,紧盯它的 message 字段:
- Connection refused → MySQL 没启动,或配置的 host/port 根本不通
-
Access denied for user → 账号密码错,或该用户只允许从
localhost连,而 PHP 实际运行在 Docker 容器或 Nginx 中 -
No such file or directory → 配置写了
localhost,但 MySQL 没启用 socket,或路径不对(尤其 Mac M1 用 Homebrew 安装时)
用命令行直连验证MySQL真实状态
别只改 database.php,先在服务器或容器里执行:
-
mysql -h 127.0.0.1 -P 3306 -u root -p(注意用127.0.0.1,不用localhost) - 能登录,说明服务、账号、端口都 OK;登不上,ThinkPHP 肯定也连不上
- Docker 环境中,
-h要换成容器名(如mysql)或host.docker.internal
检查.env是否真正被加载
前后端分离项目常用 .env 管理配置,但它有三个硬性条件:
立即学习“PHP免费学习笔记(深入)”;
-
.env必须放在项目根目录(和think命令同级),不是config/或app/下 -
APP_DEBUG=true必须开启,否则环境变量加载逻辑会被跳过 - 键名必须全大写加下划线,比如
DB_HOST=127.0.0.1,写成db_host或Db_Host都无效 - 临时在控制器加
dump(env('DB_HOST'));,输出null就说明上面某条没满足
确认MySQL 8.0+认证插件兼容性
如果报错含 caching_sha2_password,说明 PHP 版本偏低(如 7.4 以下)不支持默认认证方式:
- 不要降级 MySQL,执行 SQL 改认证:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改完记得
FLUSH PRIVILEGES; - 云服务器上还要确认安全组放行 3306 端口,且用户
host字段设为%或具体 IP,不能是localhost



















