ThinkPHP create() 方法是表單資料處理的核心,整合了資料物件建立、自動驗證、自動完成、令牌驗證等功能。掌握其用法能大幅簡化 Controller 代碼並提升安全性。
CREATE TABLE `user` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR(50) NOT NULL,
`password` CHAR(32) NOT NULL
);
display();
}
public function addit() {
$user = M('user');
// 1. 根據 $_POST 自動建立資料物件 (含驗證、完成、令牌)
if ($user->create()) {
// 2. 寫入資料庫
if ($user->add()) {
$this->success('新增成功');
} else {
$this->error('新增失敗');
}
} else {
// 驗證失敗、令牌失效等錯誤
$this->error($user->getError());
}
/* 手動驗證令牌 (未用 create() 時) */
// if (!$user->autoCheckToken($_POST)) { /* 令牌錯誤 */ }
}
}
?>
| 功能 | 說明 |
|---|---|
| 資料物件建立 | 自動映射 $_POST 欄位到模型屬性,過濾非資料表欄位 |
| 自動驗證 | 觸發 Model _validate 規則 |
| 自動完成 | 觸發 Model _auto 規則 (時間戳、加密等) |
| 令牌驗證 | 開啟 TOKEN_ON 時自動驗證表單令牌 |
| 字段類型檢查 | 根據資料表結構轉換資料型態 |
// Conf/config.php 'TOKEN_ON' => true, // 開啟令牌驗證 'TOKEN_NAME' => 'token', // 表單隱藏欄位名 'TOKEN_TYPE' => 'md5', // 雜湊演算法 'TOKEN_RESET' => true, // 驗證成功後重置令牌
<input type="hidden" name="token" value="...">。create() 比對 Session 與表單 Token。{__TOKEN__}:指定隱藏欄位輸出位置。{__NOTOKEN__}:當頁面有多個表單,僅需一個驗證時,在其他表單加入此標籤跳過驗證。// 1. 從陣列建立
$data = ['name' => 'ThinkPHP', 'email' => 'tp@example.com'];
$user->create($data);
// 2. 從另一資料物件建立 (跨表複製)
$user = M('user');
$user->find(1);
$member = M('member');
$member->create($user); // 將 user 物件屬性複製到 member
// 3. 僅建立物件不驗證 (需謹慎)
$user->create($_POST, '', false); // 第三參數 false 關閉驗證
| 方法 | 驗證/完成/令牌 | 用途 |
|---|---|---|
create() | ✅ 全部啟用 | 標準表單處理 |
data() | ❌ 全部跳過 | 手動構造資料、API 寫入、測試 |
核心原則:所有表單提交處理**優先使用 create()**,享受框架內建安全與便利機制。僅在完全掌控資料來源 (如內部 API、排程任務) 時使用
data()。
善用 create() 配合 Model _validate/_auto,能將 Controller 精簡為極薄的「接收→驗證→業務→回應」流程。