# 连接数据库 我们说数据库,就像一个图书馆,数据库中的数据就像是图书馆中的图书。所以在数据为中获取某个数据与现实生活中去图书馆中借阅某本书的思想大同小异。 | 图书馆借阅图书 | 数据库查询数据 | | -------- | -------- | | 这个图书馆位于`哪所学校(哪个位置)` | 数据库系统安装在`哪个主机(哪个IP)`| | 图书位于`第几阅览室` | 我们要找哪个`数据库` | | 我们需要一个`借阅证`,该借阅证存储的认证信息能够走进图书馆 | 需要一个有效的`访问凭证` ---- 用户名及其密码 | |我们需要知道从哪个`门`进入图书馆(并不是每个图书馆开放的都是正门)| 从哪个`端口`连接数据库 | | 我们需要知道书位于哪个`书架`上 | 要操作哪个`数据表` | | 根据正确的`索引号`找到这本书 | 用正确的`语句`去找到我们想要的数据 | 具体到当前连接: | 图书馆借阅图书 | 数据库查询数据 | | -------- | -------- | | 河北工业大学图书馆(天津市北辰区西平道1430号)| localhost(127.0.0.1) | 科技图书阅览室 | tp6 | | 校一卡通 | 用户名:root 密码:空 | | 正门进入 | 3306 | | 计算机类图书TP316 | teacher | | 12.3YZ | select * from yunzhi_teacher | ## TP配置 ThinkPHP6的数据库配置文件位于tp6文件夹下的:`config\database.php` >[info] 以后在给出文件相关位置时,无特殊说明的情况下,均指相对于tp6文件。 我们分别找到第26行、36行以及38行,将其修改为: ```php // 数据库名 'database' => env('database.database', ''), ✘ 'database' => env('database.database', 'tp6'), ✚ // 数据库编码默认采用utf8 'charset' => env('database.charset', 'utf8mb4'), ✘ 'charset' => env('database.charset', 'utf8'), ✚ // 数据库表前缀 'prefix' => env('database.prefix', ''), ✘ 'prefix' => env('database.prefix', 'yunzhi_'), ✚ ``` ✘ 代表将原代码删除 ✚ 代表在此位置增加新代码 数据库配置大多与我们在XMAPP中的mysql是一致的,所以并不需要经过大多的修改。 `tp6`与我们在前面设置的数据表名相对应;在前面的章节中,我们将数据库的编码设置为`utf8mb4`,相对于`utf8`该编码支持了更多的字符,比如可以在该编码下存储一些表情符号;而数据库表前缀使我们可以在一个数据库中跑多个类似于TP的应用,比如我们在同一个数据库中安装了两个学生管理系统,每个学生管理系统中都需要有student学生表,为了避免冲突,我们可以分别在两个学生管理系统设置数据表前缀为a_和b_,那么此时a学生管理系统将使用所有以a_打头的数据表,b学生管理系统将使用所有以b_打头的数据表。这适用于某些虚拟主机的提供商仅提供一个数据库供我们使用的情况。 修改后的database.php文件如下: ```php <?php return [ // 默认使用的数据库连接配置 'default' => env('database.driver', 'mysql'), // 自定义时间查询规则 'time_query_rule' => [], // 自动写入时间戳字段 // true为自动识别类型 false关闭 // 字符串则明确指定时间字段类型 支持 int timestamp datetime date 'auto_timestamp' => true, // 时间字段取出后的默认时间格式 'datetime_format' => 'Y-m-d H:i:s', // 数据库连接配置信息 'connections' => [ 'mysql' => [ // 数据库类型 'type' => env('database.type', 'mysql'), // 服务器地址 'hostname' => env('database.hostname', '127.0.0.1'), // 数据库名 'database' => env('database.database', 'tp6'), // 用户名 'username' => env('database.username', 'root'), // 密码 'password' => env('database.password', ''), // 端口 'hostport' => env('database.hostport', '3306'), // 数据库连接参数 'params' => [], // 数据库编码默认采用utf8 'charset' => env('database.charset', 'utf8mb4'), // 数据库表前缀 'prefix' => env('database.prefix', 'yunzhi_'), // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器) 'deploy' => 0, // 数据库读写是否分离 主从式有效 'rw_separate' => false, // 读写分离后 主服务器数量 'master_num' => 1, // 指定从服务器序号 'slave_no' => '', // 是否严格检查字段是否存在 'fields_strict' => true, // 是否需要断线重连 'break_reconnect' => false, // 监听SQL 'trigger_sql' => env('app_debug', true), // 开启字段缓存 'fields_cache' => false, ], // 更多的数据库配置信息 ], ]; ``` >[info] 在配置文件中,hostname可以是127.0.0.1,也可以是localhost。这个问题前面讲过了,IP地址和域名的问题,都代表:本机。 ## 测试 应该是出于对安全的考虑,当发生错误时,ThinkPHP默认关闭了具体的报错信息。而在开发中却恰恰相反:我们需要这个具体的报错信息。 打开`config/app.php`,对31行进行如下修改: ```php // 显示错误信息 'show_error_msg' => false, ✘ 'show_error_msg' => true, ✚ ``` 然后打开`app/controller/Index.php`,使用以下内容替换原文件内容: >[warning] 复制过去就好,不要挑战自己的拼写能力。 ```php <?php namespace app\controller; use app\BaseController; class Index extends BaseController { public function index() { // think镇facade村的Db提供了一个query方法,调用该方法可以进行数据查询 // 使用select * from yunzhi_teacher查询数据库 $teachers = \think\facade\Db::query('select * from yunzhi_teacher'); // 调用tp提供的dump方法,友好的输出查询结果 dump($teachers); } public function hello($name = 'ThinkPHP6') { return 'hello,' . $name; } } ``` ![](https://img.kancloud.cn/3b/fe/3bfecfd9bb2cbdb0c3a5776214676ee9_375x402.png) 启动apache、mysql服务后访问:`http://localhost/tp6/public/index.php`,成功访问说明数据库基本信息(除**数据库表前缀**以外)配置成功。 >[info] 数据库表前缀是否生效需要借助`模型`来测试,我们将在后台的章节中讲解如何使用模型来操作数据表。 至此,知识盲点一:`tp框架如何连接数据库`成功解决。 # 相关资源 | 内容 | 地址 | | ----------- | ----------- | | 连接数据库 | [https://www.kancloud.cn/manual/thinkphp6_0/1037531](https://www.kancloud.cn/manual/thinkphp6_0/1037531)| | 本节源码 | [https://github.com/mengyunzhi/tp6/archive/step2.2.2.zip](https://github.com/mengyunzhi/tp6/archive/step2.2.2.zip) |