iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 23
1
Modern Web

從基礎學習 ThinkPHP系列 第 23

Day23-從基礎學習 ThinkPHP-表單驗證(1)

  • 分享至 

  • xImage
  •  

前言

當我們送出一些表單的時候,都會有一些表單驗證的機制,那 ThinkPHP 呢?ThinkPHP 本身也有表單驗證功能,所以這一篇就會來介紹該如何使用 ThinkPHP 內建的表單驗證機制。

起手式

首先為了讓表單驗證可以看出所以然,所以這邊起頭要來建立一個新的資料表,專門存放帳號,SQL 語法就提供給各位:

CREATE TABLE think_account (
  id int(10) NOT NULL auto_increment,
  email varchar(15) NOT NULL default '',
  password varchar(10) NOT NULL default 0,
  gender int(2) NOT NULL default 0,
  PRIMARY KEY (id)
) AUTO_INCREMENT=1;

然後接下來建立 user 資料夾,並於 view 底下建立兩個頁面,分別為註冊頁面 (signup.html) 與登入頁面 (signin.html),內容我就不再額外提供 ↓

註冊&登入頁面

那麼畫面就會像這樣子 ↓

註冊頁面

登入頁面

路由與控制器部分我也不再額外提供,因為這部分撰寫很多次了。

表單驗證

首先 ThinkPHP 本身就有提供表單驗證的功能,只需要引入該函式庫就可以了:

use think\Validate;

但是 ThinkPHP 在這邊的做法稍微有點不太一樣,它會需要建立一個資料夾放置驗證用的原始碼,所以就要這樣建立 user/validate/user.php

validate

那麼 user.php 這個檔案內容如下:

<?php

namespace app\user\validate;

use think\Validate;

class user extends Validate
{
  protected $rule = [];
  protected $message = [];
}

首先程式碼裡面有兩個變數 $rule$message$rule 代表的是要驗證的欄位以及規則,而 $message 則是顯示錯誤訊息,那麼我們有需要填入的欄位共三個,分別為 emailpasswordgender,另外 $rule 是採用陣列的方式,所以就可以這樣撰寫 $rule

protected $rule = [
  'email' => 'require|email', // 驗證 Email 格式並且要必填
  'password' => 'require|min:8|max:30', // 必填且最小長度 8 最大長度 30
  'gender' => 'require|number',// 必填,只接受 number
];

多個驗證就用 | 分隔即可,如上述。

那麼提示訊息呢?當你驗證方式越多自然要會傳給使用者的訊息就會跟著越多,雖然系統有默認自定義提示訊息,但是還是建議自己寫提示訊息會比較好:

protected $message = [
  'email.require' => 'Email 必填',
  'email.email'=> 'Email 格式錯誤',
  'password.require' => '密碼欄位必填',
  'password.min' => '密碼最短長度為 8',
  'password.max' => '密碼長度最長為 30',
  'gender.require' => '性別必填',
  'gender' => '性別必須為是數字'
];

這樣我們就將表單驗證給完成了。

控制器

接下來要來修改控制器,首先我們會將表單接收的方法寫到 add() 方法內,然後會回傳我們剛剛發送的資料:

public function add($email, $password, $gender) {
    return $email. $password. $gender;
}

那麼該如何使用表單驗證呢?只需要加上一段 validate('資料','驗證器名稱') 即可搞定,這邊我順便接上資料庫,這樣才能夠看出真實性:

public function add($email, $password, $gender) {
  $user = new userModel;
  $user->email = $email;
  $user->password = $password;
  $user->gender = $gender;
  $result = $this->validate($user,'User');
  if($result){
  return $result;
  }
  if($user->save()){
      return '新增成功';
  } else {
      return $user->getError();
  }
}

這時候當我直接不填任何直接送出,就可以直接看到驗證畫面 ↓

表單驗證

最後我相信你會覺得這樣寫很煩:

public function add($email, $password, $gender) {
    $user = new userModel;
    $user->email = $email;
    $user->password = $password;
    $user->gender = $gender;
    $result = $this->validate($user,'User');
    if($result) {
      return $result;
    }
    if($user->save()){
      return '新增成功';
    } else {
      return $user->getError();
    }
}

所以我們可以將這一段程式碼給簡化,可以不用再函示上面設置變數接收表單資料,只需要使用 input(),先讓我們把程式碼修改一下變成這樣,然後來看這樣是否成功(json() 只是方便我們呈現資料在畫面上的一個方法而已):

public function add() {
    return json(input());
}

input 自動幫我們抓取表單欄位資料

所以我們就可以不用替函式設置變數,直接透過 input() 來取得表單欄位資料即可,但是這邊我們還可以更進一步的簡化儲存到資料庫的語法:

public function add() {
    $user = new userModel;
    $userData = input();
    $result = $this->validate($userData, 'User');
    if($result) {
        return $result;
    }
    if($user->save($userData)){
        return '新增成功';
    } else {
        return $user->getError();
    }
}

另外 ThinkPHP 還有提供一個功能,也就是批量驗證,預設只要遇到一個表單欄位沒有符合驗證規則就會直接跳掉,然後你就不知道其他欄位到底是否正確,那麼只需要在程式最前面加入一行 protected $batchValidate = true; 即可搞定,但是要注意此時的 $result 將會輸出陣列,若直接輸出將會出現錯誤,所以請記得要轉成 JSON 格式:

protected $batchValidate = true;

public function add() {
    $user = new userModel;
    $userData = input();
    $result = $this->validate($userData, 'User');
    if($result) {
        return json($result);
    }
    if($user->save($userData)){
        return '新增成功';
    } else {
        return $user->getError();
    }
}

批量驗證

結尾

這一章節先到這裡結束,已累。

但是基礎的表單驗證已經製作完成,那也因為寫太長所以拆成了兩個部分,接下來下一篇將會介紹將錯誤訊息回傳到前端畫面上。

本文同步發表於:https://hsiangfeng.github.io/php/20190924/3094489394/


上一篇
Day22-從基礎學習 ThinkPHP-內建標籤(2)
下一篇
Day24-從基礎學習 ThinkPHP-表單驗證(2)
系列文
從基礎學習 ThinkPHP31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言