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

ThinkPHP 表單自動驗證完整指南:$_validate 陣列配置與進階規則

     編輯:PHP 綜合知識

核心機制

ThinkPHP Model 基類內建 $_validate 屬性,定義驗證規則陣列,表單提交時自動檢查,失敗回傳錯誤訊息。

驗證規則陣列結構

protected $_validate = array(
    // 格式: array(驗證字段, 驗證規則, 錯誤提示, 驗證條件, 附加規則, 驗證時間)
    array("title", "require", "標題必須!"),
    array('categoryId', 'require', "分類必須!"),
    array('content', 'require', "內容必須!"),
    array('verify', 'require', '驗證碼必須!'),
    array('verify', 'CheckVerify', '驗證碼錯誤!', 0, 'callback'),
);

六大參數詳細說明

參數名稱說明可選值/範例
1驗證字段表單欄位名,不一定是資料庫欄位title, email, password, confirm_password
2驗證規則內建規則名、正則、函數名、回調方法require, email, /regex/, checkFunc, callback
3錯誤提示驗證失敗顯示訊息"電子郵件格式錯誤"
4驗證條件何時觸發驗證0/EXISTS_VALIDATE(預設), 1/MUST_VALIDATE, 2/VALUE_VALIDATE
5附加規則規則類型修飾符regex, function, callback, confirm, equal, in, unique
6驗證時間新增/編輯/全部1/MODEL_INSERT, 2/MODEL_UPDATE, 3/MODEL_BOTH(預設)

內建驗證規則 (正則)

$validate = array(
    'require' => '/.+/',
    'email'   => '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/',
    'url'     => '/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@\[\]\':+!]*([^<>""])*$/',
    'currency'=> '/^\d+(\.\d+)?$/',
    'number'  => '/^\d+$/',
    'zip'     => '/^[1-9]\d{5}$/',
    'integer' => '/^[-\+]?\d+$/',
    'double'  => '/^[-\+]?\d+(\.\d+)?$/',
    'english' => '/^[A-Za-z]+$/',
);

附加規則實戰範例

protected $_validate = array(
    // 1. 正則驗證
    array('username', '/^[a-z]\w{5,15}$/i', '用戶名必須字母開頭,6-16 位', 0, 'regex'),
    
    // 2. 函數驗證 (自訂函數)
    array('password', 'checkPwdStrength', '密碼強度不足', 0, 'function'),
    
    // 3. 回調方法驗證 (Model 方法)
    array('verify', 'checkVerifyCode', '驗證碼錯誤', 0, 'callback'),
    
    // 4. 兩欄位一致 (確認密碼)
    array('repassword', 'password', '兩次密碼不一致', 0, 'confirm'),
    
    // 5. 等於特定值
    array('status', 1, '狀態必須為啟用', 0, 'equal'),
    
    // 6. 在範圍內
    array('type', array(1,2,3), '類型錯誤', 2, 'in'), // 條件 2: 值不為空時驗證
    
    // 7. 唯一性驗證 (資料庫查詢)
    array('email', '', '電子郵件已存在', 0, 'unique', 1), // 時間 1: 新增時
);

// 回調方法範例
protected function checkVerifyCode($code) {
    return md5($code) === session('verify');
}

// 函數驗證範例
function checkPwdStrength($pwd) {
    return strlen($pwd) >= 8 
        && preg_match('/[A-Z]/', $pwd)
        && preg_match('/[a-z]/', $pwd)
        && preg_match('/\d/', $pwd)
        && preg_match('/[\W_]/', $pwd);
}

官方完整範例解析

protected $_validate = array(
    array('verify','require','驗證碼必須!'),                           // 預設正則 require
    array('name','','帳號名稱已經存在!',0,'unique',1),              // 新增時檢查 name 唯一
    array('value',array(1,2,3),'值的範圍不正確!',2,'in'),           // 值不為空時檢查範圍
    array('repassword','password','確認密碼不正確',0,'confirm'),     // 確認密碼一致
    array('password','checkPwd','密碼格式不正確',0,'function')       // 自訂函數
);

控制器中觸發驗證

public function add() {
    $model = D('Article'); // 實例化 Model
    if ($model->create()) { // 自動執行 $_validate 驗證
        if ($model->add()) {
            $this->success('新增成功');
        } else {
            $this->error('寫入失敗');
        }
    } else {
        // 驗證失敗,$model->getError() 取得錯誤訊息
        $this->error($model->getError());
    }
}

進階技巧

  • 場景驗證:$model->create($_POST, 1) 第二參數指定場景 (1=新增, 2=編輯),配合驗證時間參數
  • 動態規則:在 _initialize() 中根據條件修改 $_validate
  • 多模型驗證:validate($rules)->create() 臨時覆蓋規則
  • AJAX 回傳 JSON:驗證失敗時 ajaxReturn(['status'=>0, 'msg'=>$model->getError()])
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved