Creare siti in PHP – (27) – Le sessioni e i cookie

Con la puntata di oggi vedremo in che modo, con PHP, è possibile conservare informazioni durante la navigazione: si tratta di un aspetto molto utile soprattutto se è necessario costruire un sito web che debba consentire ai propri utenti di fare il login e di navigare le pagine in qualità di utenti registrati. Per fare questo abbiamo due strumenti a nostra disposizione: il primo è costituito dalle sessioni, il secondo dai cookie.
Le sessioni
Iniziamo dalle sessioni: dobbiamo immaginare le sessioni come “contenitori” in cui possiamo inserire diverse informazioni. Queste informazioni verranno memorizzate sul server e dureranno il tempo di una… “sessione”, appunto, perché quando il browser verrà chiuso tutte queste informazioni saranno cancellate.
La funzione session_start
PHP mette a disposizione di chiunque voglia creare una sessione la variabile superglobale $_SESSION, che funziona proprio come tutte le altre variabili superglobali di cui abbiamo già parlato nelle puntate scorse. Prima di tutto però c’è un’operazione preliminare da compiere, ovvero avviare la sessione. Lo si fa con una sezione apposita, session_start, che deve obbligatoriamente essere inserita prima di qualsiasi tipo di output all’interno del nostro file PHP:
<?php
session_start();
// codice...
?>
Creare sessioni
La funzione session_start (la cui documentazione ufficiale si può trovare all’indirizzo http://php.net/manual/en/function.session-start.php) non solo permette di creare una sessione, ma permette anche di recuperare dati da una sessione creata in un’altra pagina. Ma come si fa a creare una sessione? Basta semplicemente utilizzare la variabile superglobale $_SESSION e associare a essa le informazioni:
$_SESSION['nome'] = "Federico";
$_SESSION['id'] = "1";
$_SESSION['livello'] = "3";
Ovviamente queste informazioni, nel caso di un utente che si collega al nostro sito, si possono agevolmente recuperare da un database (nell’esempio ometterò, per semplicità, la query, perché parleremo nella prossima puntata di come recuperare in modo corretto e allo stesso tempo semplice i dati immessi da un utente per fare un login):
$query = // ipotetica select per verificare i dati inseriti dall'utente
$result = mysql_query($query);
$numero_record = mysql_num_rows($result);
if($numero_record == 1) {
while($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$_SESSION['id'] = $row['id'];
$_SESSION['nome'] = $row['nome'];
$_SESSION['livello'] = $row['livello'];
}
echo "Login effettuato con successo!";
}
In tutte le pagine che vorremo riservare agli utenti registrati, dovremo inserire prima di qualsiasi altra cosa la funzione session_start: se omettessimo la funzione, la pagina non potrebbe ricevere le informazioni delle sessioni. Se per esempio con un blocco if controlliamo che l’utente sia loggato (per esempio verificando, tramite isset, che sia impostato il livello dell’utente a sua volta memorizzato nella variabile superglobale $_SESSION) ma allo stesso tempo dimentichiamo di inserire la funzione session_start, la conseguenza sarà che la pagina non conoscerà le informazioni memorizzate nella sessione e la nostra applicazione si comporterà come se l’utente non si fosse mai loggato al sito. Attenzione anche a non dichiarare due volte la funzione (spesso, includendo file nella pagina, può capitare di farlo), perché session_start può essere dichiarata una volta soltanto.
Come azzerare o eliminare le sessioni
Le sessioni possono essere poi azzerate o eliminate: per fare questo è possibile utilizzare le funzioni session_unset e session_destroy. La differenza consiste nel fatto che la prima funzione elimina soltanto i dati (senza cancellare gli elementi dell’array che abbiamo dichiarato in precedenza), la seconda invece elimina dati e array. Pertanto in seguito a session_destroy sarà necessario dichiarare nuovamente session_start. Sono utili in funzioni di logout e si invocano in modo molto semplice:
session_unset();
session_destroy();
I cookie
Parliamo adesso dei cookie: molti di voi li avranno già sentiti nominare. I cookie (letteralmente “biscotti”) sono informazioni che vengono inviate dal server al client: e proprio qui sta la prima differenza rispetto alle sessioni, perché queste ultime rimangono sul server. Un’altra differenza consiste nel fatto che la sessione viene cancellata nel momento in cui il browser viene chiuso: il cookie invece persiste fino alla sua scadenza, impostata quando il cookie viene creato. Data la natura dei cookie, questi ci torneranno utili se vogliamo creare un modulo di login che si “ricordi” dell’utente una volta chiuso il browser, per evitargli magari di immettere nuovamente nome e password al collegamento successivo. Un altro esempio può essere dato da un sito multilingua: se il nostro sito accoglie l’utente in italiano, ma quest’ultimo preferisce l’inglese, potrebbe rendersi necessario un cookie che si ricordi dell’impostazione settata dall’utente (ovvero “sito in lingua inglese”) ogni volta che si collega.
La funzione setcookie e i suoi parametri
Per creare un cookie esiste un’apposita funzione, setcookie, che riceve tre parametri principali: il nome del cookie, le informazioni e la durata:
setcookie("nome", "Federico", time()+3600);
La durata si imposta utilizzando la funzione time: quest’ultima restituisce il numero di secondi trascorsi dal 1 gennaio 1970 alle ore 00:00:00. Si tratta della data di inizio del tempo calcolato sui sistemi Unix ed è, come già detto, espresso in secondi: si intuisce quindi che al valore restituito da time bisognerà aggiungere un numero di secondi equivalente al periodo di durata del nostro cookie. Nel caso dell’esempio, 3600 secondi: significa che il cookie avrà la durata di un’ora (formata da 3600 secondi). Si intuisce quindi che è possibile settare una durata qualsiasi per il nostro cookie, anche di anni!
setcookie("nome", "Federico", time()+3600*24); //un giorno
setcookie("nome", "Federico", time()+3600*24*30); // un mese
setcookie("nome", "Federico", time()+3600*24*365); // un anno
Se invece la scadenza non viene impostata, il cookie scadrà semplicemente alla fine della sessione. La documentazione ufficiale della funzione time è disponibile all’indirizzo http://php.net/manual/en/function.time.php.
Quello che abbiamo visto sopra è l’esempio più tipico, ma in realtà si possono estendere a sette i parametri che la funzione setcookie può ricevere, perché oltre a nome, valore e scadenza possiamo specificare anche percorso (ovvero la directory per cui è valido il cookie), il dominio (come per il percorso, ma si estende a tutto il dominio), la sicurezza (che se settata a true fa in modo che il cookie venga trasmesso solo attraverso protocollo sicuro https) e httponly (funziona come la sicurezza: se settato a true, fa in modo che il cookie venga trasmesso solo tramite protocollo http, e di conseguenza non sarà accessibile a linguaggi di scripting come JavaScript). Per esempio:
setcookie("nome", "Federico", time()+3600, "/prova/", "web-magazine.it", true, true);
In questo caso il cookie è valido solo per la cartella “prova” del sito “web-magazine.it” (che non va scritto con “www” anteposto), si trasmette solo in presenza di una connessione sicura ed è accessibile solo al protocollo http.
setcookie("nome", "Federico", time()+3600, "/");
In questo caso invece abbiamo creato, attraverso la formula “/”, un cookie che è valido per tutte le cartelle del sito.
Recuperare il valore dei cookie
Per recuperare il valore di un cookie che abbiamo impostato in precedenza, sarà necessario utilizzare la variabile superglobale $_COOKIE, e il nome dell’elemento dell’array non sarà altro che il primo valore che abbiamo passato come parametro alla funzione setcookie:
echo $_COOKIE['nome']; // stampa “Federico”
È ovvio che possiamo anche inizializzare variabili a cui abbinare i valori delle nostre sessioni o dei nostri cookie:
$nome = $_SESSION['nome'];
$cognome = $_COOKIE['cognome'];
Per poi utilizzarle comodamente all’interno del nostro codice, magari su blocchi condizionali. Tipicamente, ci si assicura che prima le variabili di sessione e i cookie siano settati tramite funzione isset, onde evitare di veder comparire warning sul sito nel caso in cui sessioni e cookie non siano ancora stati scritti (per esempio quando l’utente si è appena collegato al sito e non ha ancora fatto login).
Eliminare i cookie
Abbiamo visto prima come eliminare una sessione. I cookie non hanno una specifica funzione per eliminarli, ma per farlo basta semplicemente utilizzare, di nuovo, la funzione setcookie (a proposito, la pagina di documentazione ufficiale è http://php.net/manual/en/function.setcookie.php) impostando però, come scadenza, un tempo negativo:
setcookie("nome", "Federico", time()-3600);
E così facendo avremo eliminato il nostro cookie. Sempre la solita funzione si utilizza se vogliamo modificare i valori di un cookie: basterà semplicemente invocare setcookie con i nuovi parametri.
E anche per oggi la puntata arriva al termine… arrivederci al prossimo episodio!!!
Puoi trovare interessante anche:
- Creare siti in PHP – (29) – La sicurezza in PHP: session hijacking
- Creare siti in PHP – (17) – Alcune funzioni da non dimenticare! Parte 1: funzioni generali e per le stringhe
- Creare siti in PHP – (18) – Alcune funzioni da non dimenticare! Parte 2: gli array
- Creare siti in PHP – (19) – Alcune funzioni da non dimenticare! Parte 3: gestire file di testo esterni
- Creare siti in PHP – (5) – Le variabili, che cosa sono e a cosa servono











Web magazine è il blog personale di
I contenuti di questo blog sono pubblicati sotto licenza
Silvio scrive:
20 gennaio 2012 alle 20:06
Grazie per le info!