Skip to main content

Filtrowanie i walidacja danych formularzy

Walidacja jak i obsługa formularzy w PHP zawsze były dla mnie horrorem.
Jest to jedna z tych rzeczy, których po prostu nie cierpię i które zabierają mi dużo czasu.

W dzisiejszym wpisie opiszę sposób walidacji i filtrowania danych za pomocą funkcji filter_input_array().

Przykładowy formularz

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  Imię: <input type="text" name="FirstName">
  Wiek: <input type="text" name="Age">
  Email: <input type="text" name="Email">
  Telefon (opcja): <input type="text" name="Phone">

  <input type="submit">
</form>

Definicja filtrów

$filters = array(

  // Filtrowanie bez walidacji
  'FirstName' => array(
    'filter' => FILTER_SANITIZE_STRING,      //usuwa kod html, koduje bądź usuwa niepożądane znaki
    'flags' => FILTER_FLAG_NO_ENCODE_QUOTES  //pozostawia znaki apostrofów i cudzysłowia
  ),

  // Walidacja z zadeklarowanym zakresem
  'Age' => array(
    'filter' => FILTER_VALIDATE_INT,
    'options' => array('min_range' => 1, 'max_range' => 120)
  ),

  // Walidacja E-mail
  'Email' => array(
    'filter' => FILTER_VALIDATE_EMAIL,
  ),

  // Walidacja telefonu, jeśli został podany
  'Phone' => array(
    'filter' => FILTER_VALIDATE_REGEXP,
    'options' => array('regexp' => '/^([0-9]{9})?$/')
  ),

);

Funkcja walidująca

function validate(&$data, &$filters, &$errors = array()) {
  $data = filter_input_array(INPUT_POST, $filters);

  foreach($data as $key => $val) {
    if ($val === false || $val === null) {
      $errors[] = $key;
    }
  }

  return empty($errors);
}

Sprawdzenie danych

if (validate($data, $filters, $errors)) {
  // OK
  var_dump($data);
} else {
  // Błąd
  var_dump($data);
  var_dump($errors);
}

Zrzut zmiennej $data w przypadku sukcesu

array(4) {
  'FirstName' =>
  string(3) "Jan"
  'Age' =>
  int(20)
  'Email' =>
  string(15) "jan@example.com"
  'Phone' =>
  string(0) ""
}

Zrzut zmiennych $data i $errors w przypadku błędu

array(4) {
  'FirstName' =>
  string(0) ""
  'Age' =>
  bool(false)
  'Email' =>
  bool(false)
  'Phone' =>
  string(0) ""
}

array(2) {
  [0] =>
  string(3) "Age"
  [1] =>
  string(5) "Email"
}

W przypadku błędu, pole zmiennej $data zwraca wartość False (błąd walidacji), lub Null (niezdefiniowana zmienna, np. nieistniejące pole formularza).

Nasz formularz można i nawet należy rozbudować dodatkowo o walidację po stronie klienta, ale bez użycia kodu JavaScript, który można bez problemu wyłączyć, a korzystając z dobrodziejstw HTML5.

Poprawiony formularz

<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  Imię: <input type="text" name="FirstName" maxlength="45">
  Wiek: <input type="number" name="Age" maxlength="3" min="1" max="120" required>
  Email: <input type="email" name="Email" maxlength="45" required>
  Telefon (opcja): <input type="text" name="Phone" maxlength="9" pattern="[0-9]{9}">

  <input type="submit">
</form>

Podsumowanie

Jest to tylko niewielki wycinek możliwości, jakie daje filtrowanie danych w PHP.
Po więcej informacji zapraszam na oficjalną stronę dokumentacji PHP.

Poniżej kilka funkcji, z którymi powinieneś się zapoznać:

  • filter_has_var
  • filter_id
  • filter_input_array
  • filter_input
  • filter_list
  • filter_var_array
  • filter_var

markac

Full-stack Web Developer

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.