自動驗證是ThinkPHP模型層提供的一種數據驗證方法,可以在使用create創建數據對象的時候自動進行數據驗證。驗證的代碼要寫在模型層即Model里面。
數據驗證有兩種方式:
- 靜態方式:在模型類里面通過$_validate屬性定義驗證規則。靜態方式定義好以后其它地方都可以使用。
- 動態方式:使用模型類的validate方法動態創建自動驗證規則。動態方式比較靈活,哪里使用就寫,其它地方不可以使用。
無論是什么方式,驗證規則的定義是統一的規則,定義格式為:
array(//驗證規則是一個二維數組,里面是以為數組,每個一維數組是一個驗證。括號里面的信息都是需要寫的。 array(驗證字段1,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]),//1.驗證字段(必須的):需要驗證哪個字段;2.驗證規則(必須的):使用什么規則驗證;3.錯誤提示(必須的):驗證失敗后提示的信息;4.驗證條件(可選的):用什么條件來驗證,是可選的條件;5.附加規則(可選的):附加的一些規則;6.驗證時間(可選的):比如往數據庫里寫的時候驗證,修改的時候驗證; array(驗證字段2,驗證規則,錯誤提示,[驗證條件,附加規則,驗證時間]), ...... );
一、靜態驗證
1.先在Application\Home\Controller里面寫方法
<?php
namespace Home\Controller;
use Think\Controller; class TestController extends Controller { public function add() { if(empty($_POST))//如果post數組為空 { $this->show();//顯示add.html頁面 } else//如果post數組不為空 { $y = D("YongHu");//造YongHu表的對象 $r = $y->create();//自動收集表單,收集表單的時候自動驗證。 if($r)//驗證通過返回true { $y->add();//驗證通過后將收集的表單加到表格里面。 } else//如果驗證失敗 { die($y->getError());//表示輸出錯誤信息並且退出程序 } } } }
2.在thinkphp\Application\Home\View\Test寫上對應的html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> <style type="text/css"> </style> </head> <body> <form action="__ACTION__" method="post"> <div>用戶名:<input type="text" name="uid" /></div> <div>密碼:<input type="text" name="pwd" /></div> <div>確認密碼:<input type="text" name="pwd1" /></div> <div>姓名:<input type="text" name="name" /></div> <div>郵箱:<input type="text" name="email" /></div> <div>年齡:<input type="text" name="age" /></div> <div><input type="submit" value="提交" /></div> </form> </body> <script type="text/javascript"> </script> </html>
3.在thinkphp\Application\Home\Model里面寫模型文件,也就是驗證的方法。
<?php
namespace Home\Model;
use Think\Model; class YongHuModel extends Model { protected $tablePrefix = "";//表示表格前綴為空,就是沒有前綴。 protected $trueTableName = "yonghu";//如果不寫這句話,會自動去找Yong_Hu這張表,這是默認的表格的命名。這里要寫上實際的表格的名字。 protected $_validate = array( array("uid","require","用戶名不能為空",0),//對用戶名加非空驗證。手冊里面沒有非空的驗證,自己寫。1.字段名為uid;2.require表示字段必須,寫在這里意思就是不能為空;3.提示信息;4.self::EXISTS_VALIDATE 或者0 存在字段就驗證(默認),這里寫0代表的就是存在字段就去驗證。 array("pwd",'pwd1',"兩次輸入的密碼不一致",0,"confirm"), //驗證2此輸入的密碼是否相同.confirm表示驗證表單中的兩個字段是否相同,定義的驗證規則是一個字段名,所以第二個字段名寫第2此輸入密碼的密碼框的name值pwd1 array("email","email","郵箱格式輸入不正確"),//驗證郵箱書寫是否正確。email是tp框架里面自帶的驗證方法,代表的是郵箱驗證。 array("name","/^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X)$/","身份證號碼不正確",0,"regex"),//身份證號驗證。regex表示正則表達式,第2項驗證規則里面就需要寫上身份證號的正則表達式。 array("age","18,50","年齡不在范圍內",0,"between"),//范圍驗證,用in、between都可以,這里使用between。如果在輸入信息的時候出現大於1個錯誤,會按照這里的順序輸出第一個錯誤信息。 ); }
二、動態驗證
1.在Application\Home\Controller里面寫方法
<?php
namespace Home\Controller;
use Think\Controller; class TestController extends Controller { public function add() { if(empty($_POST))//如果post數組為空 { $this->show();//顯示add.html頁面 } else//如果post數組不為空 { $y = D("YongHu"); $arr = array(//動態驗證就是需要在哪驗證就在哪里寫驗證方法。 array("uid","require","用戶名不能為空",0),//講驗證的方法寫在方法里面 ); if($y->validate($arr)->create())//這里要先調用validate方法,然后將寫的驗證方法放到validate里面 { $y->add(); } else { die($y->getError()); } } } }
2.在thinkphp\Application\Home\View\Test寫上對應的html文件
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>無標題文檔</title> <style type="text/css"> </style> </head> <body> <form action="__ACTION__" method="post"> <div>用戶名:<input type="text" name="uid" /></div> <div>密碼:<input type="text" name="pwd" /></div> <div>確認密碼:<input type="text" name="pwd1" /></div> <div>姓名:<input type="text" name="name" /></div> <div>郵箱:<input type="text" name="email" /></div> <div>年齡:<input type="text" name="age" /></div> <div><input type="submit" value="提交" /></div> </form> </body> <script type="text/javascript"> </script> </html>
3.在thinkphp\Application\Home\Model里面寫模型文件。
<?php
namespace Home\Model;
use Think\Model; class YongHuModel extends Model { protected $tablePrefix = "";//表示表格前綴為空,就是沒有前綴。 protected $trueTableName = "yonghu";//如果不寫這句話,會自動去找Yong_Hu這張表,這是默認的表格的命名。這里要寫上實際的表格的名字。 }
三、Ajax做驗證
tp動態驗證和靜態驗證都有一個很大的缺點,那就是在提示錯誤信息的時候都要跳轉到其它頁面顯示出錯誤信息。如果需要在當前頁面顯示出錯誤信息,就需要用ajax做驗證。
1.寫顯示和ajax處理方法
<?php
namespace Home\Controller;
use Think\Controller; class TestController extends Controller { public function tianjia()//添加方法,用來顯示頁面 { $this->show(); } public function test()//ajax處理方法 { $y = D("YongHu"); $arr = array(//動態驗證就是需要在哪驗證就在哪里寫驗證方法。 array("uid","require","用戶名不能為空"),//講驗證的方法寫在方法里面 ); if($y->validate($arr)->create())//這里要先調用validate方法,然后將寫的驗證方法放到validate里面 { $this->ajaxReturn("通過驗證","eval"); } else { $this->ajaxReturn($y->getError(),"eval"); } } }
2.寫顯示頁面
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <script src="__PUBLIC__/js/jquery-1.11.2.min.js"></script> <title>無標題文檔</title> <style type="text/css"> </style> </head> <body> <div>用戶名:<input id="uid" type="text" name="uid" /></div> <div><input id="btn" type="button" value="驗證" /></div> </body> <script type="text/javascript"> $("#btn").click(function(){ var uid = $("#uid").val(); $.ajax({ url:"__CONTROLLER__/test", data:{uid:uid}, type:"POST", dataType:"TEXT", success: function(data){ alert(data); } }) }) </script> </html>
3.顯示頁面