优先修改config/database.php最稳妥,.env仅在启用环境配置且键名格式正确(如db_type、db_host等)、密码url编码、app_env=local生效时才被读取,改后须执行php think clear清缓存。

直接改 config/database.php 最稳,别一上来就碰 .env —— 新手 90% 的连不上,都是因为改了 .env 却没开环境加载,或改了 database.php 却忘了清缓存。
配置文件到底该动哪个:优先 config/database.php,慎用 .env
ThinkPHP 6 默认从 config/database.php 读配置;只有当项目启用了环境配置(即 APP_ENV 已设且 think\facade\Config::loadEnv() 被调用),才会用 .env 里的 DB_HOST、DB_NAME 等覆盖它。但问题在于:
-
.env中的键名必须是 ThinkPHP 6 认的格式:DB_TYPE、DB_HOST、DB_NAME、DB_USER、DB_PWD(不是DB_PASSWORD) - 密码含
@、/、:等字符时,必须 URL 编码,比如pa@ss/word得写成pa%40ss%2Fword - 本地开发时
DB_HOST写127.0.0.1,别写localhost(MySQL 会走 socket,容易报Connection refused) - 改完
.env后,要确认APP_ENV=local已生效,否则框架压根不读它
"No database selected" 错误怎么快速定位
这不是连不上 MySQL,而是连接成功后没指定库名 —— 常见于 'database' => ''、拼错、或 MySQL 里根本没创建这个库。验证步骤很直接:
- 用命令行登录 MySQL:
mysql -uroot -p,然后执行SHOW DATABASES;,确认目标库名**完全一致**(Linux 下区分大小写) - 检查
config/database.php里'database'的值是否和上一步看到的一模一样,不能多空格、不能带中文、不能有不可见字符 - 如果用 Docker,进容器执行:
docker exec -it mysql mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS your_db_name CHARACTER SET utf8mb4;" - 改完配置必须运行:
php think clear,否则 TP 仍用旧缓存里的连接信息
MySQL 8 连接失败:认证插件不兼容
报错 Client does not support authentication protocol 是 MySQL 8 默认用 caching_sha2_password,而 ThinkPHP 6.0.x 自带 PDO 驱动只认 mysql_native_password。解决方法只有一个:
- 进 MySQL 执行:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';(把%换成实际 host,如'127.0.0.1') - 或者重置用户:
CREATE USER 'tp_user'@'%' IDENTIFIED WITH mysql_native_password BY 'xxx'; GRANT ALL ON your_db.* TO 'tp_user'@'%'; - 别指望靠 PHP 层加参数绕过 —— PDO 驱动层面不支持,改了也白改
多库连接时 Db::connect() 怎么传参才不报错
传错参数是多库场景下最常踩的坑。记住三件事:
- 键名只能是小写字母 + 下划线,比如
'mysql_read',不能是'mysql.read'或'MysqlRead' - 每个连接配置里必须显式写
'type' => 'mysql',漏了就会静默失败或报Class 'PDO' not found -
Db::connect()的参数是配置键名,不是数据库名、不是模型名、也不是'default'(除非你真在connections数组里定义了叫default的键) - 临时调试可用数组方式:
Db::connect(['type'=>'mysql','hostname'=>'127.0.0.1','database'=>'test']),但它绕过容器,事务和事件监听可能失效
配置项看着多,真正不能动的就几个:type、hostname、database、username、password。其他像 params、charset、deploy,不动比乱动安全;尤其 params 里若覆盖了 PDO::ATTR_EMULATE_PREPARES => false,LIKE 查询就可能出错。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











