PHP/Formularze: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Zyx (dyskusja | edycje)
spis treści
 
Zyx (dyskusja | edycje)
utworzenie
Linia 2:
 
== Formularze ==
W tym rozdziale zajmiemy się podstawami komunikacji skryptu PHP z przeglądarką.
 
=== Ogólnie o danych wejściowych ===
Interaktywne aplikacje PHP odbierają od użytkownika setki ilości informacji. Pozwalają one nie tylko zorientować się, kto nas odwiedził, ale także odczytywać zawartość formularzy oraz adresów URL. Mechanizm ich odbierania ewoluował stopniowo. Pierwsze wersje rejestrowały wszystkie nadesłane parametry jako zwyczajne zmienne, lecz począwszy od PHP 4 zarzucono to, gdyż zagrażało bezpieczeństwu wielu skryptów. Dodając nowe parametry, można było rejestrować nowe zmienne, których autor aplikacji nie przewidział i tym samym podszyć się pod jakąś. Programista nie mógł także policzyć, ile danych w ogóle do niego trafiło i w jakich zmiennych są zawarte.
 
Obecnie wszystkie pola są rejestrowane w specjalnych, tworzonych przez skrypt, tablicach asocjacyjnych posegregowane według miejsca, z którego nadeszły. PHP potrafi odbierać informacje:
* Metodą GET (parametry w adresach URL)
* Metodą POST (formularze)
* z serwera
* z ciasteczek
* z sesji (emulowanych przez PHP)
 
Tutaj zajmiemy się trzema pierwszymi pozycjami. Ciastka oraz sesje zostaną omówione w dalszych rozdziałach podręcznika.
 
=== Adresy URL ===
Dane pochodzące z adresu URL przechowywane są w tablicy ''$_GET''. Możemy prosto obejrzeć sobie jej konstrukcję:
 
<nowiki><?php
 
var_dump($_GET);
 
?></nowiki>
 
Wywołując skrypt normalnie: http://localhost/~programowanie_php/nazwaskryptu.php otrzymamy następujący rezultat:
 
array(0) { }
 
Oznacza to, że nie otrzymaliśmy tą metodą żadnych danych. Dodajmy teraz do adresu ciąg ''?parametr=wartosc''. Po odświeżeniu zobaczymy:
 
array(1) { ["parametr"]=> string(7) "wartosc" }
 
Tablica zawiera jeden element o nazwie ''parametr'' przechowujący wpisaną w adresie wartość.
 
Napiszemy teraz prosty skrypt wyświetlający informacje powitalne na podstawie danych z adresu:
 
<nowiki><?php
 
if(count($_GET) == 2)
{
echo 'Witaj, '.$_GET['imie'].' '.$_GET['nazwisko'].'!';
}
else
{
echo 'Nieprawidłowa liczba parametrów!';
}
 
?></nowiki>
 
Nie przejmuj się istnieniem konstrukcji, której jeszcze nie poznaliśmy. Niektórzy pewnie domyślili się, co ona robi, ale szczegóły będą podane już w następnym rozdziale. Na razie wpiszmy ją tak, jak jest. Funkcja ''count()'' pojawiająca się w kodzie zwraca ilość elementów w tablicy. Sprawdzamy w ten sposób, czy użytkownik podał to, co trzeba. Kontrola nadchodzących danych jest niezwykle istotna i '''nigdy''' nie wolno jej zlekceważyć. Pominięcie tego aspektu zazwyczaj kończy się dla skryptu tragicznie, bo jeżeli coś jest do zepsucia, na pewno znajdzie się ktoś, kto tego dokona.
 
