2. Session proměnné

Obsah

První kroky
A co když někdo nemá rád koláčky

Bez session proměnných se neobejdeme v žádné větší aplikaci. Pomocí session proměnných můžeme odlišit jednotlivé uživatele, kteří s aplikací pracují. Každý návštěvník virtuálního obchodu musí mít vlastní nákupní košík, do kterého si ukládá zboží. Nákupní košík má přitom každý uživatel připojený k aplikaci — v tomto případě je nákupní košík právě session proměnnou.

Session proměnné jsou jedním z nejpohodlnějších způsobů, jak obejít bezstavovost protokolu HTTP. V protokolu HTTP jsou jednotlivé požadavky klientů zcela nezávislé a autonomní operace. Webový server proto neví, které požadavky přicházejí od jednoho uživatele a nemůže je proto předat dál ani PHP. Pokud vás napadne, že uživatele lze identifikovat pomocí IP adresy, tak vás zklamu. Mnoho firem a menších sítí je do Internetu připojeno přes proxy server a tváří se proto, že mají jednu společnou IP adresu.

Poznámka

Malá historka na oživení: Tuto vlastnost si neuvědomila jedna nejmenová česká firma poskytující e-mail zdarma, a tak když se jeden ze zaměstnanců firmy přihlásil ke své poštovní schránce přes webové rozhraní, viděli jeho poštu i všichni ostatní ze stejné firmy, se stejným proxy serverem.

Fint, jak jednotlivé uživatele identifikovat, je několik. Nejpoužívanější je metoda, kdy si webový server, resp. aplikace označí každého uživatele jedinečným identifikátorem (třeba nějakým dlouhým číslem). Identifikátor se pak předává společně s každým požadavkem uživatele. Nejjednodušší je proto pro předávání identifikátoru využít cookies. Ne každý prohlížeč však cookies podporuje — s tím bychom měli počítat. V takových případech můžeme identifikátor předávat jako parametr v URL nebo skryté pole formuláře. To vyžaduje, abychom identifikátor přidávali za každý odkaz a do každého formuláře — je to dost pracné.

Pokud máme uživatele identifikovaného, máme vyhráno. Na serveru si můžeme vyhradit prostor — v paměti, na disku nebo v databázi, kam budeme pro každý identifikátor (tedy uživatele) ukládat proměnné. A session proměnné jsou na světě.

PHP4 obsahuje mechanismus, který umí uživatelům přidělovat jednoznačné identifikátory a umí označit vybrané proměnné jako session proměnné. Session proměnné se přitom mohou ukládat do sdílené paměti nebo do souborů. Pokud vám to nestačí, můžete si nadefinovat vlastní funkce pro ukládání a čtení session proměnných — můžete je pak ukládat třeba do databáze.

První kroky

Použití session proměnných je v PHP velice jednoduché. Musíme si však v konfiguračním souboru php.ini zkontrolovat, zda máme vše správně nastaveno. Standardní nastavení většině uživatelů vyhoví, musíme však zkontrolovat, zda je parametr session.save_path nastaven na nějaký existující adresář, do kterého má webová aplikace práva zápisu. Ukládají se do něj soubory se session proměnnými jednotlivých uživatelů.

Pokud chceme na stránkách používat session proměnné, měli bychom na začátku stránky použít funkci session_start(). Ta nejprve zkontroluje, zda už má uživatel přidělen identifikátor. Pokud ne, přidělí mu ho. Pro existující identifikátor načte všechny existují session proměnné a zpřístupní je jako běžné proměnné skriptu.

Pokud chceme z nějaké proměnné udělat session proměnnou, poslouží nám k tomu funkce session_register(). Jako parametr se předává název proměnné (ne samotná proměnná).

Následující jednoduchý příklad ukazuje, jak můžeme na jedné stránce session proměnnou zaregistrovat a na druhé použít její hodnotu.

Příklad 2.1. Zaregistrování session proměnné — session_prvni.php

<?
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head><title>První stránka se session proměnnou</title></head>
<body>
<?
    session_register("x");
    $x = 10;
?>
Proměnná x je zaregistrována a má hodnotu <?echo $x?>. 
Podívejte se na <a href="session-dalsi.php">další stránku</a>,
kde uvidíte, zda zůstane obsah proměnné $x zachován.
</body>
</html>

Příklad 2.2. Využití session proměnné — session_dalsi.php

<?
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>Testovací stránka</title>
</head>
<body>
Proměnná x má nyní hodnotu <?echo $x?>. 
</body>
</html>
© Jiří Kosek 2000