PHP

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'];
}