Ngu ngơ học làm web (85) - Filter và validate trong PHP

Tiếp theo của: Ngu ngơ học làm web (84) - Bài tập upload tập tin
-----

Phần 85.       Filter và validate trong PHP


Đây là clip số 96:


Filter và validate được sử dụng để kiểm tra dữ liệu trước khi thao tác với nó.

- Validate: xác nhận, kiểm tra xem dữ liệu có đáp ứng các yêu cầu đã đặt ra hay không?

- Filter: dùng để lọc các dữ liệu đưa vào không phù hợp với yêu cầu và trả về một kết quả đúng với yêu cầu.

Sử dụng hàm filter_var($variable, $filter, $options) để kiểm tra biến $variable với các điều kiện đưa vào, biến $filter thường mang các giá trị:

- FILTER_VALIDATE_BOOLEAN
- FILTER_VALIDATE_EMAIL
- FILTER_VALIDATE_FLOAT
- FILTER_VALIDATE_IP
- FILTER_VALIDATE_URL

Ví dụ,

$x = 'a.gmail.com';

  if(filter_var($x, FILTER_VALIDATE_EMAIL)){
    echo 'là email';
  }else {
    echo 'không là email';
}

Ví dụ, kiểm tra là số nguyên, và có giá trị nằm trong một miền giá trị.

<?php
  $x = 11;

  $int_options = array('options' => array('min_range' => 4, 'max_range' => 10));
  if(filter_var($x, FILTER_VALIDATE_INT, $int_options)){
    echo 'thỏa điều kiện';
  }else {
    echo 'không thỏa điều kiện';
  }
?>

Để tự định nghĩa và gọi hàm trong PHP filter, sử dụng cú pháp sau:
filter_var($variable, $FILTER_CALLBACK, array(‘options’ => ‘myFunc’));

Trong đó, myFunc là hàm tự định nghĩa.

Ví dụ, chức năng filter,

<?php
  $variable = 'Nguyen Van Teo';

  function convertString($string) {
    $string = str_replace(' ', '_', $string);
    return $string;
  }

  echo filter_var($variable, FILTER_CALLBACK, array('options' => 'convertString'));
?>

Ví dụ, chức năng validate,

<?php
  $number = 3;

  function checkNumber($number) {
    $flag = false;
    if($number % 2 == 0) {
      $flag = true;
    }
    return $flag;
  }

  if (filter_var($number, FILTER_CALLBACK, array('options' => 'checkNumber'))) {
    echo 'là số chẵn';
  }else {
    echo 'là số lẻ';
  }
?>

Đây là clip số 97:


Sử dụng hàm filter_var($variable, FILTER_VALIDATE_REGEXP, $options) kết hợp với biểu thức chính quy.

Ví dụ, kiểm tra số điện thoại,

<?php
  $value = '084-05-12.345678';
  $options = array(
              'options' => array('regexp' => '#^084-[0-9]{2}-[0-9]{2}\.[0-9]{6}$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Đoạn mã kiểm tra phần mở rộng của một tập tin,

<?php
  $value = 'teo.png';
  $options = array(
              'options' => array('regexp' => '#\.(jpg|png|gif)$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Đoạn mã sau dùng để kiểm tra giá trị nhập vào chỉ chứa chữ và số,

<?php
  $value = 'teopng';
  $options = array(
              'options' => array('regexp' => '#^[a-zA-Z0-9]+$#')
            );
  if (filter_var($value, FILTER_VALIDATE_REGEXP, $options)) {
    echo $value.' thỏa mãn';
  }else {
    echo $value.' chưa thỏa mãn';
  }
?>

Sử dụng hàm filter_var_array() để kiểm tra, lọc cùng lúc nhiều giá trị, ví dụ,

<?php
  $data = array(
                  'name'  => 'nguyen van teo',
                  'age'   => '13',
                  'email' => 'nvt@gmail.com'
            );
  $filters = array(
                  'name' => array(
                                  'filter' => FILTER_CALLBACK,
                                  'options' => 'ucwords'
                              ),
                  'age' => array(
                                  'filter' => FILTER_VALIDATE_INT,
                                  'options' => array('min_range' => 1, 'max_range' => 100)
                              ),
                  'email' => array(
                                  'filter' => FILTER_VALIDATE_EMAIL
                              ),
              );
  $result = filter_var_array($data, $filters);
  echo '<pre>';
  print_r($result);
  echo '</pre>';
?>

Hàm filter_input(input_type, variable, filter, options) được sử dụng để kiểm tra các giá trị từ FORM. Chức năng này cũng có thể lấy được dữ liệu từ các trường hợp khác như $_GET, $_POST, $_COOKIE, $_ENV, $_SERVER.

- input_type: kiểu lấy dữ liệu (INPUT_GET, INPUT_POST, INPUT_COOKIE,…)

- variable: tên của phần tử muốn lấy dữ liệu

- filter: kiểu filter

- options: mảng tham số.

Ví dụ,

[index.php]

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Filter</title>
</head>
<body>
<form action="filter.php" method="post" name="mainForm">
  <input type="text" name="email">
  <input type="submit" value="Submit">
</form>
</body>
</html>

[filter.php]

<?php
            echo '<pre>';
            print_r($_POST);
            echo '</pre>';
            if(!filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL)) {
                        echo 'Email không hợp lệ';
            }else {
                        echo 'Email hợp lệ';
            }
?>

Hàm filter_input_array() cho phép validate và filter cùng lúc trên nhiều giá trị.

Ví dụ,

[index.php]

<form action="filter.php" method="post" name="mainForm">
  Email:<input type="text" name="email">
  Age:<input type="text" name="age">
  Name:<input type="text" name="name">
  <input type="submit" value="Submit">
</form>

[filter.php]

<?php
            $filters = array(
                                                            'name' => array(
                                  'filter' => FILTER_CALLBACK,
                                  'options' => 'ucwords'
                              ),
                        'age' => array(
                                  'filter' => FILTER_VALIDATE_INT,
                                  'options' => array('min_range' => 1, 'max_range' => 100)
                              ),
                        'email' => array(
                                  'filter' => FILTER_VALIDATE_EMAIL
                              ),

                                                );
            $result = filter_input_array(INPUT_POST, $filters);
            echo '<pre>';
            print_r($result);
            echo '</pre>';

?>
-----------
Cập nhật [16/9/2020]
-----------
Xem thêm: