dilluns, 17 de març del 2014

PHP. Sessions

Variables de sessions. Sessions a PHP

Una variable de sessió PHP s'utilitza per emmagatzemar informació sobre l'usuari, ja sigui de les seves preferències de navegació , o sobre la configuració d'una sessió d'usuari.

Les variables de sessió contenen informació sobre un sol usuari, i estan disponibles per a totes les pàgines en una sola aplicació.

Per exemple, en una tenda virtual quan l'usuari va a pagar definitivament la comanda, la pàgina haurà de "recordar" què productes ha seleccionat prèviament.  

Un altre ús molt freqüent de les sessions és l'autenticació en pàgines restringides mitjançant usuari i password. Mitjançant PHP cal comprovar que les dades introduïdes per l'usuari en el formulari d'autenticació són vàlids en la base de dades, i si és així iniciar una sessió guardant-los en l'objecte $_SESSION. 

A cada pàgina que es vulgui restringir l'accés haurà d'haver-hi una comprovació de si existeixen les variables de sessió i si aquestes coincideixen amb algun registre de la base de dades. En cas contrari l'usuari no és vàlid i haurà d'identificar-se de nou. 

En resum, les sessions es poden usar per tasques senzilles com la configuració o preferències d'usuari com per operacions més delicades com pagaments en línia.

Tal com hem dit, el protocol HTTP és un protocol sense estat. I de fet, des del servidor les diferents sol.licituts de pàgines d'un mateix usuaris, són tractades com si fossin accessos diferents. 

La implementació de sessions a PHP es realitza bàsicament mitjançant arxius de text guardats en el servidor. 
El nom de l'arxiu correspon a cada sessió i és un codi únic per cada sessió iniciada. Internament cada arxiu conté tots els valors de totes les variables d'aquella sessió en particular. 


PHP aconsegueix amb el suport de les sessions construir pàgines més personalitzades conservant dins de l'objecte $_SESSION de PHP l'estat de les accions realitzades per l'usuari (d'on ve, per on ha passat..).

Per a això s'utilitzen les sessions, per identificar a un usuari i passar dades associades a ell entre les diferents pàgines. En el cas de la tenda, el llistat de productes es guardaria en l'objecte $_SESSION associats a un identificador.
Per exemple, tindríem $_SESSION['productes'] la llista de productes que ha comprat i PHP s'encarregaria que aquesta informació estes disponible en totes les pàgines sempre que el codi de sessió estigui disponible.
Una sessió de PHP soluciona el problema que el protocol HTTP és un protocol sense memòria, i  permet emmagatzemar la informació de l'usuari al servidor per al seu ús posterior (per exemple, nom d'usuari, articles de compra, etc). 
 

No obstant això, la informació de sessió és temporal i s'eliminarà després que l'usuari ha abandonat el lloc web o després d'un temps d'inactivitat.
 Si es necessita un emmagatzematge permanent es pot guardar les dades en una base de dades.
 
Les sessions de treball es creen amb una identificació única (UID) per a cada visitant i emmagatzemar variables basades en aquest UID. 
La propagació d'aquesta informació de fet es pot fer de diferents maneres:
  • Amb cookies
  • Manualment 
  • Automàticament 

Funcionament

Una variable de sessió és una variable dotada d'un nom i d'un valor que existeix exclusivament entre el moment en què es crea i el moment en què finalitza la sessió. 

Abans de poder emmagatzemar informació de l'usuari en la sessió de PHP, ha d'iniciar primer la sessió.Per a desar i recuperar variables de sessió cal fer ús de la funció session_start().

session_start(); 

Per exemple:

<?php session_start(); ?>
<html>
<body>
</body>
</html>

El codi anterior es registrarà la sessió de l'usuari amb el servidor, li permetrà començar a guardar la informació de l'usuari, i assignar un UID per a la sessió d'aquest usuari.
Aquesta funció ha d'ésser inicial absoluta en el document PHP.
Les variables de sessió es dipositen en un vector associatiu anomenat $_SESSION.
L'assignació d'una variable de sessió es fa així:

$_SESSION['nom'] = valor 

Les variables de sessió es recuperen mitjançant $_SESSION['nom'] 
Per destruir una sessió es pot usar unset() o session_destroy()

El nom d'una sessió es pot recuperar amb la funció session_name.
Aquesta funció es pot usar de dues maneres:
 
session_name()--> ens retorna el nom de la sessió que per defecte és PHPSESSID

