前言
當我們送出一些表單的時候,都會有一些表單驗證的機制,那 ThinkPHP 呢?ThinkPHP 本身也有表單驗證功能,所以這一篇就會來介紹該如何使用 ThinkPHP 內建的表單驗證機制。
起手式
首先為了讓表單驗證可以看出所以然,所以這邊起頭要來建立一個新的資料表,專門存放帳號,SQL 語法就提供給各位:
1 2 3 4 5 6 7
| 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 本身就有提供表單驗證的功能,只需要引入該函式庫就可以了:
但是 ThinkPHP 在這邊的做法稍微有點不太一樣,它會需要建立一個資料夾放置驗證用的原始碼,所以就要這樣建立 user/validate/user.php ↓

那麼 user.php 這個檔案內容如下:
1 2 3 4 5 6 7 8 9 10 11
| <?php
namespace app\user\validate;
use think\Validate;
class user extends Validate { protected $rule = []; protected $message = []; }
|
首先程式碼裡面有兩個變數 $rule、$message,$rule 代表的是要驗證的欄位以及規則,而 $message 則是顯示錯誤訊息,那麼我們有需要填入的欄位共三個,分別為 email、password、gender,另外 $rule 是採用陣列的方式,所以就可以這樣撰寫 $rule:
1 2 3 4 5
| protected $rule = [ 'email' => 'require|email', 'password' => 'require|min:8|max:30', 'gender' => 'require|number', ];
|
多個驗證就用 | 分隔即可,如上述。
那麼提示訊息呢?當你驗證方式越多自然要會傳給使用者的訊息就會跟著越多,雖然系統有默認自定義提示訊息,但是還是建議自己寫提示訊息會比較好:
1 2 3 4 5 6 7 8 9
| protected $message = [ 'email.require' => 'Email 必填', 'email.email'=> 'Email 格式錯誤', 'password.require' => '密碼欄位必填', 'password.min' => '密碼最短長度為 8', 'password.max' => '密碼長度最長為 30', 'gender.require' => '性別必填', 'gender' => '性別必須為是數字' ];
|
這樣我們就將表單驗證給完成了。
控制器
接下來要來修改控制器,首先我們會將表單接收的方法寫到 add() 方法內,然後會回傳我們剛剛發送的資料:
1 2 3
| public function add($email, $password, $gender) { return $email. $password. $gender; }
|
那麼該如何使用表單驗證呢?只需要加上一段 validate('資料','驗證器名稱') 即可搞定,這邊我順便接上資料庫,這樣才能夠看出真實性:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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(); } }
|
這時候當我直接不填任何直接送出,就可以直接看到驗證畫面 ↓

最後我相信你會覺得這樣寫很煩:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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() 只是方便我們呈現資料在畫面上的一個方法而已):
1 2 3
| public function add() { return json(input()); }
|

所以我們就可以不用替函式設置變數,直接透過 input() 來取得表單欄位資料即可,但是這邊我們還可以更進一步的簡化儲存到資料庫的語法:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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 格式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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(); } }
|

結尾
這一章節先到這裡結束,已累。
但是基礎的表單驗證已經製作完成,那也因為寫太長所以拆成了兩個部分,接下來下一篇將會介紹將錯誤訊息回傳到前端畫面上。
整理這些技術筆記真的很花時間,如果你願意 關閉 Adblock 支持我,我會把這份感謝轉換成更多「踩坑轉避坑」的內容給你!ヽ(・∀・)ノ
Advertisement