thinkphp表單驗證


  之前的表單驗證都是用js寫的,這里也可以使用tp框架的驗證。但是兩者比較而言還是js驗證比較好,因為tp框架驗證會運行后台代碼,這樣運行速度和效率就會下降。 

  自動驗證是ThinkPHP模型層提供的一種數據驗證方法,可以在使用create創建數據對象的時候自動進行數據驗證。驗證的代碼要寫在模型層即Model里面。

  數據驗證有兩種方式:

  1. 靜態方式:在模型類里面通過$_validate屬性定義驗證規則。靜態方式定義好以后其它地方都可以使用。
  2. 動態方式:使用模型類的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.顯示頁面

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM