Walidacja formularza w PHP polega na sprawdzeniu danych z $_POST/$_GET zawsze po stronie serwera — nigdy nie polegaj wyłącznie na walidacji w JavaScripcie, bo można ją łatwo ominąć. Używa się do tego m.in. funkcji filter_var() oraz sprawdzania wymaganych pól i ich długości, a przy zapisie zwalidowanych danych do bazy — przygotowanych zapytań (prepared statements), które chronią przed SQL Injection. Dopiero taka walidacja realnie zabezpiecza Twoją aplikację.
Dlaczego walidacja po stronie serwera jest obowiązkowa
Formularz w HTML można zwalidować po stronie przeglądarki za pomocą JavaScriptu — ale to tylko pierwsza linia obrony, nie jedyna. Jeśli Twoja aplikacja ma być bezpieczna, walidacja w PHP, po stronie serwera, jest obowiązkowa — niezależnie od tego, jak dokładnie sprawdziłeś dane wcześniej w przeglądarce.
Dlaczego walidacja w JavaScript nie wystarczy?
To jedna z najczęstszych wątpliwości osób uczących się backendu: skoro formularz już waliduję w JavaScripcie, po co robić to jeszcze raz w PHP? Odpowiedź jest prosta — walidację w przeglądarce można całkowicie ominąć. Wystarczy, że ktoś wyłączy JavaScript, użyje narzędzi deweloperskich, albo wyśle zapytanie bezpośrednio do Twojego serwera (np. przez curl albo Postmana), zupełnie pomijając Twój formularz i jego walidację w JS.
Dlatego przyjmij prostą zasadę: walidacja w JavaScript to wygoda dla użytkownika (natychmiastowy feedback bez przeładowania strony), a walidacja w PHP to bezpieczeństwo Twojej aplikacji. Potrzebujesz obu, ale tylko ta druga faktycznie Cię chroni — serwer nigdy nie powinien ufać danym przychodzącym z zewnątrz, nawet jeśli teoretycznie "powinny" być już poprawne.
Jak pobrać i oczyścić dane z formularza w PHP?
Dane z formularza wysłanego metodą POST trafiają do superglobalnej tablicy $_POST. Zanim zaczniesz je sprawdzać, warto je najpierw oczyścić z białych znaków na początku/końcu:
<?php
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
Operator ?? (null coalescing) zabezpiecza Cię przed błędem, gdyby dane pole w ogóle nie zostało wysłane — bez niego PHP zgłosiłoby ostrzeżenie o nieistniejącym kluczu w tablicy.
Walidacja poszczególnych pól
Do walidacji konkretnych typów danych PHP ma wbudowaną funkcję filter_var(), która sprawdzi za Ciebie m.in. poprawność adresu e-mail:
<?php
$errors = [];
if (strlen($username) < 3) {
$errors['username'] = 'Nazwa użytkownika musi mieć co najmniej 3 znaki.';
}
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$errors['email'] = 'Podaj poprawny adres e-mail.';
}
Zamiast ciągu wielu if/else if dla każdego pola z osobna, warto od razu przyzwyczaić się do zapisywania reguł walidacji w jednej, czytelnej strukturze (np. tablicy pól z ich regułami) — dzięki temu dodanie kolejnego pola formularza to dopisanie jednego wpisu, a nie kolejnego bloku if.
Jak wyświetlić błędy bez utraty wpisanych danych?
Nic tak nie irytuje użytkownika, jak formularz, który po błędzie czyści wszystkie wcześniej wpisane dane. Rozwiązanie jest proste — skoro dane trafiły już do zmiennych PHP, wystarczy wypisać je z powrotem jako wartości pól formularza:
<input type="text" name="username" value="<?= htmlspecialchars($username) ?>" />
<?php if (isset($errors['username'])): ?>
<span class="error"><?= htmlspecialchars($errors['username']) ?></span>
<?php endif; ?>
Zwróć uwagę na htmlspecialchars() — to nie jest opcjonalny dodatek. Bez niego, jeśli ktoś wpisze w formularzu fragment kodu HTML/JavaScript, zostanie on wyświetlony (i wykonany) na Twojej stronie zamiast zwykłego tekstu — to podstawowa ochrona przed atakiem XSS.
Bezpieczny zapis zwalidowanych danych do bazy
Sama walidacja to nie koniec — dane, nawet już zwalidowane, wciąż trzeba bezpiecznie zapisać do bazy danych. Nigdy nie wklejaj wartości bezpośrednio do zapytania SQL jako tekstu — zamiast tego użyj przygotowanych zapytań (prepared statements):
<?php
$stmt = $pdo->prepare('INSERT INTO users (username, email) VALUES (:username, :email)');
$stmt->execute([
'username' => $username,
'email' => $email,
]);
Prepared statements chronią Cię przed atakiem SQL Injection niezależnie od tego, jak dokładna była wcześniejsza walidacja — baza danych sama odróżnia dane od kodu zapytania, więc nawet jeśli coś przeoczysz na etapie walidacji, ten mechanizm wciąż Cię zabezpiecza.
Zacznij naukę PHP z mentorem
Jeśli chcesz nauczyć się nie tylko walidacji formularzy, ale całego backendu w PHP — od podstaw, przez dynamiczne aplikacje webowe, po sesje i autoryzację — sprawdź program ścieżki PHP w devmentor.pl albo umów rozmowę, żeby porozmawiać o mentoringu 1:1.


