Professional Documents
Culture Documents
PHP I MySQL Poglavlje 18 Kombib
PHP I MySQL Poglavlje 18 Kombib
Rukovanje sesijama
dana{nje vreme, kori{}enje HTTP sesija za pra}enje perzistentnih informacija, kao {to
U programskom jeziku PHP rukovanje sesijama je dostupno od verzije 4.0 i predstavlja jednu
od najinteresantijih funkcionalnosti, o kojoj se uvek mnogo diskutuje. U ovom poglavlju mo`ete
nau~iti dosta o rukovanju sesijama, izme|u ostalog:
445
PHP i MySQL od po~etnika do profesionalca
Rukovanje sesijama je, u su{tini, veoma pametno re{enje, koje omogu}ava da se zaobi|e prob-
lem vezan za nepostojanje stanja u HTTP protokolu. Svaki posetilac stranice dobija atribut koji
ga jednozna~no identifikuje, poznat kao identifikator sesije (skra}eno SID), a zatim se svi
neophodni podaci povezuju sa tim jednozna~nim identifikatorom sesije, pri ~emu ti podaci
mogu odre|ivati ukupan broj poseta stranici na mese~nom nivou, omiljene boje pozadine ili
srednje slovo - vi ih defini{ete. Sa stanovi{ta relacionih baza podataka, identifikator sesije mo`ete
smatrati primernim klju~em koji se koristi za pristupanje svim ostalim atributima. Ali, na koji
na~in se identifikator sesije neprekidno vezuje za konkretnog korisnika, ukoliko se zna da je
HTTP protokol, zapravo, protokol koji ne defini{e stanja? To vezivanje, za konkretnog korisnika,
mo`ete da ostvarite na dva razli~ita na~ina:
446
Rukovanje sesijama POGLAVLJE 18
Modifikovanje URL adrese: Drugi metod koji se koristi za identifikaciju sesije je vezan
za postavljanje identifikatora sesije na kraj svake lokalne URL adrese zahtevane stran-
ice. Rezultat toga je automatsko prosle|ivanje identifikatora sesije svaki put kada
korisnik pritisne jedan od lokalnih linkova. Ovaj metod, poznat kao modifikovanje
URL adrese, uklanja mogu}nost da rukovanje sesija bude onemogu}eno zato {to koris-
nik ne dozvoljava upotrebu kola~i}a. Me|utim, postoje i odgovaraju}e posledice
primene ovakvog metoda. Prvo, modifikovanje URL adrese ne omogu}ava perzistent-
nost izme|u sesija, zato {to se proces automatskog postavljanja identifikatora sesije na
kraj URL adrese ne nastavlja kada korisnik napusti va{u web prezentaciju. Drugo, ni{ta
ne spre~ava korisnika da iskopira URL adresu u poruku i elektronskom po{tom je
po{alje nekom drugom korisniku; sve dok se ne prekine sesija, ona }e postojati i na
radnoj stanici primaoca ove poruke. Razmotrite potencijalne probleme koji mogu nas-
tati kada oba korisnika simultano pristupaju odre|enim sadr`ajima na va{oj
prezentaciji, a da pri tome koriste isti identifikator sesije, ili ukoliko primaoc poruke
koja sadr`i link ne treba da vidi odre|ene podatke kojima se mo`e pristupati u datoj
sesiji. Zbog toga se preporu~uje metodologija u kojoj se koriste kola~i}i. Me|utim,
isklju~ivo je na vama da defini{ete sve prednosti i nedostatke oba navedena metoda, i
da na kraju odlu~ite {ta vam je ~initi.
Prvi zadatak koji treba da izvr{i stranica na kojoj se obavlja rukovanje sesijama je utvr|ivanje
postojanja validne sesije, {to za posledicu ima kori{}enje postoje}e sesije ili iniciranje nove sesi-
je. Ukoliko ne postoji validna sesija, neophodno je inicirati novu sesiju i povezati je sa odgo-
varaju}im korisnikom, kori{}enjem jednog od metoda za prosle|ivanje identifikatora sesije, koji
su opisani u prethodnom odeljku. PHP omogu}ava identifikovanje postoje}e sesije
pronala`enjem identifikatora sesije, bilo u zahtevanoj URL adresi ili u kola~i}u. Me|utim, to
mo`ete da uradite i programskim putem. Na primer, ukoliko je naziv sesije sid, a ona je postavl-
jena iza odgovaraju}e URL adrese, vrednost mo`ete da o~itate na slede}i na~in:
$_GET['sid']
$_COOKIE['sid']
447
PHP i MySQL od po~etnika do profesionalca
Nakon utvr|ivanja identifikatora sesije, mo`ete po~eti da bele`ite informacije vezane za dati
identifikator sesije, a mo`ete i da o~itate prethodno zabele`ene podatke za taj identifikator sesi-
je. Na primer, pretpostavimo da korisnik pregleda razli~ite novinske ~lanke na odgovaraju}oj
stranici. Identifikatori novinskih ~lanaka mogu da se pove`u sa odgovaraju}im identifikatorom
sesije, tako da mo`ete da napravite listu novinskih ~lanaka kojima je pristupio odgovaraju}i
korisnik, odnosno mo`ete da prika`ete tu listu ukoliko korisnik nastavi sa ~itanjem. U narednim
odeljcima }ete imati priliku da nau~ite kako da snimate, odnosno o~itavate odgovaraju}e
informacije vezane za konkretnu sesiju.
SAVET
Informacije o kola~i}ima mo`ete da o~itavate putem $_REQUEST superglobalne promenljive. Na primer, uko-
liko je naziv sesije sid, tada }ete pomo}u $_REQUEST odrediti identifikator sesije, kao da ste koristili $_COOK-
IE['sid']. Me|utim, da bi bilo jasnije, razmotrite kori{}enje superglobalne promenljive koja se na najbolji
na~in uklapa sa mestom nastanka promenljive.
Ovaj proces se nastavlja sve dok korisnik ne zatvori Web ~ita~ ili ne pristupi nekoj drugoj web
prezentaciji. Ukoliko se koriste kola~i}i, tada se defini{e trajanje kola~i}a tako {to se odredi neki
datum u budu}nosti, uz pretpostavku da }e korisnik ponovo pristupiti va{oj prezentaciji pre iste-
ka tog roka, ~ime }e sesija ostati nepromenjena, kao da korisnik nije ni napu{tao va{u web
prezentaciju. Ukoliko koristite modifikovanje URL adrese, sesija se zavr{ava onda kada korisnik
napusti stranicu, a nova sesija mora da po~ne slede}i put kada korisnik poseti stranicu. U nared-
nim odeljcima }ete imati priliku da nau~ite ne{to vi{e o konfiguracionim direktivama i funkcija-
ma koje su odgovorne za izvr{avanje prethodno opisanog procesa.
Konfiguracione direktive
Postoji skoro 30 konfiguracionih direktiva koje se koriste za rukovanje sesijama u programskom
jeziku PHP. Po{to mnoge od ovih direktiva igraju veoma zna~ajnu ulogu u utvr|ivanju
funkcionisanja celokupnog PHP okru`enja, trebalo bi da posvetite odre|eno vreme kako biste u
potpunosti ovladali ovim direktivama i mogu}im pode{avanjima. Najzna~ajnije direktive su
opisane u ovom odeljku.
session.save_handler = files|mm|sqlite|user
Podaci o sesiji se mogu sme{tati na ~etiri na~ina: unutar obi~nih datoteka (files), u privre-
menoj memoriji (mm), kori{}enjem SQLite baze podataka (sqlite), ili putem korisni~ki defin-
isanih funkcija (user). Iako je podrazumevano pode{avanje vezano za sme{tanje podataka o sesi-
jama u obi~nim datotekama ne{to {to }e zadovoljiti zahteve vezane za veliki broj stranica, vodite
448
Rukovanje sesijama POGLAVLJE 18
ra~una o tome da aktivne web stranice mogu da imaju i po nekoliko hiljada datoteka sa podaci-
ma o sesijama, pa ~ak i nekoliko stotina hiljada takvih datoteka nakon odre|enog perioda
funkcionisanja.
session.save_path = string
Prema definiciji, session.save_path direktiva ima vrednost /tmp. Vodite ra~una o tome da direk-
torijum ne sme da bude postavljen u korenom direktorijumu servera, zato {to ovi podaci mogu
veoma jednostavno da budu prikazivani u Web ~ita~u. Pored toga, ovaj direktorijum mora da
bude dostupan za upisivanje.
449
PHP i MySQL od po~etnika do profesionalca
session.auto_start = 0|1
Jedna od posledica kori{}enja ove direktive je da se spre~ava sme{tanje objekata u toku sesije,
zato {to definicija klase mora da bude u~itana pre nego {to se po~ne sa sesijom, kako bi se
objekti ponovo kreirali. Po{to session.auto_start direktiva mo`e to da spre~i, neophodno je da
defini{ete vrednost 0 ukoliko `elite da upravljate objektima unutar sesija.
session.name = string
session.use_cookies = 0|1
450
Rukovanje sesijama POGLAVLJE 18
session.use_trans_sid = 0|1
Ne iznena|uje da, ukoliko koristite modifikovanje URL adresa, treba da omogu}ite ovu direk-
tivu, kako biste eliminisali mogu}e ljudske gre{ke u procesu modifikovanja.
session.cookie_lifetime = integer
Vreme `ivota je definisano u sekundama, pa ukoliko kola~i} mo`e da se koristi jedan sat,
neophodno je da ceo broj bude 3600. Ukoliko je u direktivi naveden broj 0 (podrazumevana
vrednost), tada }e kola~i} da egzistira sve dok se ~ita~ ponovo ne startuje.
session.cookie_path = string
Na primer, ukoliko je u direktivi naveden /, tada je kola~i} validan za celu web prezentaciju.
Navo|enje /books direktorijuma uzrokuje da kola~i} bude validan samo ukoliko se poziva unutar
http://www.example.com/books/ putanje.
session.cookie_domain = string
session.cookie_domain = www.example.com
451
PHP i MySQL od po~etnika do profesionalca
Ukoliko `elite da odgovaraju}a sesija bude dostupna u razli~itim poddomenima va{e web
prezentacije, recimo domenima customers. example.com, intranet.example.com i www2.example.com,
tada je neophodno da direktivu iskoristite na slede}i na~in:
session.referer_check = string
session.cache_limiter = string
private: Ukoliko ke{irani dokument ozna~ite kao privatan, zna~i da }e dokument biti
raspolo`iv isklju~ivo originalnom korisniku. Ovaj dokument ne}e mo}i da se deli sa
drugim korisnicima.
452
Rukovanje sesijama POGLAVLJE 18
session.cache_expire = integer
session.gc_maxlifetime = ceobroj
Nakon {to istekne definisani vremenski interval, uklanjaju se sve informacije vezane za sesiju,
odnosno osloba|aju svi sistemski resursi, koji se mogu dodeljivati nekoj drugoj sesiji.
Kori{}enje sesija
U ovom odeljku su opisani brojni klju~ni zadaci vezani za rukovanje sesijama, koji se realizuju
pomo}u odgovaraju}ih funkcija za upravljanje sesijama. Neki od ovih zadataka podrazumevaju
kreiranje i uklanjanje sesija, definisanje i o~itavanje identifikatora sesije, odnosno sme{tanje i
o~itavanje promenljivih vezanih za sesije. U ovom uvodu su prikazane osnove neophodne za
razumevanje narednog odeljka, u kome su navedeni neki prakti~ni primeri vezani za upravljanje
sesijama.
Kreiranje sesije
Zapamtite da je HTTP protokol bez stanja, tako da ne sadr`i nikakve informacije o prethodnim
ili budu}im pona{anjima korisnika. Zbog toga je neophodno da eksplicitno inicirate sesiju, a
zatim je nastavite kada je to neophodno. Oba zadatka se realizuju pomo}u session_start() funkci-
je. Prototip ove funkcije je slede}eg oblika:
boolean session_start()
Izvr{avanjem session_start() funkcije kreira}e se nova sesija ukoliko nije definisan nijedan
identifikator sesije, ili }e se nastaviti prethodno zapo~eta sesija ukoliko postoji odgovaraju}i iden-
tifikator sesije. Ovu funkciju koristite veoma jednostavno, tako {to }ete je izvr{iti na slede}i na~in:
session_start();
453
PHP i MySQL od po~etnika do profesionalca
Uklanjanje sesije
Iako mo`ete da konfiguri{ete PHP direktive za rukovanje sesijama, kako bi se automatski ukloni-
la sesija nakon isteka unapred definisanog vremena za trajanje sesije ili na osnovu verovatno}e,
ponekad je mnogo korisnije da ru~no uklonite sesiju. Na primer, mo`da `elite da omogu}ite da
korisnik samostalno napusti stranicu tako {to se izloguje. Kada korisnik pritisne odgovaraju}i
link, vi mo`ete da uklonite iz memorije sve promenljive koje su vezane za tu sesiju, pa ~ak i da u
potpunosti uklonite podatke o sesiji sa odgovaraju}eg memorijskog medijuma, {to se realizuje
pomo}u funkcija session_unset() i session_destroy(), respektivno.
void session_unset()
boolean session_destroy()
454
Rukovanje sesijama POGLAVLJE 18
<?php
session_start();
echo "Your session identification number is ".session_id();
?>
<?php
session_start();
$_SESSION['username'] = "jason";
printf("Your username is %s.", $_SESSION['username']);
?>
<?php
session_start();
$_SESSION['username'] = "jason";
printf("Your username is: %s <br />", $_SESSION['username']);
unset($_SESSION['username']);
printf("Username now set to: %s", $_SESSION['username']);
?>
455
PHP i MySQL od po~etnika do profesionalca
UPOZORENJE
Mo`da }ete imati priliku da se susretnete sa nekim starijim dokumentima i diskusijama koje ukazuju na
funkcije session_register() i session_unregister(), koje su nekada bile preporu~eni na~in za kreiranje
i uklanjanje promenljivih vezanih za sesije, respektivno. Me|utim, zato {to ove funkcije zavise od konfigu-
racione direktive register_globals, koja je prema definiciji onemogu}ena po~ev{i od PHP verzije 4.2.0,
odnosno u potpunosti uklonjena u PHP verziji 6.0, umesto toga trebalo bi da koristite metode za dodelji-
vanje i uklanjanje promenljivih koji su opisani u ovom odeljku.
Svaka referenca na promenljivu sesije je izdvojena ta~kom i zarezom, i sastoji se od tri kom-
ponente: naziva, du`ine i vrednosti. Op{ti oblik sintakse je:
name|s:length:"value";
Na sre}u, PHP autonomno rukuje kodiranjem i dekodiranjem sesije. Me|utim, ponekad }ete
mo`da po`eleti da izvr{ite i ru~no ove zadatke. Na raspolaganju imate dve funkcije:
session_encode() i session_decode(), respektivno.
string session_encode()
Nakon toga, ovaj string mo`ete da postavite u bazu podataka, odnosno mo`ete ga kasnije
o~itavati, odnosno dekodirati pomo}u session_decode() funkcije.
456
Rukovanje sesijama POGLAVLJE 18
<?php
// Iniciranje sesije i kreiranje nekoliko promenljivih sesije
session_start();
Vodite ra~una o tome da session_encode() funkcija kodira sve promenljive sesije koje su
definisane za posmatranog korisnika, a ne samo one koje su vezane za konkretan skript u kome
se izvr{ava session_encode() funkcija.
457
PHP i MySQL od po~etnika do profesionalca
<?php
session_start();
$sid = session_id();
session_decode($sessionVars);
?>
Cilj ovog hipoteti~kog primera bio je da vam demonstrira kori{}enje PHP funkcija za kodiran-
je i dekodiranje. Ukoliko zaista `elite da snimate podatke vezane za sesije u bazu podataka, za to
postoji mnogo efikasniji metod, koji podazumeva definisanje odgovaraju}eg rukovaoca sesijama,
odnosno postavljanje tih rukovaoca direktno u API interfejs PHP okru`enja. Kako se ovo
realizuje, prikazano je kasnije u toku ovog poglavlja.
NAPOMENA
Ukoliko niste do sada koristili MySQL bazu podataka i zbunjeni ste sintaksom koja je iskori{}ena u slede}im
primerima, obratite pa`nju na tekst koji se nalazi u poglavlju 30.
458
Rukovanje sesijama POGLAVLJE 18
NAPOMENA
Prema definiciji, session.cookie_lifetime konfiguraciona direktiva ima vrednost 0, {to zna~i da se kola~i}
uklanja prilikom restartovanja ~ita~a. Zbog toga bi trebalo da ovu vrednost promenite, tako da predstavlja
broj sekundi, kako biste omogu}ili da sesija postoji odgovaraju}i vremenski period.
Kod (koji se nalazi u login.html datoteci) koji je prikazan u slede}em primeru, koristi se za
prikazivanje forme za prijavu, ukoliko ne postoji validna sesija za odgovaraju}eg korisnika:
<p>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Username:<br /><input type="text" name="username" size="10" /><br />
Password:<br /><input type="password" name="pswd" SIZE="10" /><br />
<input type="submit" value="Login" />
</form>
</p>
459
PHP i MySQL od po~etnika do profesionalca
<?php
session_start();
$username = mysqli_real_escape_string($_POST['username']);
$pswd = mysqli_real_escape_string($_POST['pswd']);
$_SESSION['username'] = mysql_result($result,0,"username");
echo "You've successfully logged in. ";
}
// Ukoliko korisnik nije prethodno prijavljen na sistem, prikazuje se
forma za prijavljivanje.
} else {
include "login.html";
}
460
Rukovanje sesijama POGLAVLJE 18
Po{to su danas korisnici zatrpani razli~itim korisni~kim imenima i {iframa, koje omogu}avaju
pristupanje razli~itim sistemima i kori{}enje razli~itih usluga, od provere elektronske po{te i
produ`avanja iznajmljivanja knjiga iz biblioteke, do pregledanja stanja na bankovnom ra~unu,
obezbe|ivanje automatskog prijavljivanja, kada to situacija dozvoljava, bi}e veoma dobro prih-
va}eno od strane korisnika va{e aplikacije.
Re{enje je iznena|uju}e jednostavno, ali je veoma efektno. Da biste zapamtili koja je doku-
menta ~itao posmatrani korisnik, neophodno je da pomo}u jedinstvenog identifikatora identi-
fikujete svakog pojedina~nog korisnika i svaki pojedina~ni dokument. Kada se radi o korisniku,
ovaj zahtev ispunjava identifikator sesije. Dokumenti se mogu identifikovati na koji god na~in
`elite, ali u ovom primeru se koristi naslov rada i URL adresa, odnosno pretpostavlja se da je ova
informacija definisana podacima koji se nalaze u bazi podataka, u tabeli articles, koja je slede}eg
oblika:
<?php
// Kreiranje nove sesije
session_start();
// Povezivanje na server i selektovanje baze podataka
mysql_connect("localhost","webuser","secret");
mysql_select_db("chapter18");
// Ocitavanje zeljenog identifikatora clanka
$articleid = mysqli_real_escape_string($_GET['id']);
461
PHP i MySQL od po~etnika do profesionalca
Izvr{avanjem prethodnog primera dobija se rezultat sli~an onom koji je prikazan na slici 18.1.
462
Rukovanje sesijama POGLAVLJE 18
zadataka (definisanih u daljem tekstu) vezanih za kori{}enje lokacija za sme{tanje. Pored toga,
neophodno je da defini{ete parametre za svaku pojedina~nu funkciju, nezavisno od toga da li
va{a konkretna implementacija koristi parametar. U ovom odeljku definisana je namena i struk-
tura ovih {est funkcija. Pored toga, opisana je i session_set_save_handler() funkcija, koja se koristi
za magi~no transformisanje funkcionisanja PHP rukovaoca sesijama u ono {to ste definisali
odgovaraju}im funkcijama. Kona~no, ovaj odeljak sadr`i demonstraciju ove funkcionalnosti,
koja je implementirana pomo}u MySQL baze podataka. Ovu biblioteku mo`ete da koristite u
svojim aplikacijama, koriste}i MySQL tabelu kao primarnu lokaciju za sme{tanje informacija o
pojedina~nim sesijama.
session_open($session_save_path, $session_name): Ova funkcija inicijalizuje sve elemente
koji mogu da se koriste u toku sesije. Dva ulazna parametra, $session_save_path i $ses-
sion_name, ukazuju na istoimene konfiguracione direktive, koje se nalaze u php.ini
konfiguracionoj datoteci. PHP funkcija get_cfg_var() se koristi za o~itavanje ovih kon-
figuracionih vrednosti u nekim od primera koji slede.
session_close(): Ova funkcija funkcioni{e sli~no standardnim funkcijama za rukovan-
je, pri ~emu se osloba|aju svi resursi koji su zauzeti pomo}u session_open() funkcije.
Kao {to mo`ete da primetite, ne postoje ulazni parametri za ovu funkciju. Vodite
ra~una o tome da na ovaj na~in ne}ete u potpunosti ukloniti sesiju. To je posao ses-
sion_destroy() funkcije, koja je opisana na kraju ove liste funkcija.
session_read($sessionID): Ova funkcija se koristi za o~itavanje podataka vezanih za
sesiju, koji su sme{teni na nekom medijumu. Ulazni parametar, $sessionID, ukazuje na
identifikator sesije koji }e se koristiti prilikom identifikovanja podataka vezanih za
konkretnog korisnika.
session_write($sessionID, $value): Ova funkcija se koristi za upisivanje podataka,
vezanih za odgovaraju}u sesiju, na meki medijum za sme{tanje. Ulazni parametar,
$sessionID, je naziv promenljive, a ulazni parametar $sessionID, defini{e podatke
vezane za odgovaraju}u sesiju.
session_destroy($sessionID): Ova funkcija je verovatno poslednja koju }ete izvr{avati u
va{em skriptu. Ona se koristi za uklanjanje sesije i svih promenljivih koje su vezane za
tu sesiju. Ulazni parametar $sessionID ukazuje na identifikator sesije, kojim je defin-
isana trenutno aktivna sesija.
session_garbage_collect($lifetime): Ova funkcija se koristi za efikasno uklanjanje
svih sesija, ~ije je vreme trajanja isteklo. Ulazni parametar $lifetime ukazuje na ses-
sion.gc_maxlifetime konfiguracionu direktivu sesije, koja se nalazi u php.ini datoteci.
463
PHP i MySQL od po~etnika do profesionalca
sasvim proizvoljno da dajete, ali da morate da defini{ete odgovaraju}i broj i tip parametara,
kao {to je navedeno u prethodnom odeljku, i da oni moraju biti prosle|eni do
session_set_save_handler() funkcije, u slede}em redosledu: open, close, read, write, destroy i
garbage collect.
Slede}a MySQL tabela, sessioninfo, koristi se za sme{tanje podataka vezanih za sesije. Kada se
radi o ovom konkretnm primeru, pretpostavimo da se ova tabela nalazi u odgovaraju}im sesija-
ma za rad sa bazama podataka, iako ovu tabelu mo`ete da postavite gde god `elite.
Listing 18.2 sadr`i definisane MySQL funkcije za rad sa sesijama. Uo~ite da su definisani svi
neophodni rukovaoci, da je obezbe|en odgovaraju}i broj parametara koji se prosle|uju,
nezavisno od toga koji se parametri koriste u samim funkcijama.
464
Rukovanje sesijama POGLAVLJE 18
Listing 18.2. Rukovalac sesijama, koji koristi podatke iz MySQL baze podataka
<?php
/*
* mysql_session_open()
* Otvara se perzistentna konekcija i selektuje baza podataka.
*/
mysql_select_db("sessions")
or die("Can't select MySQL sessions database");
} // end mysql_session_open()
/*
* mysql_session_close()
* Nista se, zapravo, ne izvrsava dok je konekcija sa serverom
* perzistentna. Vodite racuna o tome da, iako
* ne radi nista u konkretnoj implementaciji,
* ova funkcija mora biti definisana.
*/
function mysql_session_close() {
return 1;
} // end mysql_session_close()
/*
* mysql_session_select()
* Iz baze podataka ocitavaju se podaci vezani za sesiju
*/
465
PHP i MySQL od po~etnika do profesionalca
function mysql_session_select($SID) {
$result = mysql_query($query);
if (mysql_num_rows($result)) {
$row=mysql_fetch_assoc($result);
$value = $row['value'];
return $value;
} else {
return "";
}
} // end mysql_session_select()
/*
* mysql_session_write()
* Ova funkcija se koristi za upisivanje podataka, vezanih za sesiju, u bazu podataka.
* If that SID already exists, then the existing data will be updated.
*/
466
Rukovanje sesijama POGLAVLJE 18
$result = mysql_query($query);
if (! $result) {
$result = mysql_query($query);
}
} // end mysql_session_write()
/*
* mysql_session_destroy()
* Deletes all session information having input SID (only one row)
*/
function mysql_session_destroy($SID) {
$result = mysql_query($query);
} // end mysql_session_destroy()
467
PHP i MySQL od po~etnika do profesionalca
/*
* mysql_session_garbage_collect()
* Deletes all sessions that have expired.
*/
function mysql_session_garbage_collect($lifetime) {
$result = mysql_query($query);
return mysql_affected_rows($result);
} // end mysql_session_garbage_collect()
?>
Nakon {to defini{ete ove funkcije, mo`ete ih povezati u PHP logiku za rukovanje izvr{avanjem
session_set_save_handler() funkcije. Slede}i kod treba da se na|e na kraju biblioteke, koja je
definisana u listingu 18.2:
session_set_save_handler("mysql_session_open", "mysql_session_close",
"mysql_session_select",
"mysql_session_write",
"mysql_session_destroy",
"mysql_session_garbage_collect");
<?php
INCLUDE "mysqlsessionhandlers.php";
session_start();
$_SESSION['name'] = "Jason";
?>
Nakon izvr{avanja ovog skripta, pogledajte sadr`aj sessioninfo tabele, kori{}enjem mysql
klijenta:
468
Rukovanje sesijama POGLAVLJE 18
+---------------------------------------+-------------------+-------------------
+
| SID | expiration | value |
+---------------------------------------+-------------------+-------------------
+
| f3c57873f2f0654fe7d09e15a0554f08 | 1068488659 | name|s:5:"Jason"; |
+---------------------------------------+-------------------+-------------------
+
1 row in set (0.00 sec)
Kao {to ste i o~ekivali, u tabelu je uba~ena odgovaraju}a vrsta, koja sadr`i identifikator sesije i
promenljivu sesije "Jason". Ova informacija je postavljena tako da istekne 1440 sekundi nakon
kreiranja; ova vrednost se izra~unava utvr|ivanjem trenutnog broja sekundi od po~etka Unix
epohe, i dodavanjem vrednosti 1440 na tu vrednost. Uo~ite da iako je 1440 podrazumevano
vreme za isticanje sesije, kao {to je definisano u php.ini datoteci, ovu vrednost mo`ete sasvim slo-
bodno da promenite nekom vredno{}u koja vam odgovara.
Uo~ite da ovo nije jedini na~in za implementiranje ovih procedura, ukoliko se koristi MySQL
baza podataka. Ovu biblioteku mo`ete i samostalno da modifikujete, onako kako vama
odgovara.
U narednom poglavlju je opisana jo{ jedna veoma zna~ajna napredna, ali istovremeno i veoma
zna~ajna tema: kori{}enje {ablona. Izdvajanje logike aplikacije od prezentacije je tema o kojoj se
neprekidno puno govori i pi{e, i to s razlogom; ukoliko izme{ate logiku aplikacije i na~in prikazi-
vanja podataka, stvori}ete sebi veliki problem u procesu odr`avanja va{e aplikacije. Do sada je
izdvajanje logike i prezentacije u web aplikacijama bilo veoma retko prakti~no primenjivano. Ali,
to jednostavno mora da se uradi na taj na~in!
469
470