首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP create() 方法與自動表單令牌驗證實戰教學

     編輯:PHP 綜合知識

ThinkPHP create() 方法是表單資料處理的核心,整合了資料物件建立、自動驗證、自動完成、令牌驗證等功能。掌握其用法能大幅簡化 Controller 代碼並提升安全性。

資料表結構

CREATE TABLE `user` (
    `id` INT AUTO_INCREMENT PRIMARY KEY,
    `username` VARCHAR(50) NOT NULL,
    `password` CHAR(32) NOT NULL
);

模板:create.html

Controller:UserAction.class.php

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)) { /* 令牌錯誤 */ }
    }
}
?>

create() 核心功能

功能說明
資料物件建立自動映射 $_POST 欄位到模型屬性,過濾非資料表欄位
自動驗證觸發 Model _validate 規則
自動完成觸發 Model _auto 規則 (時間戳、加密等)
令牌驗證開啟 TOKEN_ON 時自動驗證表單令牌
字段類型檢查根據資料表結構轉換資料型態

令牌驗證機制與配置

// Conf/config.php
'TOKEN_ON'      => true,        // 開啟令牌驗證
'TOKEN_NAME'    => 'token',     // 表單隱藏欄位名
'TOKEN_TYPE'    => 'md5',       // 雜湊演算法
'TOKEN_RESET'   => true,        // 驗證成功後重置令牌

運作流程

  1. 表單渲染時,框架生成隨機 Token 存入 Session,並插入隱藏欄位 <input type="hidden" name="token" value="...">。
  2. 用戶提交表單,create() 比對 Session 與表單 Token。
  3. 一致 → 通過驗證,可選重置 Token;不一致 → 驗證失敗,回傳錯誤。

模板控制令牌位置與啟用

  • {__TOKEN__}:指定隱藏欄位輸出位置。
  • {__NOTOKEN__}:當頁面有多個表單,僅需一個驗證時,在其他表單加入此標籤跳過驗證。

create() 進階用法

// 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 關閉驗證

data() vs create() 差異

方法驗證/完成/令牌用途
create()✅ 全部啟用標準表單處理
data()❌ 全部跳過手動構造資料、API 寫入、測試

核心原則:所有表單提交處理**優先使用 create()**,享受框架內建安全與便利機制。僅在完全掌控資料來源 (如內部 API、排程任務) 時使用 data()。

善用 create() 配合 Model _validate/_auto,能將 Controller 精簡為極薄的「接收→驗證→業務→回應」流程。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved