ThinkPHP升级后数据库连接失败是因.env键名规范变更,必须使用DB_HOST等标准格式,且需修正空格、引号、编码、路径,并同步更新config/database.php中的env()调用及清除配置缓存。

升级ThinkPHP后发现数据库连不上、自定义配置读不到、.env里明明写了DB_HOST却还是用127.0.0.1连接——这不是代码写错了,而是新版本对.env文件的解析规则、键名映射关系和加载逻辑全变了,旧格式直接失效。
确认当前ThinkPHP版本对应的.env键名规范
ThinkPHP 6.3+ 和 8.x 默认使用 DB_* 前缀命名,不再兼容 database.hostname 这类嵌套式键名;如果你从 TP5 或早期 TP6 升级上来,.env 里的 DATABASE_HOST、database.host、DBHOST 都不会被识别。【必须全部改成 DB_HOST、DB_NAME、DB_USER、DB_PASSWORD 格式】
验证方法:在控制器里执行 echo \think\facade\Env::get('DB_HOST');,输出为空就说明键名不匹配。
修正.env文件格式细节
方法一:修复空格与引号问题
立即学习“PHP免费学习笔记(深入)”;
等号两侧绝对不能有空格——DB_HOST = 127.0.0.1 是无效的,必须写成 DB_HOST=127.0.0.1;值含 @、/、:、! 等字符时,必须用单引号包裹,例如 DB_PASSWORD='pa@ss/word';双引号会被 shell 展开,可能导致密码截断。
方法二:处理特殊字符的 URL 编码
MySQL 密码含 @ 或 / 时,PDO 初始化会把 @ 当作 host 分隔符,直接报 SQLSTATE[HY000] [1045]。此时不能只加单引号,必须 URL 编码:pa@ss/word → pa%40ss%2Fword,写成 DB_PASSWORD='pa%40ss%2Fword'。
方法三:检查文件编码与位置
.env 必须保存为 UTF-8 无 BOM 编码,Windows 记事本默认加 BOM,会导致 ThinkPHP 静默跳过整个文件;文件必须放在项目根目录(与 app/、config/、public/ 同级),不能放在 config/.env 或 public/.env 下。
同步更新配置文件中的 env() 调用
第一步:打开 config/database.php
找到 'connections' → 'mysql' 数组内所有字段,把硬编码值全部替换成 env() 调用,例如 'hostname' => '127.0.0.1' 改为 'hostname' => env('DB_HOST', '127.0.0.1')。
第二步:确认键名与.env完全一致
env() 第一个参数必须和 .env 中的变量名严格对应,DB_HOST 对应 env('DB_HOST'),不能写成 env('db_host') 或 env('DATABASE_HOST');大小写、下划线一个都不能错。
第三步:补全所有字段的默认值
env() 的第二个参数不可省略,尤其对 DB_PREFIX、DB_PASSWORD 这类可能为空的字段,用空字符串 '' 比 null 更安全,否则建表或查询时可能触发 Notice 错误。
清除缓存并验证生效
执行 php think clear:config 强制重建 runtime/config.php;这一步不做,改完 .env 和 config/database.php 也完全没反应——ThinkPHP 会一直读缓存里的旧配置。
验证是否真正生效:在任意控制器中写一行 dump(\think\facade\Config::get('database.hostname'));,输出值必须和 .env 中 DB_HOST 的值一致,且不是兜底的 '127.0.0.1'。



