sesson_name("NomID') --> Assigna el nom NomID a la sessió

Per retornar el codi únic d'una sessió podem usar la funció session_id() 

Semblant a l'exemple anterior aquesta funció es pot usar de dues maneres diferents:

session_id()--> ens retorna el ID de la sessió

sesson_id("123456') --> Assigna el 123456 com a id de la sessió

Propagació 

Tal com hem dit hi ha tres maneres de propagar l'identificador de la sessió per les diferents pàgines:

Amb cookies

  • És imprescindible per usar aquest mètode que l'usuari accepti les cookies.
  • En el php.ini cal que la variable session.use_cookie estigui activat a 1

El UID es guarda en una galeta, i el programador es despreocupa de fer la propagació en les diferents pàgines. Simplement, quan necessita el uid de la sessió accedeix a la cookie.
El problema és quan l'usuari deshabilita o esborra les galetes. 
Aleshores per passar l'identificador de sessió haurà d'usar un dels següents mètodes.

Manualment

Aquest mètode és el més pesat des del punt de vista del programador. El mètode consisteix a passar el identificador de sessió sempre que es van fent redireccions o crides a diferents pàgines.
  • Amb header: cada vegada que fem una crida a pàgines internes amb la funció header() caldrà passar el identificador.Exemple:
<?php
<php header("Location:http://elmeusite.cat"); ?>
 
Aquest línia de codi caldrà modificar-la perquè passi el uid per url

<?php
<php header("Location:http://elmeusite.cat?PHPSESSID=".session_id()); ?>
 
  • Amb javascript: Semblant a l'exemple anterior, afegint a cada crida per url el uid de la sessió. Per exemple:
open("http://elmeusite.cat?PHPSESSID=<?php echo session_id();?>);"

  • Amb formularis: sempre que tinguin un formulari, podem afegir un camp ocult ( amb hidden) que contingui el PHPSESSID

Automàticament


Per fer el procés més fàcil podem fer que sigui PHP qui s'encarregui de fer la propagació automàtica. Per aconseguir-ho hem de tenir al php.ini la directiva session.use_trans_sid activat a 1.



En aquest enllaç podeu veure més funcions que ofereix PHP per les sessions
A continuació un exemple:

sessio1.php

<?php
session_start(); 
?> 
<html> 
<head> 
<title>Generar variable de sesión</title> 
</head> 
<body> 
<?php 
echo "estic escribint a la variable de sessio...";
$_SESSION["mivariabledesesion"] = "Hola aquest es el valor de la variable de sessio"; 
echo "<form action=\"sessio2.php\" method=\"POST\">";
echo "<input type=\"submit\" value=\"enviar\">";
echo "</form>";
?> 
</body> 
</html>
 
sessio2.php 


<?php
session_start(); 
?> 
<html> 
<head> 
<title>llegeixo variable de sessio</title> 
</head> 
<body> 
<?php 
echo "Contingut variable :".$_SESSION['mivariabledesesion']."<br>"; 
echo "ID sessio: ".session_id()."<br>"; 
echo "NOM sessio: ".session_name()."<br>"; 
?> 
</body> 
</html>
 
Podem trobar la variable de sessió a xampp/temp 
En resum:
Per iniciar la sessió (crear una nova o continuar-la), disposem de la funció session_start().
Aquesta funció sempre retorna TRUE.
bool session_start ( void )

Per registrar variables utilitzem:
session_register(), accepta com a argument una cadena que identifiqui el nom d'una variable, o una matriu que contingui més identificadors de variables.
bool session_register ( )

Per destruir les dades associades a la sessió actual, cal utilitzar session_destroy().
Cal tenir en compte que no destrueix cap de les variables globals associades a la sessió ni la cookie. Aquesta funció retorna TRUE si es destrueix la sessió correctament i FALSE es produeix algun problema en intentar-ho.
bool session_destroy ( void )

Per eliminar alguna variable registrada s'utilitza session_unregister(). Se li passa com a paràmetre el nom de la variable.
bool session_unregister()

Altres funcions relacionades amb sessions en PHP són:

* string session_id (): Llegeix o canvia l'identificador de sessió actual.
* void session_unset ( ): Elimina tota les variables de la sessió.
* bool session_is_registered(): Comprova si una variable està registrada en la sessió.
* string session_save_path(): Llegeix o canvia la ruta on es guarden les dades de la sessió actual. Cal configurar el save_path perquè no d'error en php.ini
* string session_moduli_name (): Llegeix i/o canvia el mòdul de la sessió actual
* bool session_set_save_handler(): Estableix unes funcions per a l'emmagatzematge de les dades de la sessió a nivell d'usuari.
* array session_get_cookie_params(): Obté els paràmetres de la cookie de la sessió
* void session_set_cookie_params(): Canvia els paràmetres de la cookie de la sessió
* void session_write_close(): Escriu les dades de la sessió i la finalitza.
* bool session_regenerate_id(): Actualitzar la id de sessió actual amb una recentment generada
* string session_encode(): retorna una cadena amb el contingut de la sessió actual en el seu interior.

Cap comentari:

Publica un comentari a l'entrada