Obsługa formularza — odczyt i wyświetlanie danych

🎯 Po tej lekcji zbudujesz formularz kontaktowy, odczytasz dane metodą POST, sprawdzisz je przez isset i empty i bezpiecznie wyświetlisz wynik.

Wiesz już, jak działają GET i POST. Teraz czas zbudować prawdziwy formularz — taki, który przyjmuje dane, przetwarza je i wyświetla wynik. Zrobimy to krok po kroku.

Budowa formularza HTML

Formularz HTML to element <form> z polami i przyciskiem:

<form method="post" action="">
    <label>
        Imię:
        <input type="text" name="imie">
    </label>
    <label>
        E-mail:
        <input type="email" name="email">
    </label>
    <button type="submit" name="wyslij">Wyślij</button>
</form>

Kilka ważnych atrybutów:

  • method="post" — dane trafią do $_POST (nie do URL)
  • action="" — pusty action oznacza, że formularz wysyła do samego siebie (bieżący URL)
  • name="imie" — to klucz, pod którym PHP odbierze wartość pola

Wzorzec „formularz wysyła do samego siebie"

Najczęstszy wzorzec obsługi formularza w PHP: jeden plik obsługuje zarówno wyświetlanie formularza, jak i przetwarzanie danych po wysłaniu. Decydujemy o tym przez sprawdzenie, czy formularz był wysłany:

<?php
declare(strict_types=1);

$imie  = '';
$email = '';

if (isset($_POST['wyslij'])) {
    // Formularz został wysłany — odczytaj dane
    $imie  = $_POST['imie']  ?? '';
    $email = $_POST['email'] ?? '';
}
?>
<!DOCTYPE html>
<html lang="pl">
<head><meta charset="UTF-8"><title>Formularz kontaktowy</title></head>
<body>
    <form method="post" action="">
        <label>Imię: <input type="text" name="imie"
            value="<?= htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') ?>"></label>
        <label>E-mail: <input type="email" name="email"
            value="<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>"></label>
        <button type="submit" name="wyslij">Wyślij</button>
    </form>
</body>
</html>
💡 Dlaczego value z htmlspecialchars? Wstawiamy ostatnio wpisaną wartość z powrotem do pola formularza — żeby użytkownik nie musiał wypełniać go od nowa po błędzie. Ale musimy ją escapować, bo w atrybucie HTML cudzysłów " wpisany przez użytkownika mógłby rozbić atrybut.

Odczyt i sprawdzenie danych

isset($_POST['wyslij']) sprawdza, czy przycisk submit (z name="wyslij") jest w danych formularza — co oznacza, że formularz został wysłany. Gdy przeglądarka wysyła POST, PHP wypełnia $_POST.

Aby sprawdzić, czy pole jest puste, użyj porównania z pustym łańcuchem (po wcześniejszym trim):

<?php
declare(strict_types=1);

$imie  = '';
$email = '';
$blad  = '';
$sukces = false;

if (isset($_POST['wyslij'])) {
    $imie  = trim($_POST['imie']  ?? '');
    $email = trim($_POST['email'] ?? '');

    if ($imie === '') {
        $blad = 'Imię jest wymagane.';
    } elseif ($email === '') {
        $blad = 'E-mail jest wymagany.';
    } else {
        // dane wyglądają dobrze — tutaj wysłałbyś e-mail, zapisał do bazy itd.
        $sukces = true;
    }
}
?>
<!DOCTYPE html>
<html lang="pl">
<head><meta charset="UTF-8"><title>Formularz kontaktowy</title></head>
<body>

<?php if ($sukces): ?>
    <p>Dziękujemy, <?= htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') ?>! Skontaktujemy się na <?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>.</p>
<?php else: ?>
    <?php if ($blad !== ''): ?>
        <p style="color:red"><?= htmlspecialchars($blad, ENT_QUOTES, 'UTF-8') ?></p>
    <?php endif; ?>
    <form method="post" action="">
        <label>Imię:
            <input type="text" name="imie"
                   value="<?= htmlspecialchars($imie, ENT_QUOTES, 'UTF-8') ?>">
        </label>
        <label>E-mail:
            <input type="email" name="email"
                   value="<?= htmlspecialchars($email, ENT_QUOTES, 'UTF-8') ?>">
        </label>
        <button type="submit" name="wyslij">Wyślij</button>
    </form>
<?php endif; ?>

</body>
</html>
⚠️ empty() kontra sprawdzenie === '': Możesz użyć empty($imie) do sprawdzenia pustości, ale uważaj — empty zwraca true dla '', '0', 0, [], null i kilku innych wartości. Jeśli „0" jest poprawną wartością (np. kod pocztowy 00-001), lepiej sprawdzać === ''.

Pełny przepływ danych

Podsumujmy przepływ w wzorcu samoobsługowego formularza:

  1. Użytkownik wchodzi na stronę (GET) → PHP wyświetla pusty formularz
  2. Użytkownik wypełnia i wysyła (POST) → PHP odbiera dane z $_POST
  3. PHP sprawdza dane: błąd → formularz z komunikatem, sukces → potwierdzenie
  4. Wszystkie dane od użytkownika wyświetlane są przez htmlspecialchars

W kolejnej lekcji zajmiemy się głębszą walidacją — sprawdzaniem formatów (email, liczby) i sanityzacją danych wejściowych.

Funkcje w tej lekcji

Sprawdź się

Co sprawdza isset($_POST['wyslij'])?

Jaki atrybut znacznika <form> powoduje wysłanie danych metodą POST?

Po co używamy htmlspecialchars przy ponownym wyświetlaniu wartości pola formularza?

Ćwiczenie

Napisz formularz z jednym polem tekstowym 'miasto' i przyciskiem 'Sprawdź pogodę'. Formularz wysyła do samego siebie (method post). Gdy formularz zostanie wysłany i pole nie jest puste, wyświetl: 'Sprawdzam pogodę dla: [miasto]'. Pamiętaj o htmlspecialchars!

Pokaż rozwiązanie
<?php
declare(strict_types=1);

$miasto = '';
$wynik  = '';

if (isset($_POST['wyslij'])) {
    $miasto = trim($_POST['miasto'] ?? '');
    if ($miasto !== '') {
        $wynik = 'Sprawdzam pogodę dla: ' . htmlspecialchars($miasto, ENT_QUOTES, 'UTF-8');
    } else {
        $wynik = 'Wpisz nazwę miasta.';
    }
}
?>
<!DOCTYPE html>
<html lang="pl">
<head><meta charset="UTF-8"><title>Pogoda</title></head>
<body>
<?php if ($wynik !== ''): ?>
    <p><?= $wynik ?></p>
<?php endif; ?>
<form method="post" action="">
    <label>Miasto: <input type="text" name="miasto" value="<?= htmlspecialchars($miasto, ENT_QUOTES, 'UTF-8') ?>"></label>
    <button type="submit" name="wyslij">Sprawdź pogodę</button>
</form>
</body>
</html>