ThinkPHP--自动验证
一、驗證規則
1、驗證規則
數據驗證可以對表單中的字段進行非法驗證操作。一般提供了兩種驗證方式:靜態定義($_validate屬性)和動態驗證(validate()方法)。
//驗證規則 array{array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),...... }PS:驗證字段、驗證規則和錯誤提示這三項是必選的,大多數也是用這三項;而驗證條件、附加規則和驗證時間是可選的。
驗證字段:一般來說是表單的字段名,不一定必須和數據表匹配,因為有一些比如密碼確認等輔助字段的存在。
驗證規則:系統內置了常用的規則,require(字段必填)、email(郵箱格式)、url(url格式)、currency(貨幣)、number(正整數)、integer(整數)、double(浮點數)、zip(郵政編碼)、english(英文)。這些規則都默認采用的附加規則是regex,正則表達式驗證,只不過是設定好的。
錯誤提示:驗證失敗后的提示。
驗證條件:共三種:
1)self::EXISTS_VALIDATE或0,表示存在字段就驗證(默認)(就是數據提交過來了才進行驗證); 2)self::MUST_VALIDATE或1,表示必須驗證(不論有沒有字段都需要驗證); 3)self::VALUE_VALIDATE或2,表示值不為空的時候驗證(就比如郵箱,可填可不填的情況下,填了就驗證合法性,沒填就直接略過)。附加規則:配合驗證規則使用,包括以下規則:
| regex | 正則驗證,定義的驗證規則是一個正則表達式(默認) |
| function | 函數驗證,定義的驗證規則是一個函數名 |
| callback | 方法驗證,定義的驗證規則是當前模型類的一個方法 |
| confirm | 驗證表單中的兩個字段是否相同,定義的驗證規則是一個字段名 |
| equal | 驗證是否等于某個值,該值由前面的驗證規則定義 |
| notequal | 驗證是否不等于某個值,該值由前面的驗證規則定義(3.1.2版本新增) |
| in | 驗證是否在某個范圍內,定義的驗證規則可以是一個數組或者逗號分割的字符串 |
| notin | 驗證是否不在某個范圍內,定義的驗證規則可以是一個數組或者逗號分割的字符串 |
| length | 驗證長度,定義的驗證規則可以是一個數字(表示固定長度)或者數字范圍(例如3,12表示長度從3到12的范圍) |
| between | 驗證范圍,定義的驗證規則表示范圍,可以使用字符串或者數組,例如1,31或者array(1,31) |
| notbetween | 驗證不在某個范圍,定義的驗證規則表示范圍,可以使用字符串或者數組 |
| expire | 驗證是否在有效期,定義的驗證規則表示時間范圍,可以到時間,例如可用2018-1-15,2019-1-15表示當前提交有效期在2018-1-15到2019-1-15之間,也可以使用時間戳定義 |
| ip_allow | 驗證IP是否允許,定義的驗證規則表示允許的IP地址列表,用逗號分隔,例如201.12.2.5,201.12.2.6 |
| ip_deny | 驗證IP是否禁止,定義的驗證規則表示禁止的IP地址列表,可用逗號分隔,如192.168.1.1,192.168.1.100 |
| unique | 驗證是否唯一,系統會根據字段目前的值查詢數據庫來判斷是否存在相同的值;當表單數據中包含主鍵字段時unique不可用于判斷主鍵字段本身 |
驗證時間:主要新增修改等驗證。
1)self::MODEL_INSERT或1表示新增數據時驗證; 2)self::MODEL_UPDATE或2表示標記數據時驗證; 3)self::MODEL_BOTH或3表示全部情況下驗證(默認)。2、靜態定義
在模型類里預先定義好該模型的自動驗證規則,就是靜態定義。
//模型類定義驗證規則 <?php namespace Home\Model; Use Think\Model;class UserModel extends Model{protected $_validate = array(//分別對應上面的部分,user為字段,require為驗證規則,然后是錯誤提示,驗證條件,附加規則,驗證時間array('user','require','用戶名不得為空',0,'regex',3),array(),); } ?>為了測試方便,我們直接通過模擬提交POST。
//控制器create()方法自動調用驗證 $user = D('User'); $data['user'] = '某某人'; $data['pass'] = '123'; if($user->create($data)){echo '所有數據驗證成功'; }else{//輸出錯誤信息var_dump($user->getError()); }TP框架提供了9種自動驗證內置方案,具體如下:
//內置驗證require,非空檢測 array('user','require','用戶名不得為空'); //內置驗證email,郵箱格式合法性檢測 array('user','email','郵箱格式不合法'); //內置驗證URL,網址合法性檢測 array('user','url','URL路徑不合法'); //內置驗證currency,貨幣格式檢測 array('user','currency','貨幣格式不正確'); //內置zip,郵編格式檢測 array('user','zip','郵政編碼格式不正確'); //內置驗證number,正整數檢測 array('user','number','非正整數'); //內置驗證integer,整數驗證,正負均可 array('user','integer','整數格式不正確'); //內置驗證double,驗證是否為浮點數 array('user','double','必須是浮點數'); //內置驗證english,純英文檢測 array('user','english','不是純英文');TP框架還提供了附加規則,來提示自動驗證的擴展性:
//附加規則regex,驗證3-6位純數字 array('user','/^d{3,6}$/','不是3-6位純數字','0','regex'); //附加規則equal,驗證是否和指定值相等 array('user','某某某','值不對等','0','equal'); //附加規則notequal,驗證是否與指定值不等 array('user','某某某','值不能對等','0','notequal'); //附加規則confirm,驗證兩條字段是否相同 //也可用于密碼和重復密碼驗證 array('user','name','兩個用戶名對比不同','0','confirm'); //附加規則in,某個范圍,可以是數組或逗號分隔的字符串 //與之對應的是notin array('user',array(1,2,3),'不在指定范圍','0','in'); array('user','張三,李四,王五','不在指定范圍','0','in'); //附加規則length,驗證長度或數字范圍 array('user','3','不得小于3位','0','length'); array('user','3,5','不得小于3位,不得大于5位','0','length'); //附加規則between,驗證某個范圍,數字或逗號字符串 //與之對應的是notbetween array('user',array(3,5,),'必須是3-5之間的數字','0','between'); array('user','3,5','必須是3-5之間的數字','0','between'); //附加規則expire,設置有效時間范圍,必須是通過表單提交才有效,可以是時間戳 array('user','2017-1-1,2018-1-1','時間已過期','0','expire'); //附加規則ip_deny,IP禁止訪問列表 //與之對應的是ip_allow ----IP允許 array('user','127.0.0.1','當前IP禁止','0','ip_deny');上面是已經定義好的,如果系統未定義的就是通過其他方法如:
//附加規則callback,回調驗證 array('user','checklength','用戶名必須在3-5位','0','callback',3,array(3,5));//回調方法 protected function checklength($str,$min,$max){preg_match_all("/./u",$str,$matches);$len = count($matches[0]);if($len<$min||$len>$max){return false;}else{return ture;} } //另一種是附加規則function,函數驗證 array('user','checklength','用戶名必須在3-5位','0','function',3,array(3,5));//在Common文件夾下的Common文件夾建立function.php文件,會自動加載 function checklength($str,$min,$max){preg_match_all("/./u",$str,$matches);$len = count($matches[0]);if($len<$min||$len>$max){return false;}else{return ture;} }如果有多個字段都包含錯誤,默認只顯示一個錯誤。
當想顯示全部錯誤的時候,可以說盒子屬性
如果是直接POST過來的,直接用create()方法即可。
//控制器create()方法自動調用驗證 $user = D('User');總結
以上是生活随笔為你收集整理的ThinkPHP--自动验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 愿码(ChainDesk.CN):EOS
- 下一篇: 房屋租赁app