Wywołując skrypt z parametrami "imie" oraz "nazwisko" możemy wpływać na wyświetlane informacje: [http://localhost/~programowanie_php/nazwaskryptu.php?imie=Adam&nazwisko=Kowalski http://localhost/~programowanie_php/nazwaskryptu.php?imie=Adam&nazwisko=Kowalski]. Dla lepszego efektu stwórzmy prosty formularz HTML wysyłający dane metodą GET:
 
<nowiki><html>
<head>
<title>Formularz HTML</title>
</head>
<body>
<form method="get" action="nazwaskryptu.php">
Podaj imię: <input type="text" name="imie"/><br/>
Podaj nazwisko: <input type="text" name="nazwisko"/><br/>
<input type="submit" value="OK"/>
</form>
</body>
</html></nowiki>
 
Choć tworzenie formularzy teoretycznie pasuje do następnej sekcji, tak naprawdę w tym momencie zwyczajnie oszukujemy. Wypełnij ten formularz i wyślij go, a zobaczysz, że przeglądarka dokleiła do pliku podanego w znaczniku FORM parametry utworzone na podstawie pól! Tak więc nasz skrypt nawet nie ma możliwości stwierdzenia, skąd dane do niego przyszły! Poznajmy zatem metodę POST...
 
=== Formularze ===
Obsługa formularzy z prawdziwego zdarzenia, którymi można przesyłać setki informacji, odbywa się dosyć podobnie, jak adresów. Różnica jest taka, że wszystko wysyła się wyłącznie z formularza, który posiada parametr "method" ustawiony na "post" oraz że korzysta się z tablicy ''$_POST'' wewnątrz samego skryptu. Przeróbmy nasze ostatnie dzieło tak, aby pracowało w ten sposób.
 
<nowiki><?php
 
if(count($_POST) == 2)
{
echo 'Witaj, '.$_POST['imie'].' '.$_POST['nazwisko'].'!';
}
else
{
echo 'Nieprawidłowa liczba parametrów!';
}
 
?></nowiki>
 
W skrypcie podmieniamy jedynie nazwy tablic na ''$_POST''. W formularzu musimy jeszcze zmienić metodę:
 
<nowiki><html>
<head>
<title>Formularz HTML</title>
</head>
<body>
<form method="post" action="nazwaskryptu.php">
Podaj imię: <input type="text" name="imie"/><br/>
Podaj nazwisko: <input type="text" name="nazwisko"/><br/>
<input type="submit" value="OK"/>
</form>
</body>
</html></nowiki>
 
I gotowe. Wyślij teraz formularz. Zauważ, że żadna informacja nie jest doklejana do adresu, ponieważ transmisja odbywa się niejako innym kanałem.
 
Z kursów języka HTML wiadomo, że istnieją różne typy pól formularzy. Oto, jakie wartości otrzymuje od nich PHP:
 
* <pre><nowiki><input type="text" name="nazwa"/></nowiki></pre> - skrypt otrzymuje ''$_POST['nazwa']'' z wartością wpisaną w pole formularza.
* <pre><nowiki><input type="hidden" name="nazwa"/></nowiki></pre> - skrypt otrzymuje ''$_POST['nazwa']'' z wartością wpisaną w danym znaczniku. Użyteczne do przesyłania formularzem ukrytych informacji, o których typowy użytkownik wiedzieć nie musi.
* <pre><nowiki><input type="radio" name="nazwa"/></nowiki></pre> - pozycje należące do tej samej grupy muszą mieć identyczną nazwę. PHP otrzyma wartość tej pozycji, która jest aktualnie zaznaczona.
* <pre><nowiki><input type="checkbox" name="nazwa"/></nowiki></pre> - jeśli pole jest zaznaczone, ''$_POST['nazwa']'' zawierać będzie słowo "on".
* <pre><nowiki><select name="nazwa">...</select></nowiki></pre> - ''$_POST['nazwa']'' zawierać będzie wartość wybranego z listy elementu.
* <pre><nowiki><input type="submit" name="nazwa"/></nowiki></pre> - zmienna ''$_POST['nazwa']'' zostanie utworzona, jeżeli akurat ten przycisk zostanie wciśnięty. Dzięki temu można do formularzy wstawiać kilka przycisków "submit" i reagować inaczej w zależności od tego, który z nich został naciśnięty.
 
=== Serwer ===
Na sam koniec zostawiliśmy sobie kilka informacji przekazywanych interpreterowi przez serwer WWW (np. Apache). Zacznijmy od określenia adresu IP gościa:
 
<nowiki><?php
 
echo 'Witaj, twój adres IP to '.$_SERVER['REMOTE_ADDR'].'!';
 
?></nowiki>
 
Ten skrypt pokaże nam adres IP komputera lub sieci, w której znajduje się internauta. W tym drugim przypadku dalsze informacje są niepewne. Serwerowi potrzebny jest wyłącznie ten adres, aby móc gdzieś wysłać rezultat, a pola ''$_SERVER['HTTP_X_FORWARDED_FOR']'' lub ''$_SERVER['HTTP_CLIENT_IP']'' są bardzo niepewne - generuje je właśnie serwer proxy, ale nic nie stoi na przeszkodzie, by podszył się pod nie hacker. Uznawanie ważności informacji tu zawartych było przyczyną wielu błędów bezpieczeństwa w popularnym skrypcie for dyskusyjnych phpBB i jeżeli naprawdę zależy Ci na nim, pozostań przy ''REMOTE_ADDR'', a resztę traktuj wyłącznie jako ciekawostkę.
 
Korzystając z funkcji ''gethostbyaddr()'' możemy uzyskać nazwę hosta, którego dotyczy adres IP:
 
<nowiki><?php
 
echo 'Witaj, twój host to '.gethostbyaddr($_SERVER['REMOTE_ADDR']).'!';
 
?></nowiki>
 
Spróbujmy zidentyfikować przeglądarkę użytkownika:
 
<nowiki><?php
 
echo 'Twoja przeglądarka została zidentyfikowana jako: '.$_SERVER['HTTP_USER_AGENT'].'!';
 
?></nowiki>
 
Pole to zawiera wyłącznie surowe informacje. Każda przeglądarka wpisuje tu co innego i dlatego wyciągnięcie ładnych i pogrupowanych w odpowiednie kategorie danych to zadanie na więcej, niż jeden artykuł. Pozostańmy zatem przy takiej postaci, a przetwarzaniem nagłówków przeglądarek zajmiemy się kiedy indziej.
 
Adres strony, z której przybyliśmy do naszego skryptu, znajduje się w zmiennej ''$_SERVER['HTTP_REFERER']''. Można wykorzystać go do utworzenia linków "Cofnij" albo do detekcji, jakich słów kluczowych używają ludzie trafiający do nas z wyszukiwarek. Zauważ - szukane frazy zazwyczaj dołączane są właśnie do adresów URL i w ten sposób można je zdobyć.
 
<nowiki><?php
 
echo 'Przybyłeś do nas ze strony: '.$_SERVER['HTTP_REFERER'].'!';
 
?></nowiki>
 
W chwili obecnej to tyle, jeżeli chodzi o pobieranie danych. Dalszych informacji dowiemy się w trakcie następnych rozdziałów w miarę potrzeby.