[PHP] Jak odbierać dane pochodzące z różnych pól formularza?
Chcesz się dowiedzieć jak odbierać dane pochodzące z różnych pól formularza, typu text, textarea, select, radio, checkbox czy hidden.
Przetwarzanie formularzy to podstawowa czynność, która pozwala na komunikację pomiędzy użytkownikiem i skryptami. W dużej mierze to właśnie formularze powodują, że strony mogą być interaktywne i dostosowane do wymagań odbiorcy. Zobacz jak tworzyć formularze i jak odbierać z nich wpisane (albo wybrane) przez użytkowników informacje.
Każdy formularz składa się z pól określonego rodzaju (pola wyboru lub pola tekstowego), które powinny mieć niepowtarzalne nazwy pozwalające na zidentyfikowanie ich. Użyjmy prostego przykładu z polami tekstowymi - całość możesz umieścić w pliku index.php i uruchomić w przeglądarce na serwerze z działającym PHP.
<form action="index.php" method="get">
tytuł strony: <input type="text" name="tytul"><br>
adres strony: <input type="text" name="adres" value="http://"><br>
<input type="submit" value=" wyślij dane ">
</form>
<?
echo $_GET["tytul"]." - ".$_GET["adres"];
?>
Pierwsza linijka określa jaki skrypt będzie przetwarzał dane pochodzące z formularza (u nas index.php w aktualnym katalogu - czyli ten sam, w którym znajduje się formularz) i jakiej metody wysyłania danych użyjemy (u nas GET, więcej o metodach przesyłania w osobnej poradzie - adres na końcu tekstu).
Pole tekstowe ma prostą konstrukcję - określasz jego typ jako text, nadajesz mu jakąś nazwę (u nas tytul i adres) i ewentualnie możesz dodać wstępną wartość value, która od razu pojawi się w okienku (u nas http://).
Po wciśnięciu guzika typu submit o nazwie "wyślij dane", wartości wpisane do formularza zostaną wysłane do skryptu PHP i tam będzie je można odczytać.
Odczytywanie danych
Aby odczytać wartość dowolnej zmiennej należy skorzystać z tablic globalnych dostępnych w nowych wersjach PHP:
$_GET["zmienna"] - dla zmiennych wysyłanych metodą GET
$_POST["zmienna"] - dla zmiennych wysyłanych metodą POST
$_REQUEST["zmienna"] - dla zmiennych wysyłanych metodą POST lub GET
Jeżeli korzystasz ze starszej wersji PHP (wcześniejszych niż 4.1.0) zmienne są przechowywane jako tablice o innej nazwie:
$HTTP_GET_VARS["zmienna"] - dla zmiennych wysyłanych metodą GET
$HTTP_POST_VARS["zmienna"] - dla zmiennych wysyłanych metodą POST
Jeżeli w pliku konfiguracyjnym php.ini dyrektywa register_globals jest ustawiona na On możesz odwoływać się do zminnych wprost, dodając do nich znak dolara, jak w wypadku każdej jednej zmiennej: $zmienna
Więcej informacji o tablicach i ustawieniach w pliku konfiguracyjnego php.ini znajdziesz w osobnej, obszernej poradzie, której adres jest podany na końcu tekstu.
Zakładam, że masz PHP w najnowszej wersji i stosować będziemy zalecany sposób odczytywania zmiennych za pomocą tablic opisanych jako pierwsze, a więc $_GET["zmienna"] i $_POST["zmienna"]. Tylko dla formalności będę podawał sposoby odczytania zmiennych według dwóch starszych sposobów (nie są zalecane).
Pola typu text
Przykład z polem tekstowym został już przedstawiony powyżej, ale użyję go jeszcze raz dodając po zalecanym sposobie odczytu, również inne sposoby - uruchamiając ten skrypt, zobaczysz, które ze sposobów odczytania zmiennych działają u Ciebie:
<form action="index.php" method="get">
tytul strony: <input type="text" name="tytul"><br>
adres strony: <input type="text" name="adres" value="http://"><br>
<input type="submit" value=" wyślij dane ">
</form>
<?
echo "<br>1.) ".$_GET["tytul"]." - ".$_GET["adres"];
echo "<br>2.) ".$HTTP_GET_VARS["tytul"]." - ".$HTTP_GET_VARS["adres"];
echo "<br>3.) $tytul - $adres";
?>
Oczywiście gdy zmienisz metodę wysyłania na POST, również w tablicach musisz zmienić GET na POST. Stosowanie GET jest wygodne w naszym przypadku, bowiem od razu, w odnośniku zobaczysz przekazywane zmienne, np:
index.php?tytul=Moja+Strona&adres=http%3A%2F%2Fwww.mojastrona.com%2F
Pola typu textarea
Pola te również pozwalają wprowadzać tekst, ale może on mieć więcej niż jedną linijkę. Zasada działania jest identyczna - pole musi mieć jakąś nazwę, którą odczytamy jako zmienną w skrypcie. Pamiętaj, że powinno się korzystać tylko z pierwszej metody odczytywania danych, choć w praktyce często stosowana jest także trzecia.
<form action="index.php" method="post">
<textarea name="pole1" rows="5" cols="12"></textarea>
<input type="submit" value=" wyślij dane ">
</form>
<?
echo "<br>1.) " . $_POST["pole1"];
echo "<br>2.) " . $HTTP_POST_VARS["pole1"];
echo "<br>3.) " . $pole1;
?>
Pola typu select
Pola typu select (czyli listy) mogą przyjmować jedną z kilku wartości lub kilka z przedstawionych wartości, jeżeli pole ma dopisany atrybut multiple. Wybierzemy więc jedno miasto i kilka ulubionych kolorów (aby wybrać kilka pozycji przytrzymaj klawisz ctrl)
<form action="index.php" method="get">
miejsce zamieszkania:<br>
<select name="miasto">
<option>Warszawa</option>
<option>Katowice</option>
<option>Sopot</option>
</select><br>
ulubione kolory:<br>
<select name="kolory[]" multiple>
<option>biały</option>
<option>czerwony</option>
<option>zielony</option>
</select><br>
<input type="submit" value=" wyślij dane ">
</form>
<?
echo "<br>1.) " . $_GET["miasto"];
echo "<br>2.) " . $HTTP_GET_VARS["miasto"];
echo "<br>3.) " . $miasto;
echo "<p>";
echo "<br>1.";
for ($i=0;$i<count($_GET["kolory"]);$i++) {
echo $_GET["kolory"][$i];
echo " ";
}
echo "<br>2.";
for ($i=0;$i<count($HTTP_GET_VARS["kolory"]);$i++) {
echo $HTTP_GET_VARS["kolory"][$i];
echo " ";
}
echo "<br>3.";
for ($i=0;$i<count($kolory);$i++) {
echo $kolory[$i];
echo " ";
}
?>
O ile w wypadku miasta, które może być tylko jedno, nie ma problemu z odczytaniem wartości, to w wypadku pól wielokrotnego wyboru trzeba zastosować pewien zabieg. Zauważ, że nazwa tego pola ma dodane dwa nawiasy kwadratowe w formularzu, co oznacza, że zmienna będzie tablicą. W tablicy można przechować kilka wybranych wartości.
W pętli for() za pomocą funkcji count() obliczamy ile wartości zostało przekazanych z formularza i wypisujemy je na ekran. Poszczególne elementy tablicy zawierają wartości z zaznaczonych pól. Można w ten sposób stwierdzić jakie pola zostały wybrane i ile tych pól wybrano.
Pola typu checkbox
Ponieważ można zaznaczyć kilka pól typu checkbox, również trzeba zastosować rozwiązane z tablicą opisane powyżej. Do nazwy zmiennej trzeba dodać nawiasy kwadratowe, a dane odczytać w pętli.
<form action="index.php" method="get">
ulubiona potrawa:
<br><input type="checkbox" name="potrawa[]" value="rosół">rosół
<br><input type="checkbox" name="potrawa[]" value="pizza">pizza
<br><input type="checkbox" name="potrawa[]" value="kurczak">kurczak
<br><input type="submit" value=" wyślij dane ">
</form>
<?
echo "<br>1.";
for ($i=0;$i<count($_GET["potrawa"]);$i++) {
echo $_GET["potrawa"][$i];
echo " ";
}
echo "<br>2.";
for ($i=0;$i<count($HTTP_GET_VARS["potrawa"]);$i++) {
echo $HTTP_GET_VARS["potrawa"][$i];
echo " ";
}
echo "<br>3.";
for ($i=0;$i<count($potrawa);$i++) {
echo $potrawa[$i];
echo " ";
}
?>
Pola typu radio
Ponieważ można wybrać tylko jedno pole typu radio, odczytanie danych jest bardzo proste, podobnie jak w przypadku pól tekstowych.
<form action="index.php" method="get">
ile masz lat:
<br><input type="radio" name="wiek" value="10">10
<br><input type="radio" name="wiek" value="20">20
<br><input type="radio" name="wiek" value="30">30
<br><input type="radio" name="wiek" value="40">40
<br><input type="submit" value=" wyślij dane ">
</form>
<?
echo "<br>1.) " . $_GET["wiek"];
echo "<br>2.) " . $HTTP_GET_VARS["wiek"];
echo "<br>3.) " . $wiek;
?>
Kombinacje pól
Nic nie stoi na przeszkodzie aby połączyć wiele pól w jednym formularzu. Stwórzmy banalny formularz do pobrania uwag na temat serwisu. Zebrane dane wyświetlone zostaną na ekranie, ale równie dobrze można je zapisać w pliku lub wysłać pocztą elektroniczną pod wskazany adres.
<form action="index.php" method="post">
<br>Twoje imie: <br><input type="text" name="imie">
<br>Twoje nazwisko: <br><input type="text" name="nazwisko">
<br>Twój e-mail: <br><input type="text" name="email">
<br>Uwagi:
<br><textarea name="tresc" rows="5" cols="12"></textarea>
<br>Czy odpowiedź na list jest konieczna?
<br><input type="radio" name="odp" value="tak">tak
<br><input type="radio" name="odp" value="nie">nie
<br>Twoja opinia o serwisie?
<br><input type="checkbox" name="opinia[]" value="ciekawy">ciekawy
<br><input type="checkbox" name="opinia[]" value="miły">miły
<br><input type="checkbox" name="opinia[]" value="czytelny">czytelny
<br>Skąd go znasz?
<br><select name="skad">
<option>z prasy</option>
<option>z wyszukiwarek</option>
<option>znajomi opowiadali...</option>
</select><br>
<br><input type="submit" value=" wyślij dane ">
</form>
<?
echo " ".$_POST["imie"];
echo " ".$_POST["nazwisko"];
echo " ".$_POST["email"];
echo " ".$_POST["tresc"];
echo " ".$_POST["odp"];
for ($i=0;$i<count($_POST["opinia"]);$i++) {
echo " ".$_POST["opinia"][$i];
}
echo " ".$_POST["skad"];
?>
Oczywiście dane są trywialne, a formularz specjalnie nie został ładnie sformatowany, aby pokazać sam mechanizm i sposób odczytywania danych. Pobrane informacje powinny przejść jeszcze dodatkową weryfikację - skasowane powiny zostać zbędne spacje czy sprawdzona poprawność adresu e-mail, ale zależy to już od konkretnego przypadku i konstrukcji formularza.
• [PHP] Dlaczego w nowych wersjach PHP należy odczytywać zmienne za pomocą $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_FILES, $_REQUEST i $_SESSION?