thinkphp5数据库连接需严格匹配配置位置与方式:必须将database.php置于application/或模块目录下并返回数组;type、hostname、database、username、password四字段缺一不可;db::connect()参数须为配置键名或完整数组,dsn方式不支持prefix等关键参数。

ThinkPHP5 连接数据库不是“配完就能用”,关键看连接方式是否匹配当前使用场景,以及配置项有没有漏写或写错位置。
database.php 配置文件怎么写才生效
必须放在 application/database.php(或模块级 application/admin/database.php),返回一个数组;只改 config.php 里的数据库字段是无效的。
-
type必须显式声明,比如'type' => 'mysql',不能省略 —— 漏写会导致框架用 MySQL 驱动去解析 PostgreSQL 配置,报Class 'PDO' not found -
hostname、database、username、password四个基础字段缺一不可,空字符串也会导致连接失败 -
params中若启用长连接,要加PDO::ATTR_PERSISTENT => true,但注意 PHP-FPM 下可能引发连接复用问题 - 如果项目启用了调试模式,
debug => true能在日志里看到完整 SQL 和连接耗时,建议开发期打开
Db::connect() 传参传什么、不传什么
传错参数是 ThinkPHP5 数据库连接失败最常见原因,Db::connect() 的参数不是数据库名,也不是模型名,而是配置键名或完整配置数组。
- 传字符串:必须是
database.php里定义的键名,如Db::connect('mysql_read')—— 键名只能小写+下划线,'mysql.read'或'MysqlRead'全部报Connection not found: xxx - 传数组:直接传配置,绕过
database.php,适合临时切换或调试,例如Db::connect(['type'=>'sqlite','database'=>'/tmp/test.db']) - 绝对不要传:
Db::connect('User')、Db::connect('app_main')、Db::connect('default')(除非你真在配置里写了叫default的键) - 它返回的是全新
Query实例,不影响全局默认连接;每次要用,都得重新调用一次
模型类里 $connection 属性为什么没生效
protected $connection = 'mysql_read'; 只在模型第一次实例化时读取一次,后续改配置、重载 config 文件,这个值不会刷新 —— 它不是动态绑定,而是静态快照。
- 适用于固定归属某库的模型,比如日志表永远走
log_db,但不适合运行时按条件切换连接 - 如果想让模型支持多库动态路由,得在查询前手动调用
Db::connect($connKey)再链式操作,不能依赖$connection - 注意:该属性只对继承
\think\Model的类有效;原生Db类操作不受影响
DSN 字符串方式有哪些限制
用 Db::connect('mysql://root:pass@127.0.0.1:3306/mydb#utf8') 最简捷,但很多关键参数无法通过 DSN 表达。
- 不支持设置
prefix(表前缀)、params(PDO 参数)、resultset_type等字段 - 编码只能写在
#utf8后缀,不能写成?charset=utf8,否则解析失败 - 密码含特殊字符(如
@、/)必须 URL 编码,否则 DSN 解析会截断 - 生产环境慎用 DSN 方式,因为敏感信息明文暴露在代码中,容易被误提交到 Git
真正麻烦的从来不是“怎么连上”,而是连上之后连接没复用、主从没分离、读写没隔离 —— 这些细节都在 type、rw_separate、write_master 这几个字段里藏着,漏一个就可能把读请求打到主库上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











