ThinkPHP前后端分离时数据库连接失败应先聚焦后端连通性:查看PDOException的message字段(如“Connection refused”“Access denied”“No such file”),用mysql -h 127.0.0.1 -P 3306 -u root -p直连验证,检查.env加载条件(位置、APP_DEBUG=true、全大写键名)、Docker host配置及MySQL 8.0+认证插件兼容性。

前后端分离环境下,ThinkPHP数据库连接失败的定位核心是:先剥离前端干扰,聚焦后端服务本身的连通性与配置有效性。关键不在于接口是否返回JSON,而在于控制器里那句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(容器名)或-h 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+认证插件兼容性
如果用的是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



















