Formularze HTML w kwalifikacji INF.03: najważniejsze zasady, przykłady i 66 powiązanych pytań w banku.
Formularz to podstawowy sposób, w jaki przeglądarka sama, bez dodatkowego skryptu, przekazuje dane użytkownika na serwer. To, co dotrze do skryptu PHP, wynika z trzech decyzji zapisanych w HTML: dokąd wysłać (action), jaką metodą (method) i pod jaką nazwą (name). Kto czyta formularz w tej kolejności, potrafi wypisać zawartość tablicy $_POST z samego kodu strony. Typy pól i walidacja HTML5 są nadbudową nad tym mechanizmem, a nie jego zamiennikiem.
Znacznik form, action i method
<form action="zapisz.php" method="post">
<input type="text" name="email">
<button>Wyślij</button>
</form>
Pominięty lub pusty action kieruje dane pod adres bieżącej strony. Wysyłkę uruchamiają dwa zapisy, bo domyślnym typem przycisku w formularzu jest submit:
<input type="submit" value="Wyślij">
<button>Wyślij</button>
W formularzu z jednym polem tekstowym wystarczy Enter. Bez atrybutu method przeglądarka użyje GET, więc hasło z formularza logowania trafiłoby do widocznego adresu.
Na serwer idą tylko pola z atrybutem name, które nie są wyłączone przez disabled. Pole z readonly jest wysyłane normalnie. Atrybut name samego znacznika form nie jest wysyłany.
GET kontra POST w praktyce
gdzie dane
w adresie, po ?, pary łączone &
w ciele żądania
widoczność
pasek adresu, historia, logi
niewidoczne w adresie
limit długości
długość adresu
ustawienie serwera (post_max_size)
zastosowanie
wyszukiwanie, filtry, stronicowanie
logowanie, zapis, usuwanie, pliki
Metoda GET wkłada pary do adresu, więc wynik widać w pasku przeglądarki:
<form action="szukaj.php" method="get">
<input name="q">
<input name="sort">
-> szukaj.php?q=router&sort=cena (PHP odczyta to z $_GET)
Odświeżenie strony po wysyłce POST wywołuje pytanie o ponowne przesłanie danych, dlatego po zapisie stosuje się przekierowanie.
Atrybut name jako klucz przesyłanych danych
Nazwa pola jest kluczem w tablicy na serwerze:
<input type="text" name="email"> <!-- HTML -->
$_POST['email'] // PHP, przy method="post"
Atrybut id służy stylom, skryptom i etykiecie, na serwer nie trafia, a pole bez name jest pomijane.
Pola wielokrotnego wyboru mają własne zasady:
<input type="radio" name="plec" value="k">
<input type="radio" name="plec" value="m">
<!-- wspolny name = wybor jest JEDEN, rozny value = wiadomo ktory -->
<input type="checkbox" name="zgoda">
<!-- niezaznaczony NIE WYSYLA NICZEGO: w PHP sprawdzaj isset(), -->
<!-- a nie porownanie do pustego tekstu; bez value przekaze "on" -->
<input type="checkbox" name="opcje[]" value="a">
<input type="checkbox" name="opcje[]" value="b">
<!-- nawiasy kwadratowe: PHP odbierze to jako tablice -->
Typy pola input i to, co naprawdę dają
Atrybut type zmienia klawiaturę na telefonie, wygląd pola i wbudowane sprawdzenie, ale nie chroni danych.
password
zasłania znaki kropkami
przesyła je jak zwykły tekst; poufność daje HTTPS
number
współpracuje z min, max, step
starsza przeglądarka potraktuje jak text
email
sprawdza obecność @ i tekstu wokół
wartość a@b przejdzie kontrolę
checkbox
niezależne zgody
niezaznaczony nie wysyła niczego
radio
jeden wybór z zestawu
grupę tworzy wspólny name
file
wskazanie pliku z dysku
wymaga enctype="multipart/form-data"
hidden
wartość niewidoczna na stronie
każdy ją podejrzy i zmieni: nie zapisuj ceny ani uprawnień
Etykieta, lista rozwijana i pole wieloliniowe
Etykieta wiąże się z polem przez id, a NIE przez name:
<label for="mail">Adres e-mail</label>
<input id="mail" name="email" type="email">
<label>Adres e-mail <input name="email"></label>
<!-- pole w srodku etykiety nie potrzebuje juz "for" -->
Kliknięcie etykiety ustawia kursor w polu, a czytnik ekranu odczytuje opis.
Lista rozwijana trzyma name na znaczniku select, a wysyła value zaznaczonej opcji:
<select name="miasto">
<option value="gd">Gdańsk</option>
<option value="so" selected>Sopot</option>
</select>
<!-- bez atrybutu value pojdzie tekst spomiedzy znacznikow -->
<select name="opcje[]" multiple>
<!-- bez nawiasow dotrze TYLKO ostatnia zaznaczona pozycja -->
<textarea name="opis">tresc poczatkowa</textarea>
<!-- textarea nie ma atrybutu value: tresc stoi miedzy znacznikami, -->
<!-- razem ze spacjami i zlamaniami wiersza -->
Walidacja HTML5 i wysyłanie pliku
<input name="kod" pattern="[0-9]{2}-[0-9]{3}" required maxlength="6">
<!-- przepusci 30-001, odrzuci 300-1: wzorzec obejmuje CALA wartosc -->
<!-- puste pole wzorzec pomija, dopoki nie ma "required" -->
required blokuje wysłanie pustego pola, maxlength ogranicza liczbę znaków z klawiatury, a zakres liczby lub daty ograniczają min i max.
Ta kontrola działa wyłącznie w przeglądarce: novalidate na formularzu, formnovalidate przy przycisku, edycja w narzędziach deweloperskich albo żądanie spoza strony wysyłają dane bez sprawdzenia, więc serwer musi powtórzyć te same reguły (jak, pokazuje artykuł o PHP). Przesłanie pliku wymaga dwóch atrybutów naraz:
<form action="wyslij.php" method="post" enctype="multipart/form-data">
<input type="file" name="zdjecie">
</form>
<!-- przy domyslnym kodowaniu serwer dostanie SAMA NAZWE pliku -->
<!-- poprawnie wyslany plik czyta sie z $_FILES -->