System wejścia w PHP

Autor: Tomasz Jędrzejewski
Data publikacji: 15.03.2003, 18:31 | Ostatnia modyfikacja: 22.09.2006, 11:51

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Å›.

Do góry

$_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:

<?php
   print_r($_GET);
?>

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/>';
}

Do góry

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.

Autor: Tomasz "Zyx" Jędrzejewski, www.zyxist.com.

Do góry

Waszym zdaniem:

Nikt jeszcze nie dodał swojego komentarza. Możesz być pierwszy!


Twoim zdaniem:

Reklama

banner

Partnerzy

CityDesign.pl
phpSolutions