เนื้อหาตอนต่อไปนี้ เราจะมาพูดถึงการตรวจสอบความ
ถูกต้องของข้อมูล หรือที่เรียกกันว่า Data Validation ในที่นี้
จะขอใช้คำว่า validated data โดยส่วนใหญ่ข้อมุลที่ใช้ตรวจสอบ
ก็จะเป็นค่าจากฟอร์มที่ส่งโดยผู้ใช้
เราเคยมีเนื้อหาเกี่ยวกับการ validated data มาบ้างแล้วอย่างเช่น
ในตัวอย่างการทำ CRUD ที่ใช้งานการ validated ผ่าน Controller โดยใช้
คำสั่ง $this->validate() สามารถทบทวนเป็นแนวทางได้ที่บทความ
สร้างระบบ CRUD เพื่อศึกษาฟังก์ชั่นของ Model ใน CodeIgniter 4 http://niik.in/995
https://www.ninenik.com/content.php?arti_id=995 via @ninenik
นอกจากนั้นก็มีส่วนของการ validated data โดยใช้งานผ่าน Model สามารถ
ทบทวนได้ที่บทความ
รู้จักกับ Model และวิธีการใช้งาน Model ใน CodeIgniter 4 http://niik.in/1004
https://www.ninenik.com/content.php?arti_id=1004 via @ninenik
สำหรับการ validated data ในเนื้อหานี้จะพูดถึงโดยรวมการใช้งาน ไม่ว่าจะเป็นการกำหนด rule
การกำหนด error message การกำหนด template และการใช้งานการ validated data
ในการ validated data หากไม่ผ่าน สิ่งที่เราจะได้รับกลับมาคือข้อความ error ของฟิลด์ข้อมูลที่ไม่ผ่าน
rule หลักเกณฑ์การตรวจสอบ เราสามารถนำไปแสดงในฟอร์มข้อมูลได้ เพื่อแจ้งเตือนได้
การนำข้อความ error ที่ได้จากการตรวจสอบมาแสดง ก็สามารถเลือกแสดงในลักษณะ 2 รูปแบบ คือ
แสดงเป็นลิสรายการ ด้านบนของฟอร์ม หรือ แสดงใกล้ๆ กับฟิลด์ข้อมูลนั้นๆ ที่มี error เกิดขึ้น
เตรียมส่วนของไฟล์ทดสอบ
ให้เราเตรียมส่วนของไฟล์ทดสอบตามรูปแบบดังนี้
app/Controllers/Helloworld.php
<?php namespace App\Controllers; use CodeIgniter\Controller; // เรียกใช้งาน Controller class class Helloworld extends Controller { public function index() { helper('form'); // ใช้งาน form helper ฟังก์ชั่น $data = [ 'title' => 'test validated data' ]; echo view('pages/myform', $data); } }
สำหรับส่วนของ Views ที่แสดงผลลัพธ์ประกอบการอธิบาย เรามีการใช้งาน CSS Bootstrap ร่วมด้วย
app/Views/pages/myform.php
<!doctype html> <html lang="th"> <head> <meta charset="utf-8"> <title><?= esc($title) ?></title> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" crossorigin="anonymous"> </head> <body> <!-- ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม--> <?= form_open('helloworld') ?> <input type="hidden" name="email" value=""> <input type="hidden" name="password" value=""> <button type="submit">Login</button> <?= form_close() ?> <!-- สร้างลิ้งค์สำหรับรีโหลดหน้าทดสอบ--> <?= anchor(current_url(),'Reload','class="btn btn-primary btn-sm"') ?> </body> </html>
สังเกตว่าในฟอร์มตัวอย่าง เราทดสอบโดยการกำหนด input hidden สำหรับข้อมูลที่จะส่งทดสอบ
การทำงานโดยไม่มีการกำหนดค่า หรือให้เป็นค่าว่าง จำไว้เสมอว่า ค่าที่สำคัญสำหรับการใช้งานฟอร์มคือ
name attribute จะเป็นค่าหลักที่ใช้งานกับ server side script (PHP)
ตอนนี้เราเตรียมส่วนสำหรับทดสอบ ประกอบการอธิบายเรียบร้อยแล้ว ไปต่อที่หัวข้อถัดไป
การใช้งาน Data Validation
เราจะมาดูการ validated data โดยจะจำลองข้อมูลในฟอร์มด้วย hidden ที่กำหนดใน views
สำหรับใช้งาน data validation แล้วดูผลลัพธ์ และรูปแบบการทำงาน ก่อนอื่นต้องย้ำอีกครั้งว่า การ validated
data ใน CI จะทำได้เบื้องต้นผ่าน 2 รูปแบบ คือ ผ่าน Model ซึ่งจะทำงานอัตโนมัติ เมื่อใช้คำสั่ง insert()
update() และ save() นั่นคือเมื่อเราเรียกคำสั่งเหล่านี้ ตัวข้อมูลจะถูก validated ให้อัตโนมัติตามที่เรากำหนด
ในการตรวจสอบก็จะเช็คว่า การทำคำสั่งทั้ง 3 ( insert() update() และ save() ) นั้นทำงานสำเร็จหรือไม่
ดูตัวอย่างการทำงาน เพิ่อทบทวน กรณีการเรียก ใช้งานผ่าน model
if ($this->model->save($data) === false) { return view('pages/myform', ['errors' => $this->model->errors()]); }
จะเห็นวาคำสั่ง save() ข้างบน เป็นการใช้งานผ่าน method ของ model หากทำการบันทึกไม่ผ่าน
จะหมายถึง ไม่ผ่านการ validated data อัตโนมัติด้วย เราก็สามารถส่งค่า error จากคำสั่ง
$this->model->errors() ไปแสดงค่า แจ้ง error ใน views ผ่านตัวแปร 'errors' ตามตัวอย่างด้านบน
กรณีเราใช้งานผ่าน Model แต่ต้องการกำหนด rule เฉพาะส่วนการใช้งานนั้นๆ เอง โดยใช้คำสั่ง
setValidationRules() ก็จะมีรูปแบบประมาณนี้
app/Controllers/Helloworld.php (บางส่วน)
$validationRules = [ 'username' => 'required|alpha_numeric_space|min_length[3]', 'email' => [ 'rules' => 'required|valid_email|is_unique[users.email]', 'errors' => [ 'required' => 'We really need your email.', ], ], ]; $this->model->setValidationRules($validationRules); if ($this->model->save($data) === false) { return view('pages/myform', ['errors' => $this->model->errors()]); }
เนื้อหาเกี่ยวกับส่วนนี้ทบทวนได้ที่บทความเกี่ยวกับ model เพิ่มเติม http://niik.in/1004
การใช้งาน Data Validation ใน Controller
ต่อไปมาดูกรณีที่เป็นการใช้งานการ validated data โดยใช้งาน Controller โดยตรงผ่านคำสั่ง validate()
จะมีรูปแบบประมาณนี้
helper('form'); // ใช้งาน form helper ฟังก์ชั่น $data = [ 'title' => 'test validated data' ]; if(! $this->validate([ 'email' => 'required', 'password' => 'required', ])){ $data['validation'] = $this->validator; } echo view('pages/myform', $data);
เนื่องจากใน Controller เราสามารถใช้งาน Validation instance ผ่านคำสั่ง $this->validator และทำการ
validated ข้อมูลผ่านคำสั่ง $this->validate() ได้เลย โดยไม่ต้องโหลดตัว Valiation class มาใช้งาน แต่ถ้า
เราใช้งานใน class อื่นๆ ที่ไม่ใช่ Controller เราสามารถโหลด validation class ผ่านคำสั่งดังต่อไปนี้ได้
// $validation = \Config\Services::validation(); // หรือ $validation = service('validation');
แต่ใน Controller เราข้ามส่วนนี้ไปได้เลย
กลับมาต่อที่โค้ด
ตัวอย่างข้างต้น เรากำหนด validated ตั้งแต่ที่ฟอร์มถูกโหลด โดยมี rule กำหนดให้ต้องมีข้อมูลจากฟิลด์
email และ password คำสั่ง $this->validate() จะคืนค่าเป็น boolean (true / false ) เราใช้เงื่อนไขว่า
ถ้าไม่ผ่านการ validated ให้ทำการส่งค่า Validation instance ด้วยคำสั่ง $this->validator ผ่านตัวแปร
validation ไปใช้งานในฟอร์ม
ต่อไปส่วนของฟอร์มเราก็จะแสดงข้อมูลการใช้งานดังนี้
app/Views/pages/myform.php (บางส่วน)
<?= (isset($validation))?$validation->listErrors():NULL ?> <!-- ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม--> <?= form_open('helloworld') ?> <input type="hidden" name="email" value=""> <input type="hidden" name="password" value=""> <button type="submit">Login</button> <?= form_close() ?>
เราใช้คำสั่ง $validation->listErrors() เพื่อแสดงลิสรายการ errors ที่เกิดขึ้นกรณีไม่ผ่านการ validated
และเนื่องจาก เมื่อเราโหลดฟอร์มครั้งแรก เรากำหนดให้ทำการ validated ข้อมูลเลย ก็จะได้ผลลัพธ์ประมาณนี้
โครงสร้าง template ของ CI ที่แสดงแจ้งเตือน จะเป็นดังนี้
<div class="errors" role="alert"> <ul> <li>The email field is required.</li> <li>The password field is required.</li> </ul> </div>
รูปแบบโครงสร้าง HTML สำหรับการแจ้งเตือนข้างต้น เป็นค่าที่ใช้จาก template ของ CI ที่มีมาให้
เนื้อหาสำหรับกำหนด template หรือรูปแบบการแสดงจะนำเสนอในหัวข้อในลำด้บต่อไป
การส่ง validation instance เข้ามาใช้งานในฟอร์ม ทำให้เราสามารถเรียกใช้คำสั่งต่างๆ ของ validation
ได้อย่างข้างต้นเราใช้คำสั่ง listErrors() เพื่อแสดงลิสรายการแจ้งเตือนทั้งหมดในรูปแบบที่ CI กำหนดให้
เราสามารถแสดงเฉพาะรายการด้วยคำสั่ง showError() ตัวอย่างเช่นอยากแสดงตำแหน่งของฟิลด์ข้อมูลนั้น
<input type="hidden" name="email" value=""> <?= (isset($validation))?$validation->showError('email'):NULL ?> <input type="hidden" name="password" value=""> <?= (isset($validation))?$validation->showError('password'):NULL ?> <button type="submit">Login</button>
ผลลัพธ์ที่ได้
โครงสร้าง HTML ของ CI ใช้รูปแบบ template ในรูปแบบประมาณนี้
<input type="hidden" name="email" value=""> <span class="help-block">The email field is required.</span> <input type="hidden" name="password" value=""> <span class="help-block">The password field is required.</span> <button type="submit">Login</button>
ทั้งคำสั่งแสดงการแจ้งเตือนแบบลิสรายการ listErrors() และแบบแสดงแต่ละรายการ showError()
รองรับการกำหนด template ดังนี้
listErrors() จะกำหนดเป็น parameter แรก ชื่อ template ที่เป็นค่าเริ่มต้นคือ 'list' นั่นคือ listErrors()
มีค่าเท่ากับ การกำหนด template เป็น listErrors('list')
showError() คำสั่งแสดงเป็นแต่ละรายการ จะกำหนด template ใน parameter ตัวที่ 2 โดยมีชื่อ
template ค่าเริ่มต้นเป็น 'single' นั่นคือ สมมติฟิลด์ email ก็จะเป็น showError('email') เท่ากับ
showError('email','single')
นอกจากเราจะใช้รูปแบบการแสดงการแจ้งเตือนเป็น template แล้ว เรายังสามารถดึงเฉพาะข้อมูล errors
แล้วจัดรูปแบบตามต้องการ โดยใช้คำสั่ง ดังนี้
All Errors
getErrors() // คืนค่าเป็น array ของ errors ทั้งหมด // Returns: [ 'field1' => 'error message', 'field2' => 'error message', ]
Single Error
getError('email'); // คืนค่าเป็น string ข้อความ error ของฟิลด์ที่กำหนด // The email field is required.
จะเห็นว่าคำสั่งทั้งสองข้างต้น จะคืนค่าเป็นตัวแปรข้อมูล ที่เราสามารถนำไปจัดการหรือจัดรูปแบบการแสดง
กำหนดโครงสร้าง HTML แบบใดก็ได้ เหมาะสำหรับกรณีต้องการจัดการเฉพาะส่วนนั้นๆ ไม่ต้องใช้งาน template
ตัวอย่างการใช้งาน
<?php if(isset($validation)){ $errors = $validation->getErrors(); if($errors){ ?> <div class="alert alert-danger" role="alert"> <ul> <?php foreach ($errors as $error) : ?> <li><?= esc($error) ?></li> <?php endforeach ?> </ul> </div> <?php } } ?>
<div class="invalid-feedback"> <?= (isset($validation))?$validation->getError('email'):NULL ?> </div>
กรณีเราต้องการเช็คว่ามี error ฟิลด์ที่กำหนดหรือไม่ เพื่อใช้ในการกำหนดค่าเพิ่มเติมในส่วนที่ต้องการ เข่น
แทนที่จะใช้ข้อความจาก error โดยตรงก็อาจจะกำหนดเป็นข้อความอื่นๆ โดยใช้คำสั่ง hasError() ดังนี้
<?php if (isset($validation) && $validation->hasError('email')) { // echo $validation->getError('email'); echo "กรุณากรอกอีเมล"; } ?>
หรือจะใช้กำหนด css class สำหรับทำงานบางอย่างเช่น
<input type="email' name="email" class="form-control <?=(isset($validation) && $validation->getError('email'))?"invalid":""?>" />
การส่งค่า Validation instance เข้าไปใน Views ก็จะมีประโยชน์ตรงที่เราสามารถเรียกใช้คำสั่งต่างๆ ได้
สะดวก ต่างจากรูปแบบตัวอย่างการใช้งาน model ที่เราจะส่งเฉพาะ array ของ errors ถ้ามี มาใช้งานแทน ซึ่ง
วิธีนั้นก็จะสะดวกกรณีที่เราไม่ต้องการกำหนด template ใดๆ ก็แค่ส่งค่า errors เข้ามา แล้วจัดการด้วยโค้ดตาม
ต้องการ หรือกรณีที่ไม่มีการส่งค่า errors จากการ validated ใดๆ เข้ามาเลย เราก็สามารถเรียกใช้งาน Validation
ผ่าน validation class โดยตรงดังนี้ได้
กรณีไม่ส่ง Validation instance หรือ errors ของการ validated ใดๆ เข้าไปใน views โดยใช้แค่คำสั่ง
$this->validate() ตรวจสอบเท่านั้น
if(! $this->validate([ 'email' => 'required', 'password' => 'required', ])){ // $data['validation'] = $this->validator; } echo view('pages/myform', $data);
เราสามารถเรียกใช้งาน Validation class โดยตรงใน Views ได้ดังนี้
<?= \Config\Services::validation()->listErrors(); ?>
กรณีเราต้องการส่งเฉพาะข้อมูล errors การ validated เหมือนกรณีใช้งาน model ก็สามารถกำหนดเป็นดังนี้ได้
$data = [ 'title' => 'test validated data' ]; if(! $this->validate([ 'email' => 'required', 'password' => 'required', ])){ $data['errors'] = $this->validator->getErrors(); }
โดยแทนที่จะส่งเป็น Validation instance เราก็ส่งเป็น array ของ Errors ถ้ามีเข้าไปใช้งานใน Views
ส่วนในหน้า Views เราก็เรียกวนลูปแสดงข้อมูลปกติ
<div class="alert alert-danger" role="alert"> <ul> <?php foreach ($errors as $error) : ?> <li><?= esc($error) ?></li> <?php endforeach ?> </ul> </div>
หรือต้องการเป็นบางรายการ ก็อ้างอิงผ่านตัวแปร $errors เช่น
<div class="invalid-feedback"> <?= esc($errors['email']) ?> </div>
การกำหนดเงื่อนไขการ Validated data
เราสามารถกำหนดเงื่อนไขการเริ่ม validated ข้อมูลได้ทั้งแบบก่อนและหลังส่งข้อมูล หรือ
จะเป็นแบบหลังส่งข้อมูลอย่างเดียวก็ได้ เราจะลองใช้ฟอร์มสำหรับทดสอบเป็นดังนี้
app/Views/pages/myform.php (บางส่วน)
<?= (isset($validation))?$validation->listErrors():NULL ?> <!-- ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม--> <?= form_open('helloworld') ?> <input type="email" name="email" value="<?= set_value('email')?>"> <input type="password" name="password" value="<?= set_value('password')?>"> <button type="submit">Login</button> <?= form_close() ?>
เช็คทั้งก่อน และหลังส่งข้อมูลฟอร์ม
app/Controllers/Helloworld.php (บางส่วน)
if ($this->validate([ 'email' => 'required', 'password' => 'required', ]) && $this->request->getMethod() === 'post'){ }else{ $data['validation'] = $this->validator; }
รูปแบบคำสั่งข้างต้น จะทำการเช็ค validated ก่อน โดยเช็คการส่งข้อมูลทีหลัง นั่นคือ ถ้าเรา
เข้ามาหน้าฟอร์ม ก็จะขึ้นรายการแจ้งว่าเราต้องกรอกอะไร ประมาณไหน ตามตัวอย่างผลลัพธ์ด้านล่าง
และเมื่อเราลองกรอกข้อมูลเฉพาะส่วนของ email แล้วส่งข้อมูล การ validated ที่ทำงานก่อน
ยังไม่ผ่าน และ ยังทำหน้าที่ตรวจสอบส่วนของ password และแสดงผลลัพธ์ ตามรูป
และถ้าเรากรอกทั้ง email และ password แล้วส่งข้อมูล ก็ผ่านเงื่อนไขการ validated เราก็สามารถ
กำหนดการทำงานในขั้นตอนต่อไปใน เงื่อนไข if แรกได้เลย
เช็คหลังส่งข้อมูลฟอร์ม
กรณีนี้ จะไม่มีการขึ้นแจ้ง การ validated ใดๆ หากยังไม่กดส่งข้อมูล วิธีการใช้งานก็ง่ายๆ แค่สลับ
ตำแหน่งของการตรวจสอบการส่งข้อมูล ไว้ก่อนการเช็ค validated ดังนี้
app/Controllers/Helloworld.php (บางส่วน)
if ($this->request->getMethod() === 'post' && $this->validate([ 'email' => 'required', 'password' => 'required', ])){ }else{ $data['validation'] = $this->validator; }
คำสั่งการตรวจสอบข้อมูลทำงานก่อน และเมื่อยังไม่ส่งข้อมูล ก็เป็น false โดยยังไม่ได้ทำการเช็คเงื่อนไขการ
validated ทำให้ไม่มีการส่ง Validation instance เข้าไปในฟอร์ม หรือก็คือคำสั่ง $this->validate() ยังไม่ทำงาน
ผลลัพธ์ที่ได้ก็จะเป็นดังนี้
แต่ถ้าเราทำการกรอกข้อมูลเฉพาะ email แล้วกดส่ง คราวนี้คำสั่งเช็คการส่งข้อมูลเป็น true ก็คือมีการส่งข้อมูล
เมื่อเงื่อนไขแรกผ่าน ก็เช็คต่อที่เงื่อนไขที่สองคือการ validated ข้อมูล ทำให้คำสั่ง $this->validate() ถูกเรียก
ใช้งาน นั่นคือคำสั่งถูกเรียกใช้งานหลังส่งข้อมูลแล้ว และค่า Validation instance ก็ถูกส่งไปยังฟอรฺ์ม กรณีไม่ผ่าน
การ validated ข้อมูล ผลลัพธ์ เหมือนกับกรณีแรก ที่ส่งข้อมูล แล้วตรวจสอบไม่ผ่าน
ดังนั้นเราสามารถเลือกใช้รูปแบบที่อยากได้ ตามต้องการ
การกำหนด Template การแจ้งเตือน
อย่างที่ได้กล่าวไปแล้วข้างต้นว่า เมื่อเราใช้งานคำสั่ง $validation->listErrors() หรือ $validation->showError()
จะเป็นใช้งาน template ค่าเริ่มต้นของ CI เป็นโครงสร้าง HTML สำหรับแสดงการแจ้งเตือน การใช้งาน template เหมาะ
สำหรับการจัดการ การแจ้งเตือนที่ต้องการรูปแบบที่แน่นอน แสดงเหมือนกันๆ ในหลายๆ ฟอร์ม และสามารถปรับแต่ง
ที่เดียว มีผลกับทุกส่วนที่ใช้งาน
เราสามารถดู template และการกำหนดชื่อการใช้งาน เริ่มต้นได้ที่ไฟล์ app/Config/Validation.php ในส่วนของ
template ค่าเริ่มต้นก็จะประมาณนี้
app/Config/Validation.php (บางส่วน)
/** * Specifies the views that are used to display the * errors. * * @var array */ public $templates = [ 'list' => 'CodeIgniter\Validation\Views\list', 'single' => 'CodeIgniter\Validation\Views\single', ];
ไฟล์ list.php และ single.php ที่เป็นค่า default ของการแจ้งเตือน validation จะมีหน้าตาโครงสร้าง HTML ประมาณนี้
CodeIgniter/Validation/Views/list.php
<?php if (! empty($errors)) : ?> <div class="errors" role="alert"> <ul> <?php foreach ($errors as $error) : ?> <li><?= esc($error) ?></li> <?php endforeach ?> </ul> </div> <?php endif ?>
CodeIgniter/Validation/Views/single.php
<span class="help-block"><?= esc($error) ?></span>
ตัวแปรที่จะถูกส่งไปใช้งานใน Views ทั้งสองคือ $errors และ $error ตามลำดับ
ในการกำหนด template เอง เราสามารถใช้ชื่อ template เดิม ที่เป็นค่าหลักคือ list และ single โดยอาจ
จะเปลี่ยน path ของไฟล์ views ใหม่เป็นรูปแบบที่เราค้องการ ตัวอย่าง
public $templates = [ /* 'list' => 'CodeIgniter\Validation\Views\list', 'single' => 'CodeIgniter\Validation\Views\single',*/ 'list' => 'validations/list', 'single' => 'validations/single', 'my_list' => 'validations/my_error_list', ];
เราใช้ไฟล์ list.php ใน app/Views โดยสร้างไว้ในโฟลเดอร์ validations อึกที
app/Views/validations/list.php
<?php if (! empty($errors)) : ?> <div class="alert alert-danger" role="alert"> <ul> <?php foreach ($errors as $error) : ?> <li><?= esc($error) ?></li> <?php endforeach ?> </ul> </div> <?php endif ?>
app/Views/validations/single.php
<div class="invalid-feedback"> <?= esc($error) ?> </div>
หรือกรณีเราต้องการเพิ่มชื่อใหม่เข้าไป อย่างตัวอย่างด้านบน เป็น my_list เราก็สามารถกำหนดรูปแบบโครงสร้าง
HTML ไว้ในไฟล์ app/Views/validations/my_error_list.php เป็นต้น
รู้จักับ Rules แบบต่างๆ
เราได้รู้จักวิธีกำหนดเงื่อนไขการตรวจสอบ การกำหนดรูปแบบการแสดงไปแล้ว สิ่งสำคัญลำดับต่อไปก็คือ
มี rule อะไรบ้างให้เราเลือกใช้งาน
รายการต่อไปนี้เป็นหลักเกณฑ์ สำหรับการตรวจสอบข้อมูลของ CI ที่เราสามารถเรียกใช้งานได้
แต่ก่อนที่จะไปแต่ละค่าของ rule ให้เราเข้าใจรูปแบบการกำหนดเบื้องต้นก่อน ดังนี้ rule ที่ไม่มี parameter เราสามารถ
กำหนดชื่อ rule นั้นๆ ได้เลย ส่วน rule ที่มี parameter เราจะกำหนดค่า paramter ไว้ในเครื่องปีกกาสี่เหลี่ยนม [] เช่น
max_length[4] บาง rule รองรับ paramter ทั้งแบบจำเป็นต้องมี และแบบ options มีหรือไม่ก็ได้ ในกรณีสามารถกำหนด
ได้มากกว่า 1 parameter จะแยกกันโดยคั่นด้วยเเครื่องหมาย (comma) , เช่น in_list[aaa,b,cc]
ในการกำหนดค่า parameter ให้กับ rule จำไว้เสมอว่า จะต้องไม่มีช่องว่าง เช่น in_list[aaa, b,cc] แบบนี้ไม่ถูกต้อง
alpha
คำอธิบาย อักษรอังกฤษ a-zA-Z
ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphabetical characters.
ไม่มี parameter
alpha_space
คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ช่องว่าง space
ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphabetical characters and spaces.
ไม่มี parameter
alpha_dash
คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ เครือ่งหมาย - หรือ _
ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric, underscore, and dash characters.
ไม่มี parameter
alpha_numeric
คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9
ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric.
ไม่มี parameter
alpha_numeric_space
คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ ช่องว่าง space
ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric and space characters.
ไม่มี parameter
alpha_numeric_punct
คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ ช่องว่าง space หรือ เครื่องหมายเหล่านี้
~ (tilde), ! (exclamation), # (number), $ (dollar), % (percent),
& (ampersand), * (asterisk), - (dash), _ (underscore), + (plus), = (equals),
| (vertical bar), : (colon), . (period)
ข้อความแจ้ง The [ชื่อ Field'] field may contain only alphanumeric characters, spaces, and ~ ! # $ % &
* - _ + = | : . characters.
ไม่มี parameter
decimal
คำอธิบาย ตัวเลข 0-9 จำนวนเต็ม หรือเลขทศนิยม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain a decimal number.
ไม่มี parameter
differs
คำอธิบาย ต้องต่างจากค่าของฟิลด์ที่กำหนด
ข้อความแจ้ง The [ชื่อ Field'] field must differ from the [ชื่อ Field 2'] field.
มี parameter เช่น differs[date2]
exact_length
คำอธิบาย ต้องมีความยาวเท่ากับค่าที่กำหนด หากกำหนดหลายค่า แยกโดยใช้ (,)
ข้อความแจ้ง The [ชื่อ Field'] field must be exactly 3,5 characters in length.
มี parameter เช่น exact_length[3,5]
greater_than
คำอธิบาย เทียบเป็นตัวเลข ต้องมากกว่าค่าที่กำหนด เทียบเท่าเครื่องหมาย ( > )
ข้อความแจ้ง The [ชื่อ Field'] field must contain a number greater than 6.
มี parameter เช่น greater_than[6]
greater_than_equal_to
คำอธิบาย เทียบเป็นตัวเลข ต้องมากกว่าหรือเท่ากับค่าที่กำหนด เทียบเท่าเครื่องหมาย ( >= )
ข้อความแจ้ง The [ชื่อ Field'] field must contain a number greater than or equal to 6.
มี parameter เช่น greater_than_equal_to[6]
hex
คำอธิบาย เป็นตัวอักขระในตัวเลขฐาน 16
ข้อความแจ้ง The [ชื่อ Field'] field may only contain hexidecimal characters.
ไม่มี parameter
if_exist
คำอธิบาย ใช้สำหรับให้ตรวจสอบ rule ต่อเมื่อมีการส่งฟิลด์นั้นๆ มาก่อนเท่านั้น มักใช้ร่วมกับ rule อืนๆ
ไม่มี parameter
in_list
คำอธิบาย ต้องเท่ากับค่าใดค่าหนึ่ง ที่กำหนดในรายการเท่านั้น
ข้อความแจ้ง The [ชื่อ Field'] field must be one of: aaa,b,cc.
มี parameter เช่น in_list[aaa,บ้าน,ที่ทำงาน]
integer
คำอธิบาย ตัวเลขจำนวนเต็ม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain an integer.
ไม่มี parameter
is_natural
คำอธิบาย เฉพาะตัวเลขเท่านั้น ไม่มีเครื่องหมาย + หรือ -
ข้อความแจ้ง The [ชื่อ Field'] field must only contain digits.
ไม่มี parameter
is_natural_no_zero
คำอธิบาย เฉพาะตัวเลขเท่านั้น ไม่มีเครื่องหมาย + หรือ - และมากกว่า 0
ข้อความแจ้ง The [ชื่อ Field'] field must only contain digits and must be greater than zero.
ไม่มี parameter
is_not_unique
คำอธิบาย เช็คค่าจาก database ถ้ามีค่านั้นๆ อยู่ ต้องเป็นค่าเดียวกัน มักใช้สำหรับการแก้ไขข้อมูลของฟิลด์เดิม
ข้อความแจ้ง The [ชื่อ Field'] field must contain a previously existing value in the database.
มี parameter เช่น is_not_unique[table.field,where_field,where_value]
สามารถกำหนดเป็น is_not_unique[tbl_user.user_id,user_id,1]
is_unique
คำอธิบาย เช็คค่าจาก database ถ้ามีค่านั้นๆ อยู่ ต้องไม่ซ้ำกับค่าเดิม แต่สามารถกำหนดกรณียกเว้นเช่นการแก้ไขได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain a unique value.
มี parameter เช่น is_unique[table.field,ignore_field,ignore_value]
สามารถกำหนดเป็น is_unique[tbl_user.email] // email ต้องไม่ซ้ำในฐานข้อมูล
สามารถกำหนดเป็น is_unique[tbl_user.email,user_id,1] // email ต้องซ้ำได้ถ้าแก้ไขที่ user_id = 1
less_than
คำอธิบาย เทียบเป็นตัวเลข ต้องน้อยกว่าค่าที่กำหนด เทียบเท่าเครื่องหมาย ( < )
ข้อความแจ้ง The [ชื่อ Field'] field must contain a number less than 8.
มี parameter เช่น less_than[8]
less_than_equal_to
คำอธิบาย เทียบเป็นตัวเลข ต้องน้อยกว่าหรือเท่ากับค่าที่กำหนด เทียบเท่าเครื่องหมาย ( <= )
ข้อความแจ้ง The [ชื่อ Field'] field must contain a number less than or equal to 13.
มี parameter เช่น less_than_equal_to[13]
matches
คำอธิบาย ต้องมีค่าเท่ากับฟิลด์ที่กำหนด เช่น กรณีต้องการให้กรอกรหัสผ่านซ้ำ รหัสต้องเหมือนกัน
ข้อความแจ้ง The [ชื่อ Field'] field does not match the [ชื่อ Field 2'] field.
มี parameter เช่น matches[confirm_password]
max_length
คำอธิบาย ต้องมีความยาวไม่เกินค่าที่กำหนด
ข้อความแจ้ง The [ชื่อ Field'] field cannot exceed 8 characters in length.
มี parameter เช่น max_length[8]
min_length
คำอธิบาย ต้องมีความยาวไม่น้อยกว่าที่กำหนด
ข้อความแจ้ง The [ชื่อ Field'] field must be at least 6 characters in length.
มี parameter เช่น min_length[6]
numeric
คำอธิบาย ต้องเป็นต้วเลข หรือ เลขทศนิยม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain only numbers.
ไม่มี parameter
regex_match
คำอธิบาย ต้องเข้าเงื่อนไขรูปแบบของ regular expression ที่กำหนด
ข้อความแจ้ง The [ชื่อ Field'] field is not in the correct format.
มี parameter เช่น regex_match[/^[ก-๏\s]+$/u] ต้องเป็นภาษาไทย
permit_empty
คำอธิบาย มีการส่งค่านั้นหรือไม่ก็ได้ ไม่ใช้ร่วมกับ required หรือถ้ามีส่งค่า รองรับค่า
array ว่าง, string ว่าง, null หรือ false. ไม่มีแจ้งเตือน เหมาะกับใช้ปิดการแจ้งเตือน error
ไม่มี parameter
required
คำอธิบาย ต้องไม่เป็นค่า array ว่าง, string ว่าง, null หรือ false
ข้อความแจ้ง The [ชื่อ Field'] field is required.
ไม่มี parameter
required_with
คำอธิบาย เมื่อมีการส่งค่า ฟิลด์จะต้องไม่ว่าง ถ้าฟิลด์ที่กำหนดมีการส่งค่ามาด้วย
ข้อความแจ้ง The [ชื่อ Field'] field is required when [ชื่อ Field 2'] is present.
มี parameter เช่น required_with[password]
required_without
คำอธิบาย ถ้ายังไม่ส่งข้อมูล ฟิลด์จะต้องไม่ว่าง ถ้าฟิลด์ที่กำหนดไม่มีการส่งค่ามา
ข้อความแจ้ง The [ชื่อ Field'] field is required when [ชื่อ Field 2'] is not present.
มี parameter เช่น required_without[zipcde]
string
คำอธิบาย ตัวอักษร ตัวอักขระ สัญลักษณ์ ตัวเลข ทุกตัวถูกมองเป็น string หมด แต่ต้องไม่เป็นค่าว่าง
ข้อความแจ้ง The [ชื่อ Field'] field must be a valid string.
ไม่มี parameter
timezone
คำอธิบาย ต้องเป็นรูปแบบ timezone ที่อยู่ใน timezone_identifiers_list เช่น Asia/Bangkok
ข้อความแจ้ง The [ชื่อ Field'] field must be a valid timezone.
ไม่มี parameter
valid_base64
คำอธิบาย ต้องมีรูปแบบข้อความเป็น base64
ข้อความแจ้ง The [ชื่อ Field'] field must be a valid base64 string.
ไม่มี parameter
valid_json
คำอธิบาย ต้องมีรูปแบบข้อความเป็น JSON
ข้อความแจ้ง Validation.valid_json
ไม่มี parameter
valid_email
คำอธิบาย ต้องอยู่ในรูปแบบ email ที่ถูกต้อง
ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid email address.
ไม่มี parameter
valid_emails
คำอธิบาย ต้องอยู่ในรูปแบบ email ที่ถูกต้องทุกรายการ email ที่คั่นด้วย (,)
ข้อความแจ้ง The [ชื่อ Field'] field must contain all valid email addresses.
ไม่มี parameter
valid_ip
คำอธิบาย ต้องอยู่ในรูปแบบ IP address ที่ถูกต้อง หากระบุว่าเป็น IP4 หรือ IP6 ได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid IP.
ไม่มี parameter
valid_url
คำอธิบาย ต้องอยู่ในรูปแบบ URL ที่ถูกต้อง
ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid URL.
ไม่มี parameter
valid_date
คำอธิบาย ต้องอยู่ในรูปแบบวันที่ ที่ถูกต้อง สามารถระบุรูปแบบได้
ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid date.
ไม่มี parameter
valid_cc_number
คำอธิบาย ต้องอยู่ในรูปแบบ เลขบัตรเครดิต ที่ถูกต้อง โดยสามารถระบุตามผู้ออกบัตรได้
ข้อความแจ้ง Validation.valid_cc_number
มี parameter เช่น valid_cc_number[mastercard,visa,amex,jcb]
ค่าที่กำหนดได้ ใช้ค่าในวงเล็บ
American Express (amex), China Unionpay (unionpay),
Diners Club CarteBlance (carteblanche), Diners Club (dinersclub),
Discover Card (discover),Interpayment (interpayment), JCB (jcb),
Maestro (maestro), Dankort (dankort), NSPK MIR (mir),
Troy (troy), MasterCard (mastercard), Visa (visa), UATP (uatp), Verve (verve),
CIBC Convenience Card (cibc), Royal Bank of Canada Client Card (rbc),
TD Canada Trust Access Card (tdtrust), Scotiabank Scotia Card (scotia),
BMO ABM Card (bmoabm),HSBC Canada Card (hsbc)
Rule สำหรับการอัพโหลด
สำหรับการอัพโหลดไฟล์ เราก็มีรายการ rule ให้ใช้งาน ทำให้สะดวกในการนำไปใช้ สมมติว่าฟิลล์ข้อมูลฟอร์ม
เราแสดงประมาณนี้
<input type="file" name="avatar">
ตัวอย่างการกำหนด rule ใน Controller
$this->validate([ 'avatar' => 'uploaded[avatar]|max_size[avatar,1024]' ]);
มาดูแต่ละค่า พร้อมคำอธิบายและตัวอย่าง ดังนี้
uploaded
คำอธิบาย ต้องอัพโหลด ข้อมูลใน ฟิลด์ที่กำหนด
ข้อความแจ้ง avatar is not a valid uploaded file.
มี parameter เช่น uploaded[field_name] ตัวอย่าง uploaded[avatar]
max_size
คำอธิบาย ต้องมีขนาดของไฟล์ไม่เกินค่าที่กำหนด
ข้อความแจ้ง avatar is too large of a file.
มี parameter เช่น max_size[field_name,2048]
max_dims
คำอธิบาย ต้องเป็นรูปภาพ และขนาดความกว้างกับความสูง ต้องไม่เกินที่กำหนด
ข้อความแจ้ง avatar is either not an image, or it is too wide or tall.
มี parameter เช่น max_dims[field_name,300,150]
mime_in
คำอธิบาย ต้องเป็นไฟล์ที่มีค่า MIME type เป็นตามรายการค่าที่กำหนด
ข้อความแจ้ง avatar does not have a valid mime type.
มี parameter เช่น mime_in[field_name,image/png,image/jpg]
ext_in
คำอธิบาย ต้องมีนามสกุลไฟล์ตามรายการที่กำหนด
ข้อความแจ้ง avatar does not have a valid file extension.
มี parameter เช่น ext_in[field_name,png,jpg,gif]
is_image
คำอธิบาย อัพโหลดได้เฉพาะไฟล์รูปเท่านั้น เช็คจากค่า MIME type
ข้อความแจ้ง avatar is not a valid, uploaded image file.
มี parameter เช่น is_image[field_name] ตัวอย่าง is_image[avatar]
การกำหนด Validation Rule
รูปแบบ Array ของ Validation Rule
โดยทั่วไปแล้ว การกำหนด validation rule จะใช้เป็น array ข้อมูล โดยมี key เป็นชื่อฟิลด์ที่ตรงกับ name
ของ ฟิลด์ในฟอร์ม และ value เป็น รูปแบบ rule ที่ใช้งาน โดยคั่นแยกแต่ละ rule ด้วย | (pipe) อย่างเช่น rule
ในตัวอย่างเริ่มต้นเราก็จะเป็นประมาณนี้ สมมติเรากำหนดในตัวแปร $rules
$rules = [ 'email' => 'required', 'password' => 'required', ]; if(! $this->validate($rules)){ $data['validation'] = $this->validator; }
จะเห็นว่า แทนที่เราจะกำหนด array ของ rule ไว้ในคำสั่ง validate() โดยตรง เราก็ส่งเป็นตัวแปรเข้าไปแทน
โครงสร้าง array ของ rule ยังสามารถกำหนดแบบนี้ได้
$rules = [ 'email' => [ 'label' => 'Email', 'rules' => 'required', ], 'password' => [ 'label' => 'Password', 'rules' => 'required', ] ];
กรณีข้างบนนี้ ไว้ถ้าเราต้องการเปลี่บนชื่อที่แสดงตอนแจ้งเตือน ซึ่งปกติจะใช้ชื่อฟิลด์นั้นๆ แต่ถ้าเราต้องการเปลี่ยน
เป็นชื่อใหม่ ที่อาจจะดูเข้าใจกว่า ก็สามารถกำหนด label เพื่อเป็นค่าแสดงแทนได้
ในข้อความแจ้งเตือน error ที่ไม่ผ่านการตรวจสอบ ค่าเริ่มต้น จะเป็นภาษาอังกฤษ รูปแบบข้อความก็ตามที่อธิบายไป
ในแต่ละ rule ด้านบน แต่ถ้าเราอยากกำหนดรูปแบบข้อความเอง หรืออาจจะอยากใช้เป็นภาษาไทย ก็สามารถกำหนดเพิ่ม
ในส่วนของ errors ดังนี้ได้
$rules = [ 'email' => [ 'rules' => 'required|valid_email', 'errors' => [ 'required' => 'กรุณากรอกอีเมล', 'valid_email' => 'รูปแบบอีเมลไม่ถูกต้อง', ] ], 'password' => [ 'rules' => 'required', 'errors' => [ 'required' => 'กรุณากรอกรหัสผ่าน', ] ] ];
การกำหนดชื่อฟิลด์ กรณี key เป็น array
ปกติชื่อฟิลด์ข้อมูลที่ใช้เปฺ็น key ของ validation rule จะเป็นชื่อของฟิลด์ข้อมูลฟอร์ม เราสามารถเรียกใช้งาน
ได้เลย เว้นแต่ถ้าเป็นกรณีชื่อฟิลด์นั้นกำหนดมาในรูปแบบ array เช่น
<input type="text" name="hobby[]" value="" /> <input type="text" name="hobby[]" value="" />
เวลาเราอ้างอิงชื่อฟิลด์ เราจะใช้ hobby.0 กับ hobby.1 ถ้าต้องการระบุชัดๆ ว่าใช้เป็นตัวไหน
$rules = [ 'hobby.0' => 'required', 'hobby.1' => 'required', ];
เราสามารถกำหนดแยกกันชัดเจน ตามรูปแบบด้านบน หรือถ้าเราต้องการกำหนดแบบรวมกัน นั่นคือ โดยไม่แยกแต่
ละรูปแบบ ก็จะเครื่องหมาย * แทน key ใดๆ ก็ได้ ก็สามารถกำหนดเหลือเป็น
$rules = [ 'hobby.*' => 'required', ];
นอกจาก key ที่เป็นแบบ base zero key แล้ว name key ก็สามารถใช้ได้เหมือนกัน
<input type="text" name="address[home]" value="" /> <input type="text" name="address[work]" value="" />
ตัวอย่างการกำหนดก็จะประมาณนี้
$rules = [ 'address.home' => 'required', 'address.work' => 'required', ]; // หรือ $rules = [ 'address.*' => 'required', ];
การกำหนด Group Set ของ Rule ไว้ใช้งาน
เราสามารถกำหนดรูปแบบของ rule ไว้ในไฟล์ app/Config/Validation.php โดยกำหนดชื่อ set ของ rule
เป็น public property หนึ่งของ validation class สมมติเราเพิ่มตัวอย่าง แบบง่ายนี้เข้าไป
app/Config/Validation.php (บางส่วน)
//-------------------------------------------------------------------- // Rules //-------------------------------------------------------------------- public $login = [ 'email' => 'required', 'password' => 'required', ];
โดยแทนที่เราจะกำหนดไว้ในหน้าใดๆ หน้าหนึ่ง กรณีรูปแบบการตรวจสอบนั้นๆ อาจจะต้องใช้งานส่วนอื่นๆ หรือใช้งาน
หน้าอื่นด้วย เราก็มากำหนดไว้ในที่ๆ เดียว เวลาเรียกใช้งาน เราก็ใช้ชื่อ Group set กำหนดแทน array ของ Rule ตัวอย่าง
เช่น สามารถกำหนดเรียกใช้งานได้ดังนี้
if(! $this->validate('login')){ // กำหนดเป็น string ชื่อ group set ที่ต้องการใช้งาน $data['validation'] = $this->validator; }
เราสามารถเพิ่ม Group set ได้ตามต้องการในไฟล์ Validation.php
การกำหนด และใช้งาน Rule ผ่าน Validation instance
เราได้รู้แล้วว่า ใน Controller เราสามารถกำหนดและใช้งาน Validation ผ่านคำสั่ง $this->validate() และสามารถใช้งาน
Validation instance ของ Controller ผ่านคำสั่ง $this->validator
นอกจากวิธีที่ได้ไปทั้งหมดข้างต้นแล้ว ยังมีอีกวิธี ที่เราสามารถกำหนดและเรียกใช้งาน Validation Data ผ่าน Controller
หรือแม้แต่ class อื่นๆ นอกจาก Controller ได้ โดยใช้งานผ่าน Validation instance โดยตรง ดังนี้
app/Controllers/Helloworld.php
<?php namespace App\Controllers; use CodeIgniter\Controller; // เรียกใช้งาน Controller class class Helloworld extends Controller { public function index() { helper('form'); // ใช้งาน form helper ฟังก์ชั่น $data = [ 'title' => 'test validated data' ]; $validation = service('validation'); // Validation instance $validation->setRules([ 'email' => 'required', 'password' => 'required' ]); if ($validation->withRequest($this->request)->run()){ }else{ $data['validation'] = $validation; } echo view('pages/myform', $data); } }
วิธีข้างต้น เราใช้งานผ่าน Validation instance ทั้งการกำหนด rule ผ่านคำสั่ง setRules() และตรวจสอบเมื่อมี
การส่งข้อมูลด้วยคำสั่ง $validation->withRequest($this->request)->run() และถ้าไม่ผ่านการตรวจสอบ เราก็
ส่ง Validation instance เข้าไปในฟอร์ม วิธีนี้ให้ผลลัพธ์เหมือนกันกับ แต่เราสามารถกำหนดหรือใช้งานที่อื่น นอก
Controller ได้
คำสั่ง setRules() มีรูปแบบการกำหนด array เหมือนกันทุกอย่าง แต่ถ้าต้องการกำหนด ทีละฟิลด์ข้อมูล
สามารถใช้คำสั่ง setRule() แทน
$validation->setRule('email','Email','required'); $validation->setRule('password','Password','required');
ถ้าต้องการเช็คค่าบางค่า ที่ไม่ได้ส่งจากฟอร์ม สามารถใช้คำสั่ง check() ดังนี้ได้
$validation->check($value, 'required');
ค่าของตัวแปร $value จะถูกรวมเข้าไปในเงื่อนไขการตรวจสอบด้วย
เราสามารถดึงชื่อของ Rule Group set มาใช้งานด้วยคำสั่ง seRuleGroup()
$validation->setRuleGroup('login'); if ($validation->withRequest($this->request)->run()){ }else{ $data['validation'] = $validation; }
หรือจะใช้คำสั่ง getRuleGroup() ดึงข้อมูล Group set มาไว้ในตัวแปร แล้วเรียกใช้งานทีหลังก็ได้ ดังนี้
$rules = $validation->getRuleGroup('login'); $validation->setRules($rules); if ($validation->withRequest($this->request)->run()){ }else{ $data['validation'] = $validation; }
ข้อดีอย่างหนึ่งของการใช้งานผ่าน Validation instance คือเราสามารถเลือกข้อมูลใดๆ มาทำการตรวจสอบก็ได้
ไม่จำเป็นต้องเป็นข้อมูลที่ส่งฟอร์ม อย่างวิธีการข้างต้น ใช้การตรวจสอบข้อมูลที่มีการส่งเข้ามา ด้วยคำสั่ง
withRequest($this->request) แต่ถ้าเราต้องการตรวจสอบข้อมูลตัวแปรใดๆ ก็ใช้เพียงคำสั่ง $validation->run()
ดูตัวอย่าง กรณีใช้งานการตรวจสอบข้อมูลๆ หลายๆ ค่า เช่น ตรวจสอบรูปแบบอีเมล
$email_list = [ [ 'email'=>'aaa.com'], [ 'email'=>'aaa@aaa.com'], [ 'email'=>'aaa-com'], ]; foreach($email_list as $email){ $validation->reset(); $validation->setRules([ 'email'=>'valid_email' ]); if (!$validation->run($email)) { echo "Invalid<br>"; }else{ echo 'Valid<br>'; } }
การแทนค่าข้อมูลใน Rule
ในการใช้งานบาง rule เราอาจจะต้องส่งค่าข้อมูลไปใช้ในการตรวจสอบ เราเรียกตำแหน่ง ที่จะถูกแทนที่ด้วยข้อมล
ว่า Placeholder เหมือนเป็นตัวกันพื้นที่สำหรับใช้ข้อมูลที่ถูกส่งเข้ามาแทน ตัวอย่าง rule ที่อาจจะต้องมีการส่งข้อมูล
เช่น is_unique สมมติว่าข้อมูลตราง users มีฟิลด์ email ที่เราไม่ต้องการให้ซ้ำกัน ถ้าเป็นการเพิ่มข้อมูลใหม่ ดังนั้น
รูปแบบ rule ที่เราจะใช้ก็เป็น is_unique[users.email]
$validation->setRules([ 'email' => 'required|valid_email|is_unique[users.email]' ]);
ดังนั้นก่อนเพิ่มข้อมูล ก็จะมีการไปเช็คตาราง users ฟิลด์ email ว่าค่าอีเมล ที่ส่งไปนี้มีอยู่แล้วหรือใหม่ ถ้าไม่มีก็ทำ
สั่งอื่นๆ เช่นบันทึกลงไป
แต่กรณีปัญหาที่อาจจะเกิดก็คือ เมื่อเป็นการแก้ไขข้อมูล เวลาแก้ไขข้อมูล สมมติเราไม่แก้ไข email เวลาส่งเข้าไป
ตรวจสอบด้วย rule ข้างต้น ก็จะไม่ผ่าน เพราะว่ามี email นี้อยูแล้ว ดังนั้น เราจะต้องกำหนด option เพิ่มเติม คือ ถ้า
ฟิดล์ที่ระบุต่อไปนี้ มีค่าเท่ากับค่าที่กำหนด ให้สามารถ ละหรือข้ามเงื่อนไขไปได้ ก็จะเป็น
$validation->setRules([ 'email' => 'required|valid_email|is_unique[users.email,id,{id}]' ]);
จะเห็นว่า เราเปลี่ยนรูปแบบใหม่ is_unique[users.email,id,{id}] ให้รองรับการยกเว้นการตรวจสอบ กรณี id มีค่า
เท่ากับ {id} ส่วนนี้เรียกว่า placeholder ที่จะถูกแทนที่ด้วยข้อมูลที่ส่งมา เช่น ถ้าคนนั้นแก้ไขข้อมูล เขาก็จะมี id ถ้าเป็น
การแก้ไขข้อมูลที่ id ตรงกัน นั้นคือ เป็นการแก้ไขข้อมูลของคนๆ นั้น อีเมลซ้ำกันได้นั่นเอง
ถ้าสมมติว่าเราส่งค่า id เป็น 4 เข้าไป รูปแบบของ rule ก็จะเปลี่ยนอัตโนมัติตามค่าที่ส่งเข้าไปแทนที่ ก็จะเป็น
$validation->setRules([ 'email' => 'required|valid_email|is_unique[users.email,id,4]' ]);
วิธีนี้จึงมีประโยชน์สำหรับการแก้ไข ข้อมูลกรณีมีการตรวจสอบค่าใดๆ ว่าซ้ำหรือไม่
เนื้อหาเกี่ยวกับ การตรวจสอบความถูกต้องของข้อมูล เมื่อมีการส่งค่าจากฟอร์ม ก็มีรายละเอียดประมาณนี้ พยายาม
ให้ครอบคลุมการใช้งานต่างๆ และให้เข้าใจการนำไปใช้งาน ตามเหมาะสม หวังว่าจะเป็นประโยชน์ในการปรับใช้งานต่อไป