Spis treści
Formularze
Jeśli użytkownik musi podać jakieś dane (np. w celu dodania ich do bazy danych), to jedyną metodą jest pobranie ich ze standardowego formularza HTML. W większości języków programowania należy używać dodatkowych bibliotek aby uzyskać dostęp do danych przesyłanych z formularza. W PHP zostało to maksymalnie uproszczone. Wszystkie dane z formularza trafiają do odpowiednich tablic asocjacyjnych o nazwach kluczy takich, jak nazwy pól formularza. Jeśli w konfiguracji PHP włączona zostanie opcja register_globals (jest ona domyślnie wyłączona od wersji 4.2.0), to stworzone zostaną od razu zmienne o nazwach takich jak nazwy pól formularza.
SÄ… dwie metody przekazywania parametrów do innych stron: metoda „GET” i metoda „POST”. Metody GET używa siÄ™ kiedy parametrów jest niewiele. Dzieje siÄ™ tak ponieważ parametry przekazuje siÄ™ za pomocÄ… adresu URL (np. http://www.coÅ›.pl/strona.php?parametr1=wartość1¶metr2=wartość2), którego dÅ‚ugość jest ograniczona. Należy też pamiÄ™tać że parametry sÄ… widoczne w pasku adresu przeglÄ…darki, wiÄ™c tej metody nie należy używać jeÅ›li przekazywane sÄ… np. hasÅ‚a. Jak widać, sam adres od parametrów oddzielany jest za pomocÄ… znaku zapytania, a kolejne pary parametr=wartość za pomocÄ… znaku ampersand („&”). TÄ… metodÄ™ można wykorzystać także przy przekazywaniu parametrów przez odnoÅ›nik (zobacz dalej).
Metoda „POST” do przekazywania parametrów wykorzystuje nagłówek zapytania – wystarczy wiedzieć, że metoda ta umożliwia przekazywanie dużo wiÄ™kszych parametrów, a także że parametrów nie widać w pasku przeglÄ…darki.
Zależnie od metody, zmienne trafiają do odpowiednich tablic asocjacyjnych. Dane przesłane metodą GET trafiają do tablicy $_GET (lub $HTTP_GET_VARS w wersjach starszych niż 4.1.0) a dane z metody POST to tablicy $_POST (lub $HTTP_POST_VARS). Tablice $_GET i $_POST są superglobalne. Oznacza to, że są widoczne w każdym miejscu kodu PHP bez konieczności użycia składni globals.
Przykład 7.1. Odczytywanie wartości z formularza
Plik jeden.html <html> <head> <title> Test formularza </title> </head> <body> <form action="dwa.php" method="GET"> Imię: <input type=text name="imie"/><br/> Nazwisko: <input type=text name="nazwisko"/><br/> Proszę o fakturę do zamówienia: <input type=checkbox name="faktura"/><br/> Chcę zamówić:<br/> <input type=radio name=zamow value="kola"/>Coca-colę<br> <input type=radio name=zamow value="fanta"/>Fantę<br> <input type=radio name=zamow value="sprite"/>Sprite'a<br> <input type=submit value="Wyślij"/> </form> </body> </html> Plik dwa.php <html> <head> <title> Wyniki </title> </head> <body> Imię: <?php echo $_GET['imie']?><br> Nazwisko: <?php echo $_GET['nazwisko']?><br> Faktura: <?php echo ($_GET['faktura'] == 'on' ? 'Tak' : 'Nie')?><br> Zamówienie: <?php switch($_GET['zamow']){ case "kola": echo "Coca-cola"; break; case "fanta": echo "Fanta"; break; case "sprite": echo "Sprite"; break; } ?> </body> </html>
Upload plików
CzÄ™sto zachodzi też potrzeba przekazania jakiegoÅ› pliku na serwer, na przykÅ‚ad dodajÄ…c zdjÄ™cie do galerii. Plik przesyÅ‚a siÄ™ korzystajÄ…c z pola formularza typu „file”. Należy pamiÄ™tać o tym, że w tagu otwierajÄ…cym formularz musi znaleźć siÄ™ parametr ENCTYPE=”multipart/form-data” a formularz musi być wysyÅ‚any metodÄ… POST. Na stronie do której zostaÅ‚ wysÅ‚any formularz dostÄ™pna bÄ™dzie wielowymiarowa tablica asocjacyjna $_FILES ($HTTP_POST_FILES w starszych wersjach PHP), której pierwszym wymiarem bÄ™dÄ… pola typu file z formularza (klucze sÄ… nazwami tych pól), a w drugim informacje o przesÅ‚anym pliku.
Informacje o przesyłanym pliku
- tmp_name
- nazwa tego pliku na serwerze wraz ze ścieżką; używając tego pola można uzyskać dostęp do przesłanego pliku
- name
- nazwa pliku jaką posiadał u użytkownika
- type
- typ MIME pliku, np. text/plain lub image/gif; informacja ta jest dostępna tylko jeśli przeglądarka klienta dostarczyła takiej informacji.
- size
- wielkość pliku w bajtach
Dokładniejsze informacje wraz z przykładami użycia znajdują się w rozdziale Odbieranie plików od użytkownika.
Odnośniki
Istnieje możliwość przekazywania niedużej liczby parametrów za pomocÄ… zwykÅ‚ych odnoÅ›ników dostÄ™pnych w jÄ™zyku HTML. W takim przypadku wykorzystuje siÄ™ metodÄ™ GET – konstruuje siÄ™ odnoÅ›nik, na koÅ„cu którego należy umieÅ›cić znak zapytania a po nim oddzielone ampersandami pary parametr=wartość, np: <a href=”strona.php?imie=Franek&nazwisko=Kowalski”>Kliknij tu</a>
Cookies
Metodą nie tyle przekazywania parametrów, co przechowywania niewielkich ilości danych na komputerze oglądającego stronę (np. informacje o imieniu i nazwisku lub nazwie użytkownika w tym serwisie) jest mechanizm cookies (ciasteczka). Ciasteczka ustawione przez dany serwis dostępne są tylko dla niego i ustawiane są na jakiś czas.
Ciasteczka przekazywane sÄ… za pomocÄ… nagłówków HTTP. MuszÄ… być one wysÅ‚ane zanim do przeglÄ…darki zostanie wysÅ‚ana jakakolwiek inna treść. W zwiÄ…zku z tym przed zapisaniem ciasteczka nie może być żadnego wywoÅ‚ania funkcji echo i pochodnych, a także tag otwierajÄ…cy tryb PHP musi być pierwszymi znakiami w pliku – nie może być żadnej spacji ani pustych wierszy. Ograniczenie to można obejść używajÄ…c buforowania wyjÅ›cia – po szczegóły odsyÅ‚am do podrÄ™cznika PHP.
PHP automatycznie odczytuje ciasteczka i zamienia je na zmienne. SÄ… one przechowywane w superglobalnej tablicy asocjacyjnej $_COOKIE (dawniej $HTTP_COOKIE_VARS), w której kluczami sÄ… nazwy ciasteczek. Ciasteczka ustawia siÄ™ je pomocÄ… funkcji setcookie( nazwa, wartość, czas_wygaÅ›niÄ™cia, Å›cieżka, domena, bezpieczeÅ„stwo). Tylko pierwszy parametr jest niezbÄ™dny. Oznacza on nazwÄ™ cookiesa – takÄ… nazwÄ… bÄ™dzie miaÅ‚a zmienna stworzona przez PHP po ponownym odczytaniu ciastek. Funkcja parametru „wartość” jest chyba oczywista – taka wartość bÄ™dzie przechowana w ciasteczku o podanej nazwie. Parametr czas_wygaÅ›niÄ™cia oznacza czas, po jakim ciastko zostanie skasowane. Czas ten należy podać jako ilość sekund od 1.1.1970 – tak jest przechowywany czas w systemach UNIX’owych. Aktualny czas w tym formacie zwracany jest przez funkcjÄ™ time(). JeÅ›li cookie ma być trzymany przez godzinÄ™, to do czasu zwróconego przez time() należy dodać ilość sekund zawartych w godzinie – „time() + 3600”. Podobnie należy postÄ™pować w przypadku innych przedziałów czasu.
Przedziały czasu dla funkcji setcookie
- godzina – time()+3600
- dzieÅ„ – time()+86400
- miesiÄ…c – time()+30*86400
JeÅ›li czas bÄ™dzie wczeÅ›niejszy niż aktualny czas, ciasteczko zostanie skasowane. JeÅ›li bÄ™dzie równy zero – ciasteczko bÄ™dzie ważne tylko do zamkniÄ™cia przeglÄ…darki.
Dwa następne parametry używane są do wskazania adresu, dla którego dostępne będą cookiesy. Jeśli ostatni parametr jest ustawiony na 1, to cookie będzie przesłany za pomocą szyfrowanego połączenia HTTPS.
Standardowo nie ma możliwoÅ›ci przechowywania tablic w ciasteczkach, lecz można to zrobić „na okoÅ‚o”. Przed zapisaniem tablicy w ciasteczku należy użyć funkcji serialize(). Zamienia ona tablicÄ™ na ciÄ…g znaków. Do ponownego odczytania takiej tablicy sÅ‚uży funkcja unserialize().
Przykład 7.2. Serializacja i deserializacja tablicy
<?php // zapis $tablica = Array('a' => 'pierwszy', 'b' => 'drugi'); setcookie('tablica', serialize($tablica), time()+3600); // odczyt zabezpieczony przed nieistniej±cym ciasteczkiem if (isset($_COOKIE['tablica'])) { $tablica = unserialize($_COOKIE['tablica']); } else { $tablica = Array(); } ?>
W PHP nowszych od 4.1.0 istnieje jeszcze superglobalna tablica $_REQUEST, która łączy w sobie tablice $_GET, $_POST, $_COOKIE i $_FILES.
register_globals
PHP posiada możliwość ustawienia w pliku konfiguracyjnym php.ini dyrektywy register_globals. Jest ona odpowiedzialna za rejestrowanie danych otrzymanych z formularzy, ciastek, sesji czy serwera jako zmienne globalne. Oznacza to, że jeśli dyrektywa register_globals została ustawiona na on to wszystkie zmienne przekazane do skryptu dostępne są w postaci $nazwa_zmiennej, bez potrzeby stosowania żadnych tablic. Wydaje się to wygodniejsze i łatwiejsze, lecz powoduje pewne niebezpieczeństwo. Mianowicie używając zmiennych globalnych nie można stwierdzić, czy dana wartość pochodzi z sesji czy może została podana w URLu metodą GET. Przy źle napisanych skryptach można tak obchodzić zabezpieczenia.
W związku z powyższym, używanie odpowiednich tablic jest mocno zalecane. Ostatnio twórcy PHP dodali do tego jeszcze jeden powód. Począwszy od wersji 4.2.0, dyrektywa register_globals jest domyślnie wyłączona. Tak więc pisząc skrypt dla nieznanego serwera trzeba się liczyć z ewentualnością braku dostępu do zmiennych globalnych.