System wejścia to system przekazywania danych zewnętrznych (z formularza, URL'a, ciastek, sesji itp.) do skryptu. Pragnę poświęcić mu cały artykuł, gdyż fora dyskusyjne w naszym kraju są zalewane pytaniami o tenże system w związku z ciągłymi w nim zmianami i całkowitej ignorancji ze strony twórców artykułów, którzy nie chcą zaktualizować swoich tekstów pod kątem tych zmian.
Rys historyczny
W pierwotnych wersjach PHP - PHP/FI 2, PHP 3, działających z prędkością ślimaka :) - każda informacja wejściowa była konwertowana do postaci pojedynczej zmiennej. Tak więc np. pole formularza
nick pojawiało się w naszym skrypcie jako zwyczajna zmienna
$nick. Rozwiązanie proste, ale jednak bardzo niebezpieczne. Przede wszystkim istniała możliwość niewłaściwego nadpisania się na siebie dwóch danych o tej samej nazwie, o możliwości nadpisania jakiejś zmiennej skryptu nie wspominając. Ponadto nie było żadnej metody na wyświetlenie wszystkich danych, które przyszły do skryptu - było to po prostu technicznie niemożliwe. Zmienne były zwyczajnie porozrzucane.
Całe to zamieszanie dostrzegli twórcy PHP przy wydawaniu edycji czwartej. Postanowili więc, że wszystkie dane wejściowe będą tworzone w poszczególnych tablicach. I tak dane z URL'a trafiały do tablicy
$HTTP_GET_VARS, z formularza do
$HTTP_POST_VARS, z ciastek do
$HTTP_COOKIE_VARS. W tablice również opakowano dane systemowe:
$HTTP_SERVER_VARS. Problemy zostały rozwiązane - można było już bardzo łatwo zobaczyć, co do skryptu przyszło, dzięki funkcji
print_r() służącej do wyświetlania zawartości tablic. Dane wejściowe już nie mieszały się ze zmiennymi wewnętrznymi i łatwo je można było odróżnić. Ponadto, dzięki odseparowaniu od siebie każdego rodzaju tych danych, nic nie stało na przeszkodzie, aby zadeklarować ciastko
nick, a jednocześnie otrzymać z formularza pole o takiej samej nazwie.
Wszystko fajnie, wszystko pięknie. Dla zachowania zgodności ze starymi skryptami, dodano do konfiguracji PHP specjalną dyrektywę -
register_globals. Domyślnie była wyłączona, a jej uaktywnienie równoznaczne było uaktywnieniu na nowo starej metody pobierania danych, opisanej w pierwszym akapicie. I tu pojawiły się schody, przynajmniej w naszym kraju. Bo o ile Amerykanie żywo interesują się nowinkami technicznymi i błyskawicznie poprawili stare materiały i teksty, o tyle u nas sprawa została całkowicie olana. Autorom kursów (które stanowią dla większości "programistów" PHP praktycznie jedyne źródło wiedzy o tym języku) zupełnie nie zależało na zaktualizowaniu materiałów. Ich czytelnicy aktulizowali sobie PHP i następował ogólny szok - wszystkie skrypty przestały działać! Fora dyskusyjne zostały zalane pytaniami, co się właściwie stało. W zasadzie tu wypada też skrytykować postawę samych programistów, którzy całkowicie zignorowali funkcje "Szukaj" dostępne na forach :).
Kiedy powoli sytuacja zaczęła wracać do normy, twórcy PHP wprowadzili kolejną zmianę, a mianowicie... skrócili nazwy tablic do
$_POST,
$_GET itp., ponadto dodając im właściwości superglobalne (nie trzeba było w funkcjach pisać
global $_POST;). Tym razem jednak pozostawili też poprzednie tablice. Pomimo tego mocno zalecane jest używanie tablic ze skróconymi nazwami, gdyż wcześniejsze są już wyłączone w nadchodzącym PHP 5! Bądź uświadomiony i zaktualizuj swe skrypty już teraz, jeśli dotąd tego nie zrobiłeś.
$_GET, $_POST...
Wszystkie dane przychodzące do naszego skryptu są sortowane i przydzielane do odpowiednich tablic asocjacyjnych:
$_GET - dane z URL
$_POST - dane z formularza
$_COOKIE - dane z ciastek
$_SESSION - dane z sesji
$_SERVER - dane o serwerze
$_ENV - dane nt. środowiska, w jakim uruchamiane jest PHP
$_REQUEST - połączenie $_GET i $_POST |
Są to tablice superglobalne, a więc nie trzeba ich "globalizować" w każdej funkcji. Nic nie stoi na przeszkodzie, byś napisał
function test(){
echo $_GET['test'];
} |
Kod ten wykona się prawidłowo.
Dodatkowo, mamy także możliwość wyświetlenia, co do skryptu przyszło:
Gdybyśmy mieli np. w formularzu pole-tablicę:
<input type="text" name="pole[]"/>
<input type="text" name="pole[]"/>
<input type="text" name="pole[]"/>
<input type="text" name="pole[]"/> |
W skrypcie tablica ta zostanie zapisana w $_POST['pole']. Do elementów można dostać się poprzez
$_POST['pole'][numer]. Aby wyświetlić wszystkie wartości, możemy użyć pętli
foreach:
foreach($_POST['pole'] as $numer => $wartosc){
echo $numer.' => '.$wartosc.'<br/>';
} |
Zakończenie
Jeszcze raz gorąco namawiam do przesiadki już teraz, jeśli tego jeszcze nie zrobiłeś. Nie będziesz mieć dzięki temu żadnych problemów w przyszłości, gdyż wszystkie znaki na niebie i ziemi wskazują, że metoda opisana w tym artykule zostanie już na zawsze.