PHP: Formularze
Temat formularzy od strony HTML został omówiony w kursie HTML + CSS, dokąd zapraszam. Tutaj zajmiemy się częścią skryptową języka PHP, odebraniem danych z formularza, sprawdzeniem ich poprawności, podstawowymi formami zabezpieczenia danych czy wymuszenia ich konkretnego typu.
Zacznijmy od formularza, z którego postaramy się odebrać przesłane przez niego informacje:
<form action="./" method="post"> <p>Imię: <input type="text" name="imie" /></p> <p>Wiek: <input type="number" name="wiek" /></p> <p>Płeć:</p> <p><input type="radio" name="plec" value="m" />Mężczyzna</p> <p><input type="radio" name="plec" value="k" />Kobieta</p> <p>Ulubiony kolor:</p> <p> <select name="kolor"> <option value="czerwony">Czerwony</option> <option value="zielony">Zielony</option> <option value="niebieski">Niebieski</option> </select> </p> <p>Ulubiona seria gier:</p> <p><input type="checkbox" name="gry1" value=1 />GTA</p> <p><input type="checkbox" name="gry2" value=1 />FIFA</p> <p><input type="checkbox" name="gry3" value=1 />Battlefield</p> <p><input type="checkbox" name="gry4" value=1 />Settlers</p> <p><input type="checkbox" name="gry5" value=1 />Call of duty</p> <p><input type="checkbox" name="gry6" value=1 />Need For Speed</p> <p><input type="checkbox" name="gry7" value=1 />Tony Hawk`s</p> <textarea name='opis'>Treść <b>pogrubiona</b> i zwykła.</textarea> <p><input type="submit" /></p> </form>
Formularz jak widzimy przesyła dane metodą POST, wszystkie poniższe przykłady będą oparte właśnie na tej metodzie. Jeśli chcemy zrobić to samo metodą GET, jedyne co musimy zrobić z poniższym kodem, to zamienić POST na GET.
Dane przesyłane metodą POST przechowywane są w tablicy $_POST. Zapisane są tam w komórkach, których indeksem jest wartość atrybutu name pola przesyłanego przez formularz. I tak, jeśli przesyłamy pole formularza o atrybycie name=”reksio”, dostępne to będzie w tablicy POST pod adresem: $_POST[“reksio”]. Analogicznie, jeśli przesyłamy to samo pole metodą GET, wartość dostępna będzie w tablicy $_GET pod adresem $_GET[“reksio”].
Pole tekstowe (input type=”text”)
W naszym formularzu pole tekstowe ma postać:
<input type="text" name="imie" />
Formularz przesyłany jest metodą POST, więc wartość – to co wpisał w to pole użytkownik, będzie dostępne w:
$_POST['imie']
Aby wyświetlić wartość przesłanej informacji użyjemy kodu:
echo $_POST['imie'];
Celem choćby podstawowego zabezpieczenia danych przesyłanych przez użytkownika wykorzystać możemy jedną z funkcji PHP do filtrowania znaków: htmlspecialchars() bądź strip_tags(). Pierwsza z nich koduje znaki specjalne, druga natomiast usuwa z kodu znaczniki HTML.
echo "Cześć " . htmlspecialchars($_POST['imie']) . ". ";
To, że formularz został przesłany, nie oznacza, że został w pełni wypełniony. W przypadku, jeśli użytkownik nie podał imienia, w momencie użycia $_POST[‘imie’] zostanie wypisany błąd, że taka zmienna nie istnieje.
Aby temu zapobiec wykorzystamy funkcję isset(), sprawdzającą, czy wartość danej zmiennej została ustawiona:
if(isset($_POST['imie'])){
echo "Cześć " . htmlspecialchars($_POST['imie']) . ". ";
}else{
echo "Cześć nieznajomy.";
}
Pole number
Powyższy formularz zawiera w sobie pole number. Jest to również pole tekstowe o wartościach ograniczonych do liczb całkowitych, z dwoma przyciskami strzałek, do klikalnego zwiększania bądź zmniejszania zawartej w nim wartości. Jego obsługa od strony PHP jest identyczna jak w przypadku zwykłego pola tekstowego.
<input type="number" name="wiek" />
Wykorzystajmy natomiast operator rzutowania typu, aby zapewnić, że to co przyszło poprzez pole formularza, to rzeczywiście liczba całkowita:
(int)$_POST['wiek'];
Żeby na tym nie zakończyć, wypiszmy podany przez użytkownika wiek w postaci zdania: Masz X lat. Musimy wziąć pod uwagę, że zdanie to może brzmieć różnie w zależności od wieku podanego przez użytkownika:
- Masz 0 lat
- Masz 1 rok.
- Masz 2 lata.
- …
- Masz 11 lat.
- …
- Masz 22 lata.
- itd.
if(isset($_POST['wiek'])){
$lat = "lat";
if($_POST['wiek'] == 1) $lat = "rok";
if(($_POST['wiek'] <10 || $_POST['wiek'] >20) && ($_POST['wiek'][-1]==2 || $_POST['wiek'][-1]==3 || $_POST['wiek'][-1]==4)){
$lat = "lata";
}
echo "Masz " . (int)$_POST['wiek'] . " " . $lat . ".";
}
Radio (input type=”radio”)
Kolejnym elementem formularza są radio buttony. Grupa elementów, z której możliwy do zaznaczenia jest tylko jeden.
<p>Płeć:</p> <p><input type="radio" name="plec" value="m" />Mężczyzna</p> <p><input type="radio" name="plec" value="k" />Kobieta</p>
Wykorzystamy opisywaną już wcześniej funkcję isset() oraz za pomocą instrukcji warunkowej if sprawdzimy, którą z możliwych ma przesłana wartość płci: m czy k.
if(isset($_POST['plec'])){
if($_POST['plec'] == 'm') echo "Wybrana płeć: Mężczyzna";
else echo "Wybrana płeć: Kobieta";
}
Lista rozwijana (select)
Kolejnym elementem naszego formularza jest lista rozwijana. Ma ona przypisaną, w znaczniku select ogólną nazwę (name) przesyłanej zmiennej, natomiast jej wartości zawarte są w atrybutach value znaczników option.
<select name="kolor"> <option value="czerwony">Czerwony</option> <option value="zielony">Zielony</option> <option value="niebieski">Niebieski</option> </select>
Odebranie wartości odbywa się w sposób analogiczny do przedstawionych powyżej – poprzez pobranie przesłanej wartości z odpowiedniej komórki tablicy $_POST:
if(isset($_POST['kolor'])){
echo "Wybrany kolor: " . $_POST['kolor'];
}
Pole wyboru (checkbox)
Kolejny na tej liście checkbox umożliwia wybranie większej ilości opcji. W naszym przypadku do wyboru są serie gier:
<p>Ulubiona seria gier:</p> <p><input type="checkbox" name="gry1" value=1 />GTA</p> <p><input type="checkbox" name="gry2" value=1 />FIFA</p> <p><input type="checkbox" name="gry3" value=1 />Battlefield</p> <p><input type="checkbox" name="gry4" value=1 />Settlers</p> <p><input type="checkbox" name="gry5" value=1 />Call of duty</p> <p><input type="checkbox" name="gry6" value=1 />Need For Speed</p> <p><input type="checkbox" name="gry7" value=1 />Tony Hawk`s</p>
W powyższym przykładzie każde pole checkbox ma własną indywidualną nazwę. Aby sprawdzić, czy dane pole jest zaznaczone, sprawdzamy każdą przesłaną wartość po kolei:
if(isset($_POST['gry1']) && $_POST['gry1'] == 1) echo "Wybrano GTA"; if(isset($_POST['gry2']) && $_POST['gry2'] == 1) echo "Wybrano FIFA";
… i tak dalej.
Możemy również stworzyć grupę checkboxów. Musimy wówczas nieco zmodyfikować nasz kod HTML, przypisując jako nazwę poszczególnych checkboxów tablicę oraz przypisując każdej opcji indywidualną wartość atrybutu value:
<p>Ulubiona seria gier:</p> <p><input type="checkbox" name="gry[]" value=1 />GTA</p> <p><input type="checkbox" name="gry[]" value=2 />FIFA</p> <p><input type="checkbox" name="gry[]" value=3 />Battlefield</p> <p><input type="checkbox" name="gry[]" value=4 />Settlers</p> <p><input type="checkbox" name="gry[]" value=5 />Call of duty</p> <p><input type="checkbox" name="gry[]" value=6 />Need For Speed</p> <p><input type="checkbox" name="gry[]" value=7 />Tony Hawk`s</p>
W ten sposób w komórce tablicy $_POST[‘gry’] zapisaną będziemy mieli tablicę ze wszystkimi zaznaczonymi wartościami (value). Wykorzystajmy pętlę for i wypiszmy je na ekran jedną pod drugą:
if(isset($_POST['gry'])){
for($i=0; $i<count($_POST['gry']); $i++){
echo $_POST['gry'][$i] . "<br />";
}
}else{
echo "Nie wybrano ani jednej serii gier :(";
}
Textarea
Na koniec proste odebranie informacji zapisanej w polu textarea. Dla przykładu w treści wykorzystane znaczniki HTML:
<textarea name='opis'>Treść <b>pogrubiona</b> i zwykła.</textarea>
if(isset($_POST['opis'])){
echo $_POST['opis'];
}