1. 程式人生 > >thinkphp表單處理

thinkphp表單處理

使用create時,需要對是否建立資料物件進行判斷。否則插入資料時會出錯。判斷如下:

if($User->create()){
            $result = $User->where($where)->save($data);  //寫入到資料庫 
             if ($result === FALSE) {
            echo '<script>alert("儲存失敗");location.href="../../index.php/Personal/coachupdate"</script>';
        } else {
            echo '<script>alert("儲存成功");location.href="../../index.php/Personal/coachinfo"</script>';
        }

建立資料物件 create()

除了手動構造入庫的資料集之外,ThinkPHP 還提供了自動建立資料物件的 create() 方法。create() 方法將自動收集提交的表單資料並建立資料物件而無需人工干預,這在表單資料欄位非常多的情況下更具優勢。

將前文寫入表單資料的例子用 create() 來實現:

public function insert2(){
    header("Content-Type:text/html; charset=utf-8");
    $Dao = M("User");

    if($Dao->create()){
        $Dao->password = md5($_POST["password"]);
        $Dao->regdate = time();
        if($lastInsId = $Dao->add()){
            echo "插入資料 id 為:$lastInsId";
        } else {
            echo "資料寫入錯誤!";
        }
    }else{
        exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
    }
}

create() 建立資料物件後,將自動收集提交過來的表單資料。而表單資料可能需要經過一定加工(例如將密碼加密)才能寫入資料表,所以可以對資料物件的成員屬性值根據進行修改或新增去除等。

提示:create() 建立的資料物件存放於記憶體,在執行入庫動作(add() 或 save())之前,都可以進行修改。

在上面的例子裡,create()方法 的行為和 date()方法 是一致。但 date() 方法只是簡單的建立資料物件,但 create() 方法還具備:

  • 令牌驗證
  • 資料自動驗證
  • 欄位對映支援
  • 欄位型別檢查
  • 資料自動完成

等各種高階的資料功能,要完成這些高階資料模型功能,需要使用 D方法 例項化資料模型。ThinkPHP 提供了各種驗證與填充規則供呼叫,具體可參見《

ThinkPHP 自動驗證》與《ThinkPHP 自動填充》。

自動驗證與自動填充

在將表單寫入資料表之前,常常會有一些對資料的檢測(提交的使用者名稱是否符合要求)與處理(如例子中的密碼加密以及取得當前時間戳)。create() 方法就支援資料的自動驗證與自動完成。

在 LibModel 目錄下建立 UserModel.class.php 檔案(User 為建立的模型物件,也對應 字首_user 表),加入自動驗證和自動填充規則:

class UserModel extends Model{
    // 自動驗證設定
    protected $_validate = array(
        array('username','require','使用者名稱必須填寫!',1),
        array('email','email','郵箱格式錯誤!',2),
        array('username','','使用者名稱已經存在!',0,'unique',1),
    );
    //自動填充設定
    protected $_auto = array(
        array('regdate','time',self::MODEL_INSERT,'function'),
        array('password','md5',self::MODEL_INSERT,'function'),
    );
}

將 insert2 操作更改為:

public function insert2(){
    header("Content-Type:text/html; charset=utf-8");
    $Dao = D("User");

    if($Dao->create()){
        if($lastInsId = $Dao->add()){
            echo "插入資料 id 為:$lastInsId";
        } else {
            echo "資料寫入錯誤!";
        }
    }else{
        exit($Dao->getError().' [ <a href="javascript:history.back()">返 回</a> ]');
    }
}