Invata PHP cu punctsivirgula.ro

I. Introducere
II. Notiuni de baza
III. Notiuni avansate
IV. Aplicatii
V. Extra
C O N T I N U T
Sesiuni in PHP

Sesiuni in PHP    0 ! 

Sesiunile, reprezinta o functionalitate prin care anumite informatii sunt mentinute de la o pagina la alta. O sesiune dureaza atat timp cat utilizatorul acceseaza un site si se incheie odata cu inchiderea browserului.


Requesturi stateless si necesitatea sesiunilor

Accesarea unei pagini web este o operatie de sine statatoare (stateless, sau fara stare). Asta inseamna ca orice accesare ulterioara a aceleiasi pagini (spre exemplu un refresh) se va face fara ca serverul "sa stie" de accesarile anterioare. La fel se intampla si atunci cand sunt accesate mai multe pagini diferite una dupa alta.

Spre exemplu, daca un utilizator acceseaza pagina a.php si apoi b.php, codul PHP din a doua pagina (b.php) nu poate sti ce "s-a intamplat" in a.php. Sa luam urmatorul exemplu: in a.php se defineste o variabila ca mai jos

$text = 'Mesaj din prima pagina';

In b.php exista o bucata de cod care afiseaza variabila $text

echo $text;

Datorita naturii stateless a requesturilor pagina b.php nu va afisa nimic, intrucat variabilele si toate operatiunile executate in pagina a.php nu se pastreaza de la o cerinta la alta. In mod implicit nu exista nici o modalitate de a face legatura intre cele doua accesari, si prin urmare informatiile de pe prima pagina "traiesc" doar in cadrul accesarii paginii respective si se pierd cand executia scriptului din a.php se termina.

Acest design poate ridica probleme, in special in aplicatiile complexe, pentru ca informatiile nu persista de la o pagina la alta. Este adevarat ca exista cateva moduri prin care mici cantitati de date pot fi transmise catre o alta pagina - spre exemplu, prin formulare (vezi lectia Formulare in PHP), dar acestea nu sunt viabile pentru aplicatii mari, cum ar fi o aplicatie de email, sau un site e-commerce. Din fericire, PHP ofera posibilitatea de a persista informatiile pe parcursul navigarii, prin intermediul sesiunilor (sessions).


Sesiuni in PHP

In PHP o sesiune reprezinta perioada de timp in care mai multe scripturi PHP, accesate la momente diferite de timp, pot stoca si folosi informatii comune. O sesiune incepe atunci cand un script apeleaza functia session_start si se termina atunci cand utilizatorul inchide browserul (exista si alte modalitati de a porni o sesiune, dar nu sunt prea uzuale - folosirea comenzii session_start este metoda recomandata).

O sesiune se intinde pe mai multe requesturi (pe parcursul a mai multor accesari ale diferitelor pagini), iar pentru a identifica existenta unei sesiuni PHP poate folosi cookie-uri sau parametrii GET un URL-ul paginii.

Nimic de afisat.


Adauga un comentariu la aceasta sectiune.

 


Mecanismul de functionare a sesiunilor in PHP    0 ! 

In momentul in care un script apeleaza functia session_start pentru prima data intr-o sesiune de lucru, se transmite un cookie catre browserul clientului (un header de tipul 'Set-Cookie', vezi lectia Cookie-uri). Fiind vorba de un cookie, este necesar ca functia session_start sa fie apelata inaintea oricarei instructiuni ce afiseaza ceva (print, echo, etc) si inaintea oricarui cod HTML. Cookie-ul transmis contine un identificator ce poarta numele de Session ID, pe baza caruia se poate face distinctie intre sesiunea curenta si alte sesiuni ale altor utilizatori ce acceseaza site-ul in acel moment.

In cazul in care browserul utilizatorului nu accepta cookie-uri, identificatorul de sesiune va fi transmis printr-un parametru GET, in forma script.php?PHPSESSID=[session id] (se va face practic un redirect automat la aceeasi pagina avand specificat parametrul in URL). Este apoi responsabilitatea programatorului sa includa manual acest identificator in toate celelalte link-uri de pe pagina, asigurandu-se ca toate paginile vor fi accesate cu acest parametru. Aceste situatii sunt insa rare, iar in exemplele ce urmeaza vom considera ca browserele au mereu cookie-urile activate, astfel ca nu va trebui sa avem grija sa transmitem manual Session ID-ul.

In momentul in care se acceseaza din nou aceeasi pagina, sau o alta din cadrul aceluiasi site, identificatorul de sesiune este transmis de catre browser (ca orice cookie existent in browser). Astfel, orice script PHP are acces la Session ID-ul creat initial, fiind capabil sa acceseze sesiunea corecta. Mai este nevoie de ceva insa: pentru a putea avea acces la informatiile persistate, un script trebuie sa apeleze session_start. De aceasta data, existand deja un Session ID disponibil, PHP va sti ca nu trebuie creata o sesiune noua ci continuata una existenta. Asadar, session_start are doua functionalitati: sa porneasca o sesiune noua (atunci cand nu exista un Session ID) sau sa continue o sesiune existenta, identificata printr-un Session ID.

