Co wysyła każde pole
Do PHP trafia tylko to, co przeglądarka wyśle. Różne pola zachowują się różnie, i to jest źródło większości błędów w formularzach.
| Pole | Co trafia do PHP | Jak to sprawdzić |
|---|---|---|
text, number, password, textarea | zawsze tekst, nawet gdy pole jest puste (wtedy pusty ciąg) | $x !== '' |
select | zawsze wybrana opcja (wartość z value) | porównaj z listą dozwolonych |
radio | tylko zaznaczony. Gdy nic nie zaznaczono, klucza w ogóle nie ma | isset($_POST['kolor']) |
checkbox | tylko zaznaczone. Niezaznaczone nie istnieją w tablicy | isset() albo !empty() |
submit z atrybutem name | tylko ten przycisk, który kliknięto | isset($_POST['nazwa_przycisku']) |
Praktyczny skutek: przy radio i checkboxie nie wolno pisać $_POST['kolor'] bez sprawdzenia. Gdy użytkownik niczego nie zaznaczy, dostaniesz ostrzeżenie o nieistniejącym kluczu. Dlatego w ćwiczeniu 13 pole radio ma atrybut required, a PHP i tak sprawdza je jeszcze raz.
Kilka checkboxów jako tablica
Gdy do nazwy pola dopiszesz nawiasy kwadratowe, PHP zbierze wszystkie zaznaczone pola do jednej tablicy:
<input type="checkbox" name="posilki[]" value="Obiad">
$_GET['posilki'] // np. ['Śniadanie', 'Obiad']
Trzy najczęstsze operacje na takiej tablicy:
implode(', ', $_GET['posilki']); // 'Śniadanie, Obiad' (tablica w jeden tekst)
count($_GET['posilki']); // 2 (ile zaznaczono)
foreach ($_GET['posilki'] as $p) { ... } // przejście po każdym elemencie W adresie zobaczysz coś takiego: ?posilki%5B%5D=Obiad&posilki%5B%5D=Kolacja. To znaki [ i ] zapisane w formie bezpiecznej dla adresu (%5B i %5D). PHP zamienia je z powrotem sam.
Dlaczego sprawdzać wartości z listą dozwolonych
Wartość pola da się zmienić w narzędziach przeglądarki albo wpisać ręcznie w adres. Ktoś może wysłać posilki[]=cokolwiek. Dlatego z tablicy bierzemy tylko to, co znamy:
$dozwolone = ['Śniadanie', 'Obiad', 'Kolacja']; $wybrane = array_intersect($dozwolone, $_GET['posilki'] ?? []);
Liczby z formularza
Wartość z formularza jest tekstem, także z pola type="number". Zanim policzysz, zamień ją na liczbę i sprawdź, czy ma sens:
$waga = (float)$_POST['waga']; // tekst na liczbę z ułamkiem
$wzrost = (float)$_POST['wzrost'];
if ($waga > 0 && $wzrost > 0) {
// dopiero tu wolno dzielić
} Trzy rzeczy, które regularnie psują kalkulatory:
Dzielenie przez zero. required nie pilnuje, czy liczba jest większa od zera. Wzrost 0 zabije skrypt. Zawsze sprawdź dzielnik.
Przecinek zamiast kropki. Pole type="number" wysyła kropkę. Gdyby to było zwykłe pole tekstowe, Polak wpisze 1,75. Wtedy użyj str_replace(',', '.', $x) przed rzutowaniem.
Absurdalne wartości. Waga 5000 kg przejdzie bez błędu. Sprawdzaj zakresy, np. $waga >= 20 && $waga <= 300.
Wynik zaokrąglasz dopiero na końcu: round($bmi, 1) daje jedno miejsce po przecinku.
Select i radio: wybór z gotowej listy
Oba pola oddają jedną wartość z listy, którą przygotowałeś. Dobry nawyk: trzymaj listę opcji w tablicy PHP i użyj jej dwa razy. Raz do wygenerowania pola, drugi raz do sprawdzenia odpowiedzi:
$owoce = ['Jabłko', 'Banan', 'Truskawka'];
foreach ($owoce as $o) {
echo "<option value='$o'>$o</option>";
}
if (in_array($_POST['owoc'], $owoce, true)) { ... } Wtedy dodanie nowego owocu to jedna zmiana w jednym miejscu. Tak działają prawdziwe formularze.
Kalkulator BMI
POSTFormularz z polami Waga (kg) i Wzrost (cm). Po wysłaniu oblicz BMI i wyświetl kategorię wagową.
Na własną rękę: Oblicz i wyświetl, jaka waga mieści się w normie (BMI od 18,5 do 24,9) dla podanego wzrostu. Wzór: BMI * wzrost * wzrost, wzrost w metrach.
Wypróbuj
BMI to orientacyjny wskaźnik, a nie diagnoza. U osób poniżej 18 lat ocenia się go inaczej (siatki centylowe), więc ten kalkulator jest tylko ćwiczeniem z PHP.
Kod do przepisania
<form method="post">
Waga (kg): <input type="number" name="waga" required><br>
Wzrost (cm): <input type="number" name="wzrost" required><br>
<input type="submit" name="oblicz_bmi" value="Oblicz BMI">
</form>
<?php
if (isset($_POST['oblicz_bmi'])) {
$waga = (float)$_POST['waga'];
$wzrost = (float)$_POST['wzrost'] / 100;
if ($waga > 0 && $wzrost > 0) {
$bmi = $waga / ($wzrost * $wzrost);
echo "Twoje BMI: " . round($bmi, 1);
if ($bmi < 18.5) echo " - Niedowaga";
elseif ($bmi < 25) echo " - Waga prawidłowa";
elseif ($bmi < 30) echo " - Nadwaga";
else echo " - Otyłość";
} else {
echo "Podaj poprawne wartości.";
}
}
?>Wybór posiłków
GETFormularz GET z checkboxami: Śniadanie, Obiad, Kolacja. Po wysłaniu pokaż wybrane posiłki.
Na własną rękę: Wyświetl też, ile posiłków zaznaczono (count()). Gdy zaznaczono wszystkie trzy, dopisz "Pełny dzień".
Wypróbuj
Kod do przepisania
<form method="get">
<input type="checkbox" name="posilki[]" value="Śniadanie"> Śniadanie<br>
<input type="checkbox" name="posilki[]" value="Obiad"> Obiad<br>
<input type="checkbox" name="posilki[]" value="Kolacja"> Kolacja<br>
<input type="submit" name="wybierz_posilki" value="Pokaż posiłki">
</form>
<?php
if (isset($_GET['wybierz_posilki'])) {
if (!empty($_GET['posilki'])) {
echo "Wybrane posiłki: " . htmlspecialchars(implode(", ", $_GET['posilki']));
} else {
echo "Nie wybrano żadnego posiłku";
}
}
?>Lista rozwijana i radio
POSTFormularz POST: użytkownik wybiera ulubiony owoc (lista rozwijana) i preferowany kolor (radio). Po wysłaniu wyświetl oba wybory.
Na własną rękę: Dodaj czwarty owoc i czwarty kolor tylko w tablicach na górze. Jeśli formularz jest generowany pętlą, nic więcej nie zmieniasz.
Wypróbuj
Kod do przepisania
<form method="post">
Wybierz owoc: <select name="owoc">
<option value="Jabłko">Jabłko</option>
<option value="Banan">Banan</option>
<option value="Truskawka">Truskawka</option>
</select><br>
Wybierz kolor:<br>
<input type="radio" name="kolor" value="Czerwony" required> Czerwony<br>
<input type="radio" name="kolor" value="Zielony"> Zielony<br>
<input type="radio" name="kolor" value="Niebieski"> Niebieski<br>
<input type="submit" name="wybierz_owoc_kolor" value="Wyślij">
</form>
<?php
if (isset($_POST['wybierz_owoc_kolor'])) {
$owoc = htmlspecialchars($_POST['owoc']);
$kolor = htmlspecialchars($_POST['kolor']);
echo "Twój ulubiony owoc: $owoc, kolor: $kolor";
}
?>