# 插入數據
確切的說,我們在這里將展示如何將一個數組插入到數據表中。
假設將下面這樣一條數據,插入到數據表中。
~~~
$teacher = array();
$teacher['name'] = '王五';
$teacher['username'] = 'wangwu';
$teacher['sex'] = '1';
$teacher['email'] = 'wangwu@yunzhi.club';
~~~
## 新建action (function)
是的,我們通常將controller中的function,叫做action、觸發器,以后我們都將這樣叫下去。如果我們說觸發器,那么它肯定是某個模塊下的某個控制器中的一個方法。如下所示:
~~~
public function insert()
{
return 'hello insert';
}
~~~
測試結果如下圖所示:

如圖,我們新建了一個insert觸發器,用來實現數據添加的功能。
~~~
git checkout -f step3.3.1.1
~~~
執行上述命令后,上述示例代碼信息如下:

> 再次強調:測試很關鍵,每一步都需要非常的清晰的明了現在是哪個URL,這個URL又將觸發哪個類中的哪個方法。同時,必須要測試出,是否我們認為的這個URL,就是觸發的我們認為的那個方法,而最終的驗證環節,就是我們的測試。
## 整理思路
~~~
public function insert()
{
// 新建測試數據
// 引用teacher數據表對應的模型
// 向teacher表中插入數據并判斷是否插入成功
}
~~~
在完成一個功能之前,或是我們在編碼之前,做的事情,先是要寫注釋,把整個流程以注釋的形式非常清楚的擺在眼前,然后再進行編碼。
## 新建測試數據
~~~
public function insert()
{
// 新建測試數據
$teacher = array(); // 這種寫法也可以 $teacher = [];
$teacher['name'] = '王五';
$teacher['username'] = 'wangwu';
$teacher['sex'] = '1';
$teacher['email'] = 'wangwu@yunzhi.club';
var_dump($teacher);
// 引用teacher數據表對應的模型
// 向teacher表中插入數據并判斷是否插入成功
}
~~~
測試結果如下圖所示:

~~~
git checkout -f step3.3.1.2
~~~
執行上述命令后,上述示例代碼信息如下:

## 引入teacher表對應的模型
由于我們已經use過Teacher模型,所以這次可以直接進行使用。
~~~
public function insert()
{
// 新建測試數據
$teacher = array(); // 這種寫法也可以 $teacher = [];
$teacher['name'] = '王五';
$teacher['username'] = 'wangwu';
$teacher['sex'] = '1';
$teacher['email'] = 'wangwu@yunzhi.club';
var_dump($teacher);
// 引用teacher數據表對應的模型
$Teacher = new Teacher();
var_dump($Teacher);
// 向teacher表中插入數據并判斷是否插入成功
}
~~~
測試結果如下圖所示:

## 插入數據
~~~
public function insert()
{
// 新建測試數據
$teacher = array(); // 這種寫法也可以 $teacher = [];
$teacher['name'] = '王五';
$teacher['username'] = 'wangwu';
$teacher['sex'] = '1';
$teacher['email'] = 'wangwu@yunzhi.club';
// 引用teacher數據表對應的模型
$Teacher = new Teacher();
// 向teacher表中插入數據并判斷是否插入成功
$state = $Teacher->data($teacher)->save();
var_dump($state);
}
~~~
測試結果如下圖所示:

我們看到返回的是一個數字 1,是的,如果插入成功,則會返回成功插入的條數。
在開發模式下,我們認為,只要未拋出異常,那么就是插入成功。
~~~
git checkout -f step3.3.1.3
~~~
執行上述命令后,上述示例代碼信息如下:

### 測試錯誤
有正確的添加數據,就必然有錯誤的添加數據。當錯誤添加數據時,會報什么錯誤呢?
現在我們將email更改為email1:
~~~
$teacher['email1'] = 'wangwu@yunzhi.club';
~~~
執行結果如下圖所示:

是的,當我們看到上面的錯誤時,大多是在代碼中輸入了數據字段名,由這個字段名在實際的數據表中并不存在。所以以后再看到類似錯誤時,一下就能知道問題出現在哪了吧。
## 去除測試代碼,并定制提示信息
最終的軟件,當然是給用戶使用的。這就要求我們需要站在用戶的角度上去思索,用戶到底需要什么樣的軟件,需要什么樣的交互。
在這里,用戶并不關心變量的值是什么,他們只關心用戶是否被直接添加了。
代碼定制如下:
~~~
public function insert()
{
// 新建測試數據
$teacher = array(); // 這種寫法也可以 $teacher = [];
$teacher['name'] = '王五';
$teacher['username'] = 'wangwu';
$teacher['sex'] = '1';
$teacher['email'] = 'wangwu@yunzhi.club';
// 引用teacher數據表對應的模型
$Teacher = new Teacher();
// 向teacher表中插入數據并判斷是否插入成功
$Teacher->data($teacher)->save();
return $teacher['name'] . '成功增加至數據表中';
}
~~~
測試結果如下圖所示:

~~~
git checkout -f step3.3.1.4
~~~
執行上述命令后,上述示例代碼信息如下:

