最直接有效的方式是在控制器中用Db::table('user')->find()快速验证,表名需真实存在;报错即暴露根源,如“Table doesn't exist”或PDOException;配合dump(env('DB_HOST'))确认.env加载,命令行mysql直连交叉验证,再查runtime/log下PDO日志定位具体问题。

最直接有效的方式,是在控制器里写一行查询代码并访问对应接口,看是否返回数据或明确报错。
用 Db::table() 快速验证
在任意控制器方法中(比如 IndexController 的 index 方法),加入:
Db::table('user')->find();
注意:表名 'user' 要换成你数据库里真实存在的表。如果表不存在,会报“Table doesn't exist”;如果连不上库,会抛出 PDOException,错误信息直接暴露问题根源(如 Connection refused、Access denied)。
立即学习“PHP免费学习笔记(深入)”;
访问该接口(如 /index/index),浏览器或 curl 一刷就能看到结果——成功返回数组说明通了;报错则立刻聚焦错误提示本身,不用猜。
配合 dump(env('DB_HOST')) 确认配置加载
.env 文件没生效是高频盲区。在同个方法里加一句:
dump(env('DB_HOST'));
如果输出 null,说明 .env 没被读取。常见原因有三个:
• .env 不在项目根目录(必须和 think 命令同级)
• APP_DEBUG=false,导致环境变量加载被跳过
• 键名写成了小写(如 db_host)或驼峰(DbHost),必须全大写加下划线(DB_HOST)
命令行直连是最权威的交叉验证
别依赖 PHP,直接在服务器或容器里执行:
mysql -h 127.0.0.1 -P 3306 -u root -p
能登录,说明 MySQL 服务、端口、账号密码都 OK;登不进去,ThinkPHP 肯定也连不上。Docker 环境记得把 127.0.0.1 换成 mysql(容器名)或 host.docker.internal(宿主机)。
看 runtime/log 下的 PDOException 日志
打开 runtime/log/ 里最新的日志文件,搜索 PDOException,盯住 message 字段:
• Connection refused → MySQL 没启动,或 host/port 配置与实际不符
• Access denied for user → 用户权限不对,尤其注意用户 host 是 localhost 还是 %
• No such file or directory → 配置写了 localhost,但 MySQL 没启用 socket,或路径异常(常见于 Mac M1)



















