Lekcja 8. Walidacja danych z formularza w PHP
ŚredniPo co się tego uczymy?
Baza danych nie powinna nigdy dostać śmieciowych danych — pustego e-maila, hasła o długości 2 znaków, tekstu tam, gdzie miała być liczba. Walidacja to Twoja pierwsza linia obrony, zanim cokolwiek trafi dalej do bazy (Lekcja 9 i kolejne).
Teoria
Użytkownicy popełniają błędy — zostawiają puste pola, wpisują litery tam, gdzie oczekujesz liczby, albo próbują wpisać złośliwy kod. Walidacja to sprawdzanie, czy dane z formularza mają sens, ZANIM zaczniesz ich używać (np. zapisywać do bazy danych).
Najważniejsze funkcje do walidacji w PHP:
empty($zmienna) — sprawdza, czy zmienna jest pusta (pusty string, 0, null, brak wartości).
is_numeric($zmienna) — czy wartość jest liczbą.
filter_var($email, FILTER_VALIDATE_EMAIL) — czy tekst wygląda jak poprawny adres e-mail.
strlen($tekst) — długość tekstu (np. sprawdzenie minimalnej długości hasła).
Osobna, bardzo ważna sprawa: gdy WYŚWIETLASZ dane wpisane przez użytkownika z powrotem na stronie, zawsze przepuszczaj je przez htmlspecialchars() — to zamienia znaki specjalne HTML (jak < i >) na ich bezpieczne odpowiedniki, żeby ktoś nie mógł wstrzyknąć własnego kodu HTML/JavaScript na Twoją stronę (to wstęp do bezpieczeństwa, które rozwiniemy w Lekcji 19).
Przykład z życia
Kiedy rejestrujesz się na stronie i wpiszesz hasło "1234", strona natychmiast (bez przeładowania albo po wysłaniu formularza) informuje Cię, że hasło jest za krótkie — to właśnie walidacja w akcji, często robiona i po stronie przeglądarki (JavaScript/HTML5), i po stronie serwera (PHP) naraz.
Kod (PHP)
<?php
if (isset($_POST["email"]) && isset($_POST["haslo"])) {
$email = $_POST["email"];
$haslo = $_POST["haslo"];
$bledy = [];
if (empty($email)) {
$bledy[] = "Adres e-mail jest wymagany.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$bledy[] = "Adres e-mail jest nieprawidłowy.";
}
if (empty($haslo)) {
$bledy[] = "Hasło jest wymagane.";
} elseif (strlen($haslo) < 8) {
$bledy[] = "Hasło musi mieć co najmniej 8 znaków.";
}
if (count($bledy) === ) {
echo "Dane poprawne, można kontynuować rejestrację.";
} else {
foreach ($bledy as $blad) {
echo "<p style='color:red;'>" . htmlspecialchars($blad) . "</p>";
}
}
}
Komentarz i wyjaśnienie kodu
Tablica $bledy zbiera WSZYSTKIE napotkane problemy naraz, zamiast pokazywać tylko pierwszy z nich — dzięki temu użytkownik widzi od razu całą listę rzeczy do poprawienia. filter_var($email, FILTER_VALIDATE_EMAIL) to wbudowana w PHP funkcja sprawdzająca, czy tekst ma poprawny kształt adresu e-mail (coś@coś.coś) — nie sprawdza, czy taki e-mail naprawdę istnieje, tylko czy jest poprawnie zapisany. htmlspecialchars() przy wypisywaniu komunikatu błędu to nawyk bezpieczeństwa — nawet jeśli treść błędu pochodzi z Twojego kodu, warto się przyzwyczaić do stosowania go zawsze przy wypisywaniu czegokolwiek, co mogło pochodzić od użytkownika.
Ćwiczenie samodzielne
Dodaj do walidacji trzecie pole "powtórz hasło" i sprawdź, czy jest identyczne z polem "hasło".
Zadania do pracy własnej
Napisz walidację formularza z jednym polem "wiek" — sprawdź, czy pole nie jest puste i czy zawiera liczbę (is_numeric).
Napisz walidację formularza dodawania filmu: tytuł (niepusty, min. 2 znaki), rok produkcji (liczba z zakresu 1900-2030), ocena (liczba z zakresu 1-10) — zbierz wszystkie błędy do tablicy i wypisz je.
Napisz kompletną walidację formularza rejestracji: imię (niepuste), e-mail (poprawny format), hasło (min. 8 znaków, zawiera przynajmniej jedną cyfrę — podpowiedź: preg_match), powtórz hasło (zgodne z hasłem). Wypisz listę błędów albo komunikat sukcesu.
Typowe błędy
Częsty błąd to sprawdzanie tylko empty() bez sprawdzenia poprawności FORMATU danych (np. zaakceptowanie "abc" jako wieku). Drugi błąd: walidacja TYLKO po stronie przeglądarki (HTML5/JavaScript) bez powtórzenia jej w PHP — użytkownik może wyłączyć JavaScript albo wysłać dane z pominięciem formularza, więc walidacja po stronie serwera jest obowiązkowa. Trzeci: wyświetlanie danych z formularza z powrotem na stronie bez htmlspecialchars(), co otwiera furtkę na ataki typu XSS.
Nawiązanie do egzaminu zawodowego
To realizacja efektu INF.03.5.3.5 ("wykorzystuje mechanizmy walidacji formularzy HTML za pomocą mechanizmów HTML5") oraz części 03.5.6 ("przeprowadza walidację kodu programu") — walidacja danych wejściowych to też pierwszy krok do bezpieczeństwa aplikacji, który rozwiniemy w Lekcji 19.