Functiile principale de manipulare a sesiunii sunt prezentate mai jos. Exista o functie care returneaza Session ID-ul curent: session_id. Aceasta este utila cand este nevoie ca identificatorul sa fie transmis in URL. Alternativ se poate folosi constanta globala SID. De asemenea exista o functie pe permite inchiderea unei sesiuni pe parcursul executiei scriptului curent. Inchiderea sesiunii inseamna oprirea posibilitatii de a scrie/citi date, nu stergerea datelor salvate deja. Datele raman salvate si pot fi accesate din nou dupa apelarea functiei session_start.

<?php
session_start();
 
echo session_id();
 
echo SID; // are acelasi efect ca instructiunea anterioara
 
session_write_close(); // permite inchiderea sesiunii in scriptul curent
?>

Accesarea datelor

Din momentul in care scriptul PHP apeleaza session_start, acesta poate incepe deja sa stocheze date ce vor fi persistate. In limbajul programatorilor de PHP se foloseste expresia "sa pastreze date in sesiune" sau "pe sesiune". Aceste date sunt gestionate de catre limbajul PHP (salvate, preluate, etc) si nu este esential pentru programator sa cunoasca mecanismul intern de manipulare a acestora. Poate deveni important, totusi, atunci cand se doreste definirea unui mecanism particularizat de gestionare a sesiunii, dar aceasta reprezinta o facilitate avansata a limbajului PHP care depaseste nivelul acestor lectii.

Salvarea datelor pe sesiune se face prin intermediul vectorului super-global $_SESSION. Exista si o functie ce permite inregistrarea datelor pe sesiune (nu si modificarea lor), dar folosirea acesteia nu este recomandata. Functia se numeste session_register si a fost marcata ca invechita in versiunea 5.3 a limbajului PHP. Citirea datelor persistate se poate realiza tot prin intermediul $_SESSION.

<?php
session_start();
 
// inregistrarea datelor in sesiune
$_SESSION[ 'text' ] = 'Mesaj persistat';
 
// citirea din sesiune
echo $_SESSION[ 'text' ];
 
// pe sesiune se pot inregistra aproape orice tipuri de date
$vector = array('a', 'b', 'c');
$_SESSION[ 'litere' ] = $vector;
 
// accesez o parte din vectorul stocat
echo $_SESSION[ 'litere' ][0];  // afiseaza a
echo $_SESSION[ 'litere' ][2];  // afiseaza c
?>

Scrierea si citirea datelor de sesiune se realizeaza practic la fel ca manipularea unui vector asociativ, ceea ce face aceasta functionalitate usor de folosit.

Nimic de afisat.


Adauga un comentariu la aceasta sectiune.

 


Aplicatie: sa se transmita o informatie de la o pagina la alta folosind sesiunile PHP    4 ! 

Urmand exemplul de la inceputul paginii, sa construim cele doua fisiere a.php si b.php pentru a putea pastra textul de la o accesare la alta.
In primul fisier stochez date pe sesiune, urmand ca acestea sa fie citite de pe sesiune in al doilea fisier.

<?php
 
// a.php
session_start(); // pornesc sesiunea pentru a putea stoca o variabila
 
$_SESSION[ 'text' ] = 'Mesaj de pe prima pagina';
 
echo '<a href="b.php">Mergeti la pagina urmatoare</a>';
 
?>

Dupa accesarea paginii a.php ar trebui sa existe deja o sesiune creata ce are stocata variabila text. Scriptul din b.php va accesa aceasta sesiune, tot prin session_start si va citi datele inregistrate anterior.

<?php
 
// b.php
session_start(); // continuam o sesiune existenta
 
echo $_SESSION[ 'text' ]; // afisam informatia
 
?>
ovidiu a spus despre sesiuni - 09.07.2012

f util si la obiect !

Bogdan a spus Numele siteului - 11.03.2013

Ai uitat numele siteului. Trebuie pus dupa "session_start()" in b.php

Eugen a spus Eroare de sintaxa - 19.03.2013

Ar trebui de adaugat in b.php un (;) de incheiere a instructiunei session_start() astfel b.php va arata:
<?php

// b.php
session_start(); // continuam o sesiune existenta

echo $_SESSION[ 'text' ]; // afisam informatia

?>

Alexandru a spus Eroare de sintaxa - 19.03.2013

Corect, asa este. Am corectat exemplul. Multumesc!


Adauga un comentariu la aceasta sectiune.