|
Przekazywanie
zmiennych między stronami |
|
|
|
|
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.
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 te to:
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:
Kliknij tu
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:
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().
<?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.
|
|
|
|