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