thinkphp 8 数据库连接以 .env 为唯一运行时配置源,database.php 仅作结构定义和兜底;.env 全量覆盖 connections 配置,必须用 env() 函数读取变量,且变量名须大写下划线、值需 url 编码特殊字符,多库需在 database.php 显式定义多个连接名并代码中调用 db::connect() 切换。

ThinkPHP 8 数据库连接必须用 .env 配置,config/database.php 只能做兜底和结构定义——不是“选一个”,而是“.env 覆盖全部,database.php 不参与运行时决策”。
为什么改了 config/database.php 里的 hostname 没用
因为 ThinkPHP 8 启用 .env 后,整个 connections.mysql 配置块会被完全替换,哪怕你只在 .env 里写了 DB_NAME 一个变量。框架不会“合并字段”,而是直接丢弃 database.php 中对应连接的原始值。
-
database.php里必须全部用env('DB_HOST', '127.0.0.1')这种写法,不能留死值(比如'hostname' => '127.0.0.1') -
.env文件名必须是纯.env,不能是.env.example或带 BOM 的 UTF-8 - 变量名必须严格大写+下划线:
DB_PASS有效,DB_PASSWORD或db_pass全部无效 - 修改
.env后不重启服务也不清缓存,runtime/cache/下的配置缓存仍用旧值
.env 里密码含 @、/、: 会连不上
MySQL 连接字符串底层走的是 PDO DSN 构造,这些字符会破坏 URL 解析。例如 pa@ss/word 会被截成主机 pa、密码 ss/word,直接报 Connection refused。
- 必须手动 URL 编码:
pa@ss/word→pa%40ss%2Fword - 编码工具可用 PHP 的
rawurlencode(),或在线 raw URL encode 工具 - 别依赖 Navicat 自动转义——它连得上不代表 TP8 能解析,TP8 是纯字符串拼接 DSN
- 端口不写默认 3306,但显式写
DB_PORT=3307时,.env和my.ini必须一致
多数据库怎么配才不冲突
想同时连两个 MySQL 库,不能靠改 .env 动态切换,因为 .env 是全局生效的。必须在 config/database.php 里定义多个连接名,并在代码中显式调用 Db::connect('mysql2')。
-
.env里加第二组变量:如DB2_HOST=127.0.0.1、DB2_NAME=test2 -
database.php的connections数组里补全mysql2配置项,每个字段都用env('DB2_XXX') - 连接时不能写
Db::name('user')->connect('mysql2'),必须先获取 Query 实例:$db2 = Db::connect('mysql2'); $db2->name('user')->select(); - 别在
.env里写数组或嵌套结构(如DB_SLAVE=[...]),.env只支持扁平键值对
最常被忽略的一点:phpEnv 里显示 MySQL “已启动”,不代表端口通。netstat -ano | findstr :3306 看不到 LISTENING,或者 PID 对不上 mysqld.exe,那 .env 写得再对也白搭——连接前务必手动用 127.0.0.1 + 端口 + 用户密码直连一次验证。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











