MODULO 1 PARTE 3 Programmazione (scripting) server-side con PHP 3.c Cookies e sessioni Goy - a.a. 2012/2013 Programmazione Web 1 Cookie - I Cookie = variabili che il server salva (*) sul client come file (per es, su Windows XP, Firefox 3 li salva in: C:\Documents and Settings\user\Dati applicazioni\mozilla\firefox\profiles\id_code.default\cookies.sqlite (*) Tradizionalmente (Firefox 2) erano file di testo, adesso (Firefox 3) sono file sqlite (http://www.sqlite.org/) Per utilizzarli è necessario che il client "accetti" i cookies è possibile modificare la configurazione del browser! L'utente può cancellarli! non sono un metodo tanto affidabile per mantenere informazioni importanti Per es, con Firefox 3: Strumenti Opzioni Privacy Goy - a.a. 2012/2013 Programmazione Web 2 1
Cookie - II Un cookie, generalmente, contiene: il nome del cookie un valore un identificativo del server che lo ha prodotto una data di scadenza NB: Un server può leggere solo i cookies che lui stesso ha scritto! (il controllo viene effettuato grazie all id del server contenuto nel cookie) Goy - a.a. 2012/2013 Programmazione Web 3 PHP: cookie - I E' possibile scrivere e leggere cookie utilizzando PHP Per scrivere un cookie, utilizzo la funzione predefinita setcookie( ): restituisce la data corrente (misurata in nome del cookie secondi dalla Unix Epoch: 1/1/1970) setcookie( "punti", "10", time() + 2592000, ); scadenza del cookie (opzionale): valore (opzionale) a 30 gg (2.592.000 sec) da oggi Per leggere un cookie utilizzo l array associativo $_COOKIE[]: $puntiaccum = $_COOKIE["punti"]; Attenzione! I cookie sono inviati nell'intestazione (header) di HTTP response bisogna invocare la funzione setcookie( ) prima che il contenuto (body) venga generato, cioè all inizio della pagina (prima di qualunque altra cosa prima del tag <HTML> per es..)!!! Goy - a.a. 2012/2013 Programmazione Web 4 2
PHP: cookie - II VEDI es-cookie.html Per es, chiediamo all'utente nome, cognome e colore preferito; scriviamo queste informazioni in un 3 cookies; poi leggiamo le informazioni dai cookie e personalizziamo la pagina Nel file es-cookie.html: <FORM METHOD="POST" ACTION="personalCookie1.php" > Nome: <INPUT TYPE="TEXT" NAME="nome"/><BR> Cognome: <INPUT TYPE="TEXT" NAME="cognome"/><BR><BR> Quale colore di sfondo preferisci? <SELECT NAME="colore"> <OPTION VALUE="#FFFFFF">bianco</OPTION> <OPTION VALUE="#FFFF00">giallo</OPTION> <OPTION VALUE="#FF0000">rosso</OPTION> <OPTION VALUE="#00FF66">verde</OPTION> <OPTION VALUE="#00FFFF">azzurro</OPTION> </SELECT> <BR><BR> <INPUT TYPE="Submit" VALUE="OK"/> </FORM> Goy - a.a. 2012/2013 Programmazione Web 5 PHP: cookie - III VEDI personalcookie1.php Nel file personalcookie1.php (scrittura di un cookie): $n = $_POST["nome"]; $cn = $_POST["cognome"]; $col = $_POST["colore"]; setcookie("nome", $n, time()+2592000); setcookie("cogn", $nc, time()+2592000); setcookie("sfondo", $col, time()+2592000);?> <P ALIGN='CENTER'> Ho scritto tre cookie con le seguenti informazioni: echo "<BR>Nome = ". $n; echo "<BR>Cognome = ". $cn; echo "<BR>Colore di sfondo preferito = ". $col;?> </P> Goy - a.a. 2012/2013 Programmazione Web 6 3
PHP: cookie - IV Chiudiamo il browser, lo riapriamo (simulando così una nuova sessione di lavoro) e ci connettiamo a personalcookie2.php Nel file personalcookie2.php (lettura di un cookie): VEDI personalcookie2.php p $nome = $_COOKIE["nome"]; $cognome = $_COOKIE["cogn"]; $sfondo = $_COOKIE["sfondo"]; echo "<BODY BGCOLOR=$sfondo>";?> <P ALIGN='CENTER'> echo "Buongiorno ". $nome. " ". $cognome. "!"; echo "<BR>Ti piace questo sfondo ($sfondo)?";?> </P> Goy - a.a. 2012/2013 Programmazione Web 7 PHP: sessioni - I Sessione = serie di accessi ad un sito web, effettuati da uno stesso client, in un arco di tempo delimitato, durante il quale viene mantenuto t uno stato t dell'interazione i sito web sessione1 sessione2 utente1 utente2 sessione3 utente3 ecc ecc Inizio di una sessione: il Web Server crea automaticamente un oggetto session, con ID univoco, per ogni client che si connette al sito web Fine di una sessione: quando scade (timeout) vedi php.ini: session.gc_maxlifetime = 1440 [secondi] = 24 minuti quando viene eseguito il seguente script PHP: session_unset(); session_destroy(); quando viene chiuso il browser resetta le variabili di sessione [vedi lucidi succ.] distrugge l'oggetto session Goy - a.a. 2012/2013 Programmazione Web 8 4
PHP: sessioni - II session_start(); funzione PHP che verifica se l'utente ha già un sessionid (cioè se c'è già una sessione attiva per quell'utente): se non lo trova ne crea uno, altrimenti recupera i dati sullo stato della sessione attiva NB: anche se è controintuitivo, session_start() deve essere invocata ogni volta che si vuole accedere a informazioni sulla sessione! Attenzione! La funzione session_start() invia al client delle informazioni nell'intestazione (header) di HTTP response bisogna invocare la funzione session_start() prima che il contenuto (body) di HTTP response venga generato, cioè all inizio della pagina (prima di qualunque altra cosa, anche di uno spazio bianco)!!! Goy - a.a. 2012/2013 Programmazione Web 9 PHP: sessioni - III Se non lo facciamo, per es: <HTML> session_ start(); Otteniamo un messaggio di errore (warning = errore non grave) del tipo: Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at C:\xampp\htdocs\corsoPW\php\provaSessione2.php:13) in C:\xampp\htdocs\corsoPW\php\provaSessione2.php on line 41 che ci dice appunto che non può inviare un session cookie perché l intestazione (header) è già stata inviata (la riga 41 è appunto quella in cui viene erroneamente invocata session_start()) Goy - a.a. 2012/2013 Programmazione Web 10 5
PHP: sessioni - IV Ma perché?!? Per gestire la sessione PHP ha a disposizione 2 meccanismi: 1. cookie 2. URL rewriting Vi ricordate? Le operazioni sui cookies vengono fatte tramite l'intestazione (header) di HTTP response per questo la funzione session_start() (che utilizza il meccanismo dei cookies per scrivere e leggere il sessionid) deve essere invocata prima che il contenuto (body) di HTTP response venga generato, cioè all inizio della pagina (prima di qualunque altra cosa, anche di uno spazio bianco) Ma se l'utente ha disattivato i cookies sul suo browser le sessioni non funzionano?!? In questo caso PHP utilizza il secondo meccanismo, l'url rewriting Goy - a.a. 2012/2013 Programmazione Web 11 PHP: sessioni - V Se i cookies sono stati disattivati, PHP (session_start()) scrive il sessionid come parametro degli URL nella pagina Per es. se nella pagina vi è un link: <A HREF="adduser.php"> L'interprete t lo sostituisce i con: <A HREF="adduser.php?PHPSESSID=68cf093a2ec5aa4f6cb60"> NB: Per abilitare questa possibilità è necessario configurare le proprietà seguenti in php.ini: session.use_trans_sid = 1 session.use_only_cookies = 0 (o commentata) Nota: Le informazioni i isulla sessione (sessionid, i ecc.) ) vengono salvate (sul server) nella cartella indicata nel file php.ini: session.save_path = "${path}\tmp\" la cartella tmp, sotto C:\xampp\ deve esistere ed essere scrivibile! Goy - a.a. 2012/2013 Programmazione Web 12 6
PHP: sessioni variabili di sessione - I Tutti i dati relativi alla sessione (stato dell'interazione) vengono caricati da PHP nell'array associativo $_SESSION In particolare l'array associativo $_SESSION contiene le variabili di sessione Le variabili di sessione sono variabili "globali al sito", cioè accessibili (visibili) da tutte le pagine del sito, all'interno di una sessione (a differenza delle variabili "normali" la cui visibilità è limitata alla singola pagina) Con PHP, possiamo dichiarare e inizializzare una variabile di sessione, per es: session_start(); leggo lo username (da un form di login, per es) $_SESSION["user"] = $_POST["login"]; lo scrivo in una variabile di sessione Goy - a.a. 2012/2013 Programmazione Web 13 PHP: sessioni variabili di sessione - II In tutte le pagine successive (visitate dopo aver inizializzato la variabile di sessione) sarà possibile leggerne il valore NB: se questo non è possibile, significa che la sessione è scaduta! Per es: session_start(); if ( isset($_session["user"]) ) { //sessione valida funzione che restituisce true se la $_SESSION["user"] } else //sessione scaduta } variabile (passata come parametro) esiste (ed è stata inizializzata), false altrimenti Goy - a.a. 2012/2013 Programmazione Web 14 7
PHP: sessioni var. di sessione - III Esempio: VEDI provasessione1.html VEDI provasessione2.php VEDI provasessione3.php provasessione1.html form di login <INPUT TYPE="TEXT" NAME="login"/> provasessione2.php scrivo in una nuova variabile di sessione (user) il login dell'utente $_SESSION["user"]=$_POST["login"]; provasessione3.php leggo la variabile di sessione user (la stampo), invoco le funzioni session_unset(); session_destroy(); e poi controllo che abbiano fatto il loro lavoro! echo "USER esiste ancora? "; if (isset($_session["user"])) { echo "Sì"; } else { echo "No"; } Goy - a.a. 2012/2013 Programmazione Web 15 PHP: sessioni variabili di sessione - IV possiamo usare le variabili di sessione per due scopi principali: 1) per controllare gli accessi 2) per rendere delle informazioni disponibili nelle pagine successive 1) Controllo degli accessi: login inizializzo una variabile di sessione pagine successive se la variabile è "settata", allora la sessione è valida; se non lo è, significa che la sessione è scaduta se l'utente cerca di accedere ad una pagina del sito senza passare dll dal login, la variabile ibil di sessione non verrà settata e l'accesso sarà impossibile! Goy - a.a. 2012/2013 Programmazione Web 16 8
PHP: sessioni variabili di sessione - V 2) Rendere informazioni disponibili nelle pagine successive: login inizializzo una variabile di sessione pagine successive il contenuto di tale variabile è sempre disponibile se voglio avere disponibile lo username in ogni pagina, basta metterlo in un variabile di sessione! Ho delle alternative per passare delle informazioni da una pagina all'altra? se passo da una form: <INPUT TYPE="hidden" NAME="utente" value=$user/> se passo cliccando su un link: <A HREF="pagSuccessiva.php?utente=$user"> t " Goy - a.a. 2012/2013 Programmazione Web 17 9