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