一. 驗證規則
數據驗證可以對表單中的字段進行非法的驗證操作。一般提供了兩種驗證方式:靜態定
義($_validate 屬性)和動態驗證(validate()方法)。
//驗證規則
1 array( 2 array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]), 3 array(驗證字段2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]), 4 ...... 5 );
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 | 函數驗證,定義的驗證規則是一個函數名 |
規則 | 說明 |
regex | 正則驗證,定義的驗證規則是一個正則表達式(默認) |
function | 函數驗證,定義的驗證規則是一個函數名 |
callback | 方法驗證,定義的驗證規則是當前模型類的一個方法 |
confirm |
驗證表單中的兩個字段是否相同,定義的驗證規則是一 |
equal | 驗證是否等于某個值,該值由前面的驗證規則定義 |
notequal |
驗證是否不等于某個值,該值由前面的驗證規則定義 |
in |
驗證是否在某個范圍內,定義的驗證規則可以是一個數 |
notin |
驗證是否不在某個范圍內,定義的驗證規則可以是一個 |
length |
驗證長度,定義的驗證規則可以是一個數字(表示固定 |
between |
驗證范圍,定義的驗證規則表示范圍,可以使用字符串 |
notbetween |
驗證不在某個范圍,定義的驗證規則表示范圍,可以使 |
expire |
驗證是否在有效期,定義的驗證規則表示時間范圍,可 |
ip_allow |
驗證 IP 是否允許,定義的驗證規則表示允許的 IP 地址 |
ip_deny |
驗證 IP 是否禁止,定義的驗證規則表示禁止的 ip 地址 |
unique |
驗證是否唯一,系統會根據字段目前的值查詢數據庫來 |
驗證時間:主要新增修改等驗證。
1.self::MODEL_INSERT 或 1 新增數據時驗證; 2.self::MODEL_UPDATE 或 2 編輯數據時驗證; 3.self::MODEL_BOTH 或 3 全部情況下驗證(默認)。
二. 靜態定義
在模型類里預先定義好該模型的自動驗證規則,就是靜態定義。
在 Home/controller/UserController.class.php 插入以下代碼:
1 //控制器create()方法自動調用驗證 2 $user = D('User'); 3 $data['user'] = '蠟筆小新'; 4 if ($user->create($data)) { 5 echo '所有數據驗證成功!'; 6 } else { 7 //輸出錯誤信息 8 var_dump($user->getError()); 9 }
這時,在 Home/Model/UserModel.class.php 插入以下檢測的代碼:
1 <?php 2 namespace Home\Model; 3 use Think\Model; 4 5 class UserModel extends Model { 6 protected $_validate= array( 7 array('user','require','用戶名不得為空',0,'regex',3), 8 ); 9 }
array('user', 'require', '用戶不得為空!'), 內置驗證require,不得為空的用法,這時就會去驗證 $data['user'] = '蠟筆小新'; 這個數值,如果$data['user']為空的話,就會
var_dump()出'用戶不的為空'這條語句
需要注意的是 rray('user', 'require', '用戶不得為空!'), 里的user是和 Home/controller/UserController.class.php 中 $data['user'] = '蠟筆小新'; 里的user是必須相同的
要不然就不能驗證了。
ThinkPHP 提供了九種自動驗證內置方案,具體如下:
1 //內置驗證require,不得為空的用法 2 array('user', 'require', '用戶不得為空!'),
1 //內置驗證email,合法的郵箱格式 2 array('user', 'email', '郵箱格式不合法!'),
1 //內置驗證email,合法的郵箱格式,而且必須要有http:// 但是我試了,發現沒有www是可行的 2 array('user', 'email', '郵箱格式不合法!'),
1 //內置驗證url,驗證網址是否合法 2 array('user', 'url', 'URL 路徑不合法!'),
1 //內置驗證currency,驗證是否為貨幣 2 array('user', 'currency', '貨幣格式不正確!'),
1 //內置驗證zip,驗證是否為六位整數郵政編碼 2 array('user', 'zip', '郵政編碼格式不正確!'),
1 //內置驗證number,驗證是否為正整數 2 array('user', number, '正整數格式不正確!'),
1 //內置驗證integer,驗證是否為整數,正負均可 2 array('user', 'integer', '整數格式不正確!'),
1 //內置驗證double,驗證是否為浮點數,正負均可 2 array('user', 'double', '整數格式不正確!'),
1 //內置驗證english,驗證是純英文 2 array('user', 'english', '不是純英文!'),
ThinkPHP 還提供了附加規則,來提升自動驗證的擴展性:
1 //附加規則regex,驗證3-6位純數字 2 array('user', '/^\d{3,6}$/', '不是 3-6 位純正數字', 0, 'regex'),
1 //附加規則equal,驗證是否和指定值相等 2 array('user', '張三', '值不對等', 0, 'equal'),
1 //附加規則notequal,驗證是否與指定值不等 2 array('user', '張三', '值不能相等', 0, 'notequal'),
1 //附加規則confirm,驗證兩條字段是否相同 2 array('user', 'name', '兩個用戶名對比不同!',0,'confirm'),
這時在 Home/controller/UserController.class.php 這應該要有$data['user']和$data['name']這兩個參數,要不然就沒有對比的了。
可以用在用戶注冊時,password和repassword,這樣就能驗證用戶輸入的密碼是確定的。
1 //附加規則in,某個范圍,可以是數組或逗號分割的字符串 2 array('user', array(1,2,3), '不在指定范圍', 0, 'in'), 3 array('user', '張三,李四,王五', '不在指定范圍', 0, 'in'),
1 //附加規則notin,某個范圍,可以是數組或逗號分割的字符串 2 array('user', array(1,2,3), '不得在指定范圍', 0, 'notin'), 3 array('user', '張三,李四,王五', '不得在指定范圍', 0, 'notin'),
1 //附加規則length,驗證長度或數字范圍 2 array('user', '3', '不得小于 3 位', 0, 'length'), 3 array('user', '3,5', '不得小于 3 位,不得大于 5 位', 0, 'length'),
1 //附加規則between,驗證某個范圍,數字或逗號字符串 2 array('user', array(3,5), '必須是 3-5 之間的數字', 0, 'between'), 3 array('user', '3,5', '必須是 3-5 之間的數字', 0, 'between'),
1 //附加規則notbetween,驗證某個范圍,數字或逗號字符串 2 array('user', array(3,5), '必須不是 3-5 之間的數字', 0, 'notbetween'), 3 array('user', '3,5', '必須不是 3-5 之間的數字', 0, 'notbetween'),
文章列表