Przekazywanie zmiennych między stronami

Formularze

Bardzo często zachodzi potrzeba przekazania pewnych danych do strony, na przykład w celu personalizacji wyświetlanych informacji. 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 znajdują się w zmiennych o nazwach takich, jak nazwy pól w formularzu. Najlepiej przedstawić to na przykładzie:

Plik jeden.html:

<form action="dwa.php" method="get">

Imię: <input name="imie" type="text" />

Nazwisko: <input name="nazwisko" type="text" />

Proszę o fakturę do zamówienia: <input name="faktura" type="checkbox" />

Chcę zamówić:

<input name="zamow" value="c" type="radio" />Coca-colę

<input name="zamow" value="f" type="radio" />Fantę

<input name="zamow" value="s" type="radio" />Sprite'a

<input value="Wyślij" type="submit" />

Plik dwa.php:

<?
 
    echo "Imię: $_GET[imie]
Nazwisko: $_GET[nazwisko]
Faktura: ";

    if ($_GET['faktura'] == 'on')
        echo 'Tak';
    else
        echo 'Nie';

    echo '
Zamówienie: ';

    switch ($_GET['zamow']) {
        case 'c':
            echo 'Coca-cola';
            break;
        case 'f':
            echo 'Fanta';
            break;
        case 's':
            echo 'Sprite';
            break;
    }

?>

Linki

Istnieje możliwość przekazywania niedużej liczby parametrów za pomocą zwykłych linków dostępnych w języku HTML. W takim przypadku wykorzystuje się metodę GET – konstruuje się link, na końcu którego należy umieścić znak zapytania, a po nim oddzielone znakami ampersand (&) pary parametr=wartość, np:

<a href="strona.php?imie=Jak&nazwisko=Kowalski">Kliknij tu.

Cookies (ciasteczka)

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ę za 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ęd zie 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().

<?
 
   // 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.

Sesje

Mechanizm sesji był najważniejszą ze zmian oczekiwanych w PHP4. Umożliwia on przekazywanie parametrów między stronami w łatwy sposób. Zmienne są przechowywane po stronie serwera a u klienta trzymane jest tylko ID sesji. Te ID jest zapisane w cookie lub przekazywane przez URL. PHP jest w stanie sam rozpoznać czy na komputerze klienta włączony jest mechanizm cookies i w razie potrzeby dodać identyfikator sesji do każdego URLu i formularza. Wymaga to jednak posiadania PHP skompilowanego z opcją –enable-trans-sid.

Jako że sesje mogą bazować na ciasteczkach, także i w tym przypadku przed rozpoczęciem sesji do przeglądarki nie mogą być wysłane żadne inne dane.

Po otrzymaniu żądania klienta PHP automatycznie (jeśli w konfiguracji PHP włączona została opcja auto_start) lub “ręcznie” przez programistę (za pomocą funkcji session_start()) sprawdza, czy przypisano już ID sesji. Jeśli tak, to PHP odczytuje zmienne zarejestrowane w tej sesji. Jeśli nie, generowany jest nowy, unikalny identyfikator sesji.

W PHP 4.1.0 wprowadzone zostały opisane wcześniej zmienne superglobalne. Jedna z tych zmiennych, $_SESSION, przechowuje zmienne zarejestrowane w sesji. Kluczem tej tablicy jest oczywiście nazwa zarejestrowanej zmiennej.

Tablica ta ma jednak pewną różnicę w stosunku do innych tablic superglobalnych. Mianowicie można jej użyć do rejestrowania zmiennych sesyjnych. Wystarczy przypisać wartość odpowiedniemu kluczowi tej tablicy aby zmienna została zarejestrowana.

Przykład: zliczanie ile dana osoba odczytała daną stronę w czasie jednej sesji.

<?
 
    
session_start(); // można pominąć jeśli jest się pewnym że włączona jest 
opcja auto_start
if (!isset($_SESSION['count'])) { // jeśli zmienna nie jest zarejestrowana
    $_SESSION['count'] = 0;      // przypisz jej początkową wartość
} else {                          // jeśli jest zarejestrowana
    $_SESSION['count']++;        // zwiększ jej wartość
}
echo 'Strona odczytana '.$_SESSION['count'].' razy w ciągu tej sesji';
?>

Skrypt z tego przykładu będzie pamiętał ilość odwiedzin przez cały czas działania przeglądarki, jeśli w przeglądarce włączony jest mechanizm cookies, lub dopóki strona odświeżana jest z takim samym numerem sesji przekazanym przez URL.

Użycie sesji rodzi pewne wątpliwości: co jeśli ktoś ‘ukradnie’ numer sesji? W ten sposób uzyska dostęp do danych zapisanych w tej sesji. Mimo że istnieje taka teoretyczna możliwość, to ilość dostępnych identyfikatorów sesji jest tak duża, że taka ‘kradzież’ byłaby całkiem przypadkowa.

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.

WAŻNE! W sieci home.pl dyrektywa register_globals jest domyślnie wyłączona.
  • Czy artykuł był pomocny?
  • TAK   Nie
Tematy powiązane
Więcej informacji na forum dyskusyjnym:   Kliknij tutaj, aby przejść na forum.home.pl