Walidacja formularza w PHP

Mateusz Bogolubow

Mateusz Bogolubow

24-09-2026

(aktualizacja: 24-09-2026)

Jak poprawnie zwalidować dane z formularza w PHP — dlaczego walidacja w JavaScript nie wystarczy i jak bezpiecznie zapisać zwalidowane dane do bazy danych.

Walidacja formularza w PHP
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.

Konsultacja i warsztaty devmentor.pl

Masz pytania?