## 面向對象
**一切皆對象** ---- 插入(新增)數據時也同樣如此。下面,我們使用面象對象的思想,重寫數據的插入操作。
~~~
public function insert()
{
// 實例化Teacher空對象
$Teacher = new Teacher();
// 為對象的屬性賦值
$Teacher->name = '王五';
$Teacher->username = 'wangwu';
$Teacher->sex = '1';
$Teacher->email = 'wangwu@yunzhi.club';
// 執行對象的插入數據操作
var_dump($Teacher->save());
return $Teacher->name . '成功增加至數據表中。新增ID為:' . $Teacher->id;
}
~~~
測試結果為:

> 沒錯,面象對象簡單來講,就是:先實例化一個對象,然后在這個對象上進行操作。
相信聰明的你還可以輕松的想到,數據的刪除、更新也是如此。先有對象,后有操作。
去除測試信息:
~~~
public function insert()
{
// 實例化Teacher空對象
$Teacher = new Teacher();
// 為對象的屬性賦值
$Teacher->name = '王五';
$Teacher->username = 'wangwu';
$Teacher->sex = '1';
$Teacher->email = 'wangwu@yunzhi.club';
// 執行對象的插入數據操作
$Teacher->save();
return $Teacher->name . '成功增加至數據表中。新增ID為:' . $Teacher->id;
}
~~~
~~~
git checkout -f step3.3.1.5
~~~
執行上述命令后,上述示例代碼信息如下:

- 序言
- 第一章 準備知識
- 第一節:XAMPP
- 第二節:NAVICAT
- 第三節:GIT
- 第二章 HelloWorld
- 第一節:下載THINPHP5.0
- 第二節:啟動xampp
- 第三節:hello thinkphp
- 第四節:Hello world
- 第五節:MCA
- 第六節:單引號與雙引號
- 第三章 教師管理
- 第一節:新建數據庫
- 第二節:CURD之R 讀數據
- 3.2.1 時序圖
- 3.2.2 連接數據庫
- 3.2.3 直接讀取數據
- 3.2.4 間接讀取數據
- 3.2.5 使用V層顯示數據
- 3.2.6 引入bootstrap
- 3.2.7 加入bootstrap樣式
- 第三節:CURD之 C 增加數據
- 3.3.1 插入數據
- 3.3.2 表單傳值
- 3.3.3 存儲表單數據
- 3.3.4 自動時間戳
- 3.3.5 增加驗證
- 第四節:CURD之 D 刪除數據
- 3.4.1 什么是關鍵字
- 3.4.2 刪除數據
- 3.4.3 定制刪除鏈接
- 3.4.4 完善刪除
- 第五節:CURD之 U 更新數據
- 3.5.1 讀取數據
- 3.5.2 展示數據
- 3.5.3 修改數據
- 3.5.4 傳遞數據
- 3.5.5 接收數據
- 3.5.6 更新數據 方法一
- 3.5.7 更新數據 方法二
- 第六節:銜接各個action & 重構代碼
- 3.6.1 index action
- 3.6.2 add action
- 3.6.3 insert action
- 3.6.4 delete action
- 3.6.5 edit action
- 3.6.6 update action
- 第七節:分頁
- 3.7.1 調用內置分頁
- 3.7.2 select與paginate(選學)
- 3.7.3 分頁原理(選學)
- 3.7.4 調用page(選學)
- 第八節:模糊查詢
- 3.8.1 增加查詢
- 3.8.2 完善查詢
- 第四章 登錄與注銷
- 第一節:cookie 與 session
- 第二節:靜態方法
- 第三節:規劃URL跳轉
- 第四節:登錄
- 4.4.1 登錄流程
- 4.4.2 index action
- 4.4.3 login action
- 4.4.4 引入M層
- 4.4.5 異常Exception
- 第五節:注銷
- 第六節:驗證
- 4.6.1 action增加驗證
- 4.6.2 使用構造函數驗證
- 4.6.3 使用繼承驗證
- 第五章 E-R圖與數據字典
- 第一節:第一張E-R圖
- 第二節:實體間的關系
- 第三節:開發規范
- 第六章 班級管理
- 第一節:建立數據表
- 第二節:數據列表index
- 第三節:增加數據add
- 第四節:編輯數據edit
- 第五節:刪除數據delete
- 第七章 學生管理
- 第一節:建立數據表
- 第二節:數據列表
- 7.2.1 顯示性別
- 7.2.2 顯示創建時間
- 7.2.3 顯示班級名稱
- 7.2.4 顯示輔導員姓名
- 第三節:編輯數據
- 第四節:魔法函數
- 第五節:源碼分析
- 第八章 課程管理
- 第一節:建立數據表
- 第二節:新增課程
- 第三節:編輯課程
- 8.3.1 edit
- 8.3.2 update
- 第九章 代碼重構
- 第一節:add 與 edit
- 第二節:insert 與 update
- 第三節:模板繼承
- 9.3.1 index.html
- 9.3.2 edit.html
- 9.3.3 小結
- 第十章 UML圖
- 第一節:E-R圖回顧
- 第二節:UML圖
- 第十一章 菜單與路由
- 第一節:添加菜單
- 第二節:虛擬主機
- 第三節:定制路由
- 第十二章 開發調試
- 第一節:開啟trace
- 第二節:查看日志
- 第十三章:總結