thinkphp中create()方法實現簡單的使用者登錄檔單驗證功能

yi_an發表於2016-07-24

一些說明

使用的tp框架是3.2.2
IDE 為phpstorm
整合環境是 xammp
資料庫mysql 管理工具是NAVCAT for mysql
使用了smarty模板引擎

tp_user資料表的結構

資料表的結構

使用者登錄檔單的html程式碼和頁面

程式碼(包括使用了smarty模板引擎輸出錯誤資訊$那一塊)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>使用者註冊</title>
</head>
<body>
<form action="{$smarty.const.__SELF__}" method="post">
    <table>
        <h3>使用者註冊</h3>
            <tr><span>使用者名稱:</span><input type="text" name="username" value=""></tr><span style="color: red">{$errorinfo.username|default:""}</span><br>
            <tr><span>密  碼:</span><input type="text" name="psw" value=""></tr><span style="color: red">{$errorinfo.psw|default:""}</span><br>
            <tr><span>確認密碼:</span><input type="text" name="pswok" value=""></tr><span style="color: red">{$errorinfo.pswok|default:""}</span><br>
            <tr><span>郵  箱:</span><input type="text" name="mail" value=""></tr><span style="color: red">{$errorinfo.mail|default:""}</span><br>
            <tr><span>qq號碼:</span><input type="text" name="qq" value=""></tr><span style="color: red">{$errorinfo.qq|default:""}</span><br>
            <tr><span>手機號碼:</span><input type="text" name="tel" value=""></tr><span style="color: red">{$errorinfo.tel|default:""}</span><br>
            <span>愛好:</span><span style="color: red">{$errorinfo.hobby|default:""}</span><br>
            <tr><input type="checkbox" name="hobby[]" value="1">吃飯1</tr><br>
            <tr><input type="checkbox" name="hobby[]" value="2">睡覺2</tr><br>
            <tr><input type="checkbox" name="hobby[]" value="3">打擺子3</tr><br>

            <tr><input type="submit" value="提交註冊"></tr>
    </table>
</form>

</body>
</html>

頁面截圖

這裡寫圖片描述

目錄結構

這裡寫圖片描述

處理過程

  1. 首先建立一個資料庫表的物件
    $m = new \Model\UserModel();
    靜態定義方式因為必須定義模型類,所以只能用D函式例項化模型或者上面的形式。
  2. 使用create方法建立資料物件,此時物件是儲存在記憶體中的,並沒有實際的寫入到資料庫中。並且以陣列的形式儲存。create方法執行的同時會自動觸發表單驗證和其他一些驗證方法。
    $info = $m->create();
  3. 使用靜態方式驗證:在模型類裡面通過$_validate屬性定義驗證規則
    程式碼如下:(具體的驗證說明可以參考開發手冊“模型”目錄下的“自動驗證”那一部分)
namespace Model;
use Think\Model;
class UserModel extends Model
{
    // 自動驗證定義
    //array(欄位,驗證規則,錯誤提示,驗證條件,附加規則,驗證時間)
    protected $patchValidate = true;//開啟批處理驗證
    protected $_validate = array(
        //對使用者名稱驗證,不能為空
        array('username','require',"username is null!"),
        array('username','',"username is exist!",0,'unique',1),
        array('psw','require','psw is null!'),
        array('pswok','require','pswok is null!'),
        array('pswok','psw','psw and pswok  is error!',0,'confirm'),
        array('mail','email','EMAIL is error'),
        //array('qq','require',"qq number  is null!"),
        array('qq','number','qq number  is error',2),
        array('qq','5,12','qq length is error',2,'length'),

        array('hobby','check_hobby',"hobby num must over 2",0,'callback')
    );
    function  check_hobby($arg){
        $len = count($arg);
        if($len<2){
            return false;//會自動輸出驗證的錯誤資訊
        }
        return true;
    }
}

4 將錯誤資訊顯示到前臺頁面上去
我們通過getError()方法獲取到錯誤資訊,再通過assign()方法將錯誤資訊儲存起來$this->assign("errorinfo",$m->getError());。在前端通過{$errorinfo.username}來將錯誤資訊輸出。<span style="color: red">{$errorinfo.username|default:""}</span>這裡使用了default設定預設值,防止無值情況顯示錯誤。

下面是UserController下的register方法的完整程式碼:

function register(){
        $m = new \Model\UserModel();
        if(!empty($_POST)){
            //dump($_POST);
            $info = $m->create();  //收集$_POST的資料並返回,同時觸發表單自動驗證etc.
            if($info){
                //dump($info);
                $info['hobby'] = implode(',',$info['hobby']);//將陣列資訊轉換成字串,這樣才可以用來插入到資料庫中
                //dump($info);
                if($m->add($info)){
                    $this->redirect("Index/index");
                    //dump($info);
                }
            }else{
                //dump($m->getDbError());
                //dump($m->getError());
                $this->assign("errorinfo",$m->getError());
            }
        }
        $this->display();
    }

最後

自動驗證包括靜態方式和動態方式。
1. 靜態方式:在模型類裡面通過$_validate屬性定義驗證規則。
2. 動態方式:使用模型類的validate方法動態建立自動驗證規則
這裡只對靜態方式簡單的使用。更多的可以參考使用手冊

相關文章