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.

PoleCo trafia do PHPJak to sprawdzić
text, number, password, textareazawsze tekst, nawet gdy pole jest puste (wtedy pusty ciąg)$x !== ''
selectzawsze wybrana opcja (wartość z value)porównaj z listą dozwolonych
radiotylko zaznaczony. Gdy nic nie zaznaczono, klucza w ogóle nie maisset($_POST['kolor'])
checkboxtylko zaznaczone. Niezaznaczone nie istnieją w tablicyisset() albo !empty()
submit z atrybutem nametylko ten przycisk, który klikniętoisset($_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.

11

Kalkulator BMI

POST

Formularz 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.";
    }
}
?>
12

Wybór posiłków

GET

Formularz 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";
    }
}
?>
13

Lista rozwijana i radio

POST

Formularz 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

Wybierz kolor

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";
}
?>