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>
" 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($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:
- Użytkownik wchodzi na stronę (GET) → PHP wyświetla pusty formularz
- Użytkownik wypełnia i wysyła (POST) → PHP odbiera dane z
$_POST - PHP sprawdza dane: błąd → formularz z komunikatem, sukces → potwierdzenie
- 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'])?
isset sprawdza istnienie klucza i to, czy wartość nie jest null. Nie sprawdza, czy wartość jest prawdziwa ani czy nie jest pusta — do tego służy empty lub porównanie z ''.
Jaki atrybut znacznika <form> powoduje wysłanie danych metodą POST?
Atrybut method="post" informuje przeglądarkę, żeby wysłała dane formularza w treści żądania HTTP (nie w URL). action określa adres docelowy skryptu.
Po co używamy htmlspecialchars przy ponownym wyświetlaniu wartości pola formularza?
Użytkownik mógł wpisać <script>...</script> jako wartość pola. Bez htmlspecialchars przeglądarka wykonałaby ten skrypt. htmlspecialchars zamienia < > & " ' na bezpieczne encje HTML.
Ć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>