新手卡在数据库连接、模型查不到数据、表名不匹配三步,需依次配置database.php连接参数、按命名规则创建模型类并显式指定表名、控制器中正确实例化模型查询,再用db::connect()或db()函数验证连接。

刚接触ThinkPHP的新手常卡在数据库连不上、模型查不到数据、表名对不上这三步,不是配置文件写错字段,就是模型类没按命名规则建,更常见的是控制器里直接 new Model() 却忘了它默认走的是 config/database.php 里的 default 连接——而你可能刚改了 connections 里的 mysql 配置却没动 default 值。
第一步:配好 database.php 连接文件
打开项目根目录下的 config/database.php 文件(若不存在就新建),返回一个数组,必须包含 【'type' => 'mysql'】 这个键值对,漏掉它框架会回退到默认 mysql 驱动,但后续连接失败时错误提示极不明确,容易误判为账号密码错。
填入服务器地址、数据库名、用户名、密码四项核心参数,其中 database 对应的库必须已存在,且 PHP 进程有访问权限;hostname 写 127.0.0.1 比写 localhost 更稳定,尤其在 Docker 或某些 Linux 环境下 localhost 会走 socket 连接导致超时。
端口 hostport 默认是 3306,如果改过 MySQL 端口就必须显式写出;charset 强烈建议设为 utf8mb4,否则存 emoji 或四字中文会出乱码;prefix 表前缀可为空字符串,但一旦设了,后面所有模型操作都会自动拼上前缀。
第二步:创建对应数据表的模型类
在 app/model/ 目录下新建 PHP 文件,文件名用驼峰法,比如数据表叫 user_info,模型类名就叫 UserInfo;如果表名是 think_user 且配置了 prefix => 'think_',那模型类名就只需叫 User。
模型类必须继承 think\Model,顶部声明 protected $table = 'user_info'; 是最稳妥的做法——哪怕表名和类名能自动匹配,也建议显式指定,避免因前缀配置变动或表名含下划线时匹配失败。
这一步操作起来很简单,直接把文件拖进去就行,但模型类里不能漏掉 namespace,例如:namespace app\model;,否则控制器中 use app\model\UserInfo 会报找不到类。
第三步:控制器里调用模型查数据
在控制器方法中,先引入模型类:use app\model\UserInfo;
实例化模型并查询:$data = (new UserInfo())->select();,返回二维数组;想查单条就用 find(1),传主键值,返回一维数组。
注意:不要写 new Model(),那是基类,不绑定任何表;也不要写 UserInfo::select(),ThinkPHP 8 的静态调用需确保模型类已正确注册,新手阶段优先用 new 实例化方式。
如果查出来是空数组,先执行 dump(config('database.connections.mysql')); 确认配置是否真被加载——TP 是懒加载,配置写错也不会立刻报错,只有真正执行查询时才暴露问题。
第四步:快速验证连接是否生效
方法一:用 Db 查询器绕过模型直接测连接
在控制器里写:use think\facade\Db; → $res = Db::connect()->query('SELECT VERSION()'); → dump($res);。这行代码不依赖模型,只测数据库通不通,返回 MySQL 版本号就说明连接成功。
方法二:用助手函数 db() 快速查表
$users = db('user_info')->select();,前提是 config/database.php 里已设好 default 连接且表存在;这个函数每次调用都新建连接,适合临时调试,但别在循环里频繁用。
方法三:开启 DB_DEBUG 查 SQL 日志
在 database.php 里加一行:'debug' => true,,然后刷新页面看日志输出——如果连 SQL 都没打出来,说明根本没走到查询这步,问题出在路由或控制器语法上,而不是数据库配置。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











