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