# 連接數據庫
我們說數據庫,就像一個圖書館,數據庫中的數據就像是圖書館中的圖書。所以在數據為中獲取某個數據與現實生活中去圖書館中借閱某本書的思想大同小異。
| 圖書館借閱圖書 | 數據庫查詢數據 |
| -------- | -------- |
| 這個圖書館位于`哪所學校(哪個位置)` | 數據庫系統安裝在`哪個主機(哪個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;
}
}
```

啟動apache、mysql服務后訪問:`http://localhost/tp6/public/index.php`,成功訪問說明數據庫基本信息(除**數據庫表前綴**以外)配置成功。
>[info] 數據庫表前綴是否生效需要借助`模型`來測試,我們將在后臺的章節中講解如何使用模型來操作數據表。
至此,知識盲點一:`tp框架如何連接數據庫`成功解決。
# 相關資源
| 內容 | 地址 |
| ----------- | ----------- |
| 連接數據庫 | [http://www.hmoore.net/manual/thinkphp6_0/1037531](http://www.hmoore.net/manual/thinkphp6_0/1037531)|
| 本節源碼 | [https://github.com/mengyunzhi/tp6/archive/step2.2.2.zip](https://github.com/mengyunzhi/tp6/archive/step2.2.2.zip) |
- 序言
- 第一章 Hello World
- 1.1 運行環境
- 1.1.1 windows
- 1.1.2 macos
- 1.1.3 ubuntu
- 1.2 Hello ThinkPHP
- 1.2.1 windows
- 1.2.2 macos
- 1.2.3 ubuntu
- 2.3 Hello World
- 第二章 教師管理
- 2.1 數據庫初始化
- 2.2 CRUD之 R 讀取數據
- 1 數據流
- 2.2.2 連接數據庫
- 2.2.3 直接讀取數據之DB
- 2.2.4 間接讀取數據之模型
- 2.2.5 顯示數據之原始文案
- 2.2.6 單引號與雙引號
- 2.2.7 顯示數據之視圖
- 2.2.8 模板語法
- 2.2.9 使用bootstrap美化界面
- 2.3 CRUD之 C 增加數據
- 2.3.1 MCA默認路由