MODULO 1
PARTE 3
Programmazione (scripting) server-side con PHP
3.c
Goy - a.a. 2009/2010 Programmazione Web 1
3.c
Cookies e sessioni
Cookie - I
Cookie = informazioni che il server scrive in un file di testo
che viene salvato sul client
(per es, su Windows XP, con Firefox 2 vengono salvati in: C:\Documents and Settings\user\Dati applicazioni\Mozilla\Firefox\Profiles\h83by28b.default\cookies.txt
• Per utilizzarli è necessario che il client "accetti" i cookies
• Per utilizzarli è necessario che il client accetti i cookies
⇒ è possibile modificare la configurazione del browser!
Per es, con Firefox 2: Strumenti→ Opzioni → Privacy → Avanzate
• L'utente può cancellarli!
P Fi f 2
Goy - a.a. 2009/2010 Programmazione Web 2
Per es, con Firefox 2:
Strumenti→ Elimina dati personali
⇒ non sono un metodo tanto
affidabile per mantenere
informazioni importanti…
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. 2009/2010 Programmazione Web 3
PHP: cookie - I
E' possibile scrivere e leggere cookie utilizzando PHP Per scrivere un cookie, utilizzo la funzione predefinita setcookie(…):
nome del cookie
restituisce la data corrente (misurata in secondi dalla Unix Epoch: 1/1/1970)
setcookie( "punti" , "10", time() + 2592000, ...);
Per leggere un cookie utilizzo l’array associativo
$_COOKIE[]
:
$puntiAccum = $_COOKIE["punti"];
nome del cookie
valore (opzionale) scadenza del cookie (opzionale):
a 30 gg (2.592.000 sec) da oggi
Goy - a.a. 2009/2010 Programmazione Web 4
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..)!!!
PHP: cookie - II
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:
VEDI es-cookie.html
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>
#00 66 /
Goy - a.a. 2009/2010 Programmazione Web 5
<OPTION VALUE="#00FF66">verde</OPTION>
<OPTION VALUE="#00FFFF">azzurro</OPTION>
</SELECT>
<BR><BR>
<INPUT TYPE="Submit" VALUE="OK"/>
</FORM>
PHP: cookie - III
Nel file
personalCookie1.php(scrittura di un cookie):
<?php
$n = $_POST["nome"];
$cn = $_POST["cognome"];
$ $
VEDI personalCookie1.php
$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:
<?php
Goy - a.a. 2009/2010 Programmazione Web 6
echo "<BR>Nome = " . $n;
echo "<BR>Cognome = " . $cn;
echo "<BR>Colore di sfondo preferito = " . $col;
...
?>
</P>
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):
<?php
VEDI personalCookie2.php
p p
$nome = $_COOKIE["nome"];
$cognome = $_COOKIE["cogn"];
$sfondo = $_COOKIE["sfondo"];
echo "<BODY BGCOLOR=$sfondo>";
?>
...
<P ALIGN='CENTER'>
<?php
echo "Buongiorno " $nome " " $cognome "!";
Goy - a.a. 2009/2010 Programmazione Web 7
echo Buongiorno . $nome . . $cognome . ! ; echo "<BR>Ti piace questo sfondo ($sfondo)?";
?>
</P>
PHP: sessioni - I
sito web
utente1 utente2 utente3 sessione1
sessione2 sessione3
Sessione = serie di accessi ad un sito web, effettuati da uno stesso client, in un arco di tempo delimitato, durante il quale viene
t t t t d ll'i t i
¾ 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]
ecc… ecc…
mantenuto uno stato dell'interazione
Goy - a.a. 2009/2010 Programmazione Web 8
session.gc_maxlifetime = 1440[secondi]
– 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
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 p
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
Goy - a.a. 2009/2010 Programmazione Web 9
( ) p
⇒ 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)!!!
PHP: sessioni - III
Se non lo facciamo, per es:
<HTML>
...
<?php
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
Goy - a.a. 2009/2010 Programmazione Web 10
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())
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)
Goy - a.a. 2009/2010 Programmazione Web 11
(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...
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'i t t l tit i
L'interprete lo sostituisce 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:
L i f i i ll i ( i ID )
Goy - a.a. 2009/2010 Programmazione Web 12
Le informazioni sulla sessione (sessionID, ecc.) vengono salvate (sul server) nella cartella indicata nel file php.ini:
session.save_path = "${path}\tmp\"
⇒ la cartella tmp, sotto C:\Programmi\EasyPHP 2.0b1\ deve
esistere ed essere scrivibile!
PHP: sessioni – variabili di sessione - I
Tutti i dati relativi alla sessione (stato dell'interazione) vengono caricati da PHP nell'array associativo
$_SESSIONIn particolare l'array associativo
$_SESSIONcontiene 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:
leggo lo username (da
Goy - a.a. 2009/2010 Programmazione Web 13
session_start();
...
$_SESSION["user"] = $_POST["login"];
leggo lo username (da un form di login, per es...)
lo scrivo in una variabile di sessione
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
...
$_SESSION["user"]
...
funzione che restituisce true se la variabile (passata come parametro)
Goy - a.a. 2009/2010 Programmazione Web 14
...
} else
//sessione scaduta ...
}
esiste (ed è stata inizializzata),
false altrimentiPHP: sessioni – var. di sessione - III
Esempio:
provaSessione1.html
→ form di login
<INPUT TYPE="TEXT" NAME="login"/>
provaSessione2.php
→ scrivo in una nuova variabile di
VEDI provaSessione1.html VEDI provaSessione2.php VEDI provaSessione3.php
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!
Goy - a.a. 2009/2010 Programmazione Web 15
echo "USER esiste ancora? ";
if (isset($_SESSION["user"])) { echo "Sì";
} else {
echo "No";
}
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 d l l i l i bil di i
Goy - a.a. 2009/2010 Programmazione Web 16
senza passare dal login, la variabile di sessione non
verrà settata e l'accesso sarà impossibile!
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!
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 " S i h ? t t $ "
Goy - a.a. 2009/2010 Programmazione Web 17
<A HREF="pagSuccessiva.php?utente=$user">