# 自動完成
> 該部分知識請參考thinkphp官方教程:http://www.hmoore.net/manual/thinkphp5/138668
在實際開發過程中,我們往往需要自動記錄一些時間節點。比如在這里,我們需要記錄每個用戶的創建時間。
> timestamp 時間戳的出現,用于解決日期比較、各時區時間不同等的時間問題,它是指相對于1970年1月1日0點0分0秒的秒數。
解決方法:我們可以在form表單中增加一個字段,或是在action中,手動寫一個字段。當然了,我們還可以使用時間戳的自動完成功能。
在thinkphp中,我們將創建時間字段規定為create_time,更新時間規定為update_time,雖然我們也可以自定義,但除非該字段與其它我們想定義的字段產生沖突,否則我們不會那樣做。
## 方法一:form表單
`文件路徑為:index/view/Teacher/add.html`
~~~
<label>郵箱:</label>
<input type="email" name="email" />
<input type="hidden" name="create_time" value="{:time()}" />
<button type="submit">保存</button>
~~~
~~~
<?php
namespace app\index\controller;
...
class TeacherController extends Controller
{
...
public function insert()
{
// 接收傳入數據
$postData = $this->request->post();
// 實例化Teacher空對象
$Teacher = new Teacher();
// 為對象賦值
$Teacher->name = $postData['name'];
$Teacher->username = $postData['username'];
$Teacher->sex = $postData['sex'];
$Teacher->email = $postData['email'];
$Teacher->create_time = $postData['create_time'];
// 新增對象至數據表
$Teacher->save();
// 反饋結果
return '新增成功。新增ID為:' . $Teacher->id;
}
...
}
~~~
> time()請參考: http://php.net/manual/zh/function.time.php
測試結果如下圖所示:
**注意:一定要先刷新新增頁面,新增信息后,點擊保存進行測試,因為后退并沒有改變HTML代碼。**




如果出了問題,那么我們需要從數據流上找問題。
1. form表單是否進行了正確的傳值?
2. insert action是否正確的接收到了值?
3. 傳入的字段,是否與數據表字段相對應?
## 方法二:控制器中action
我們首先將V層文件add.html中的form表單進行恢復,去除create_time字段<input type="hidden" name="create_time" value="{:time()}" />。
然后如下改寫C層:
~~~
...
namespace app\index\controller;
...
// 為對象賦值
$Teacher->name = $postData['name'];
$Teacher->username = $postData['username'];
$Teacher->sex = $postData['sex'];
$Teacher->email = $postData['email'];
$Teacher->create_time = time();
...
~~~
測試結果如下:
**再提示一遍,修改V層后,需要刷新當前頁面。**



## 方法三 使用自動時間戳
我們恢復C層,**去除** 剛剛加入的那行代碼`$Teacher->create_time = time();`。
然后application根目錄下的找到database.php,修改auto_timestamp項為true
~~~
// 是否自動寫入時間戳字段
'auto_timestamp' => true,
~~~
然后再測試,查看測試結果:
**重要的事情說三遍,先刷新!**




這樣做有什么好處呢?
其實很明顯了,我們現在只是處理一個form,一個insert。如果不使用自動加入時間戳的功能的話,我們每寫一個這樣的小功能,都需要加一行加入時間的代碼。而使用這個功能后,我們只需要配置好database.php就可以了。
~~~
git checkout -f step3.3.4
~~~
執行上述命令后,上述示例代碼信息如下:

- 序言
- 第一章 準備知識
- 第一節: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
- 第二節:查看日志
- 第十三章:總結