qwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqw
ertyuiopasdfghjklzxcvbnmqwer
tyuiopasdfghjklzxcvbnmqwerty
uiopasdfghjklzxcvbnmqwertyui
opasdfghjklzxcvbnmqwertyuiop
asdfghjklzxcvbnmqwertyuiopas
dfghjklzxcvbnmqwertyuiopasdf
ghjklzxcvbnmqwertyuiopasdfgh
jklzxcvbnm Sommario
Le Sessioni in PHP ....................................................................................................................................... 1
session_start() ................................................................................................................................................ 2
Esempio 0 - Come creare pagine protette. .................................................................................................... 2
ESEMPIO 1 - autenticazione con login e password ........................................................................................ 5
ESEMPIO 2 - scheletro di un sito che simula degli acquisti online ................................................................. 8
qwertyuiopasdfghjklzxcvbnmq
wertyuiopasdfghjklzxcvbnmqw
ertyuiopasdfghjklzxcvbnmqwer
Le sessioni in PHP
Raccolta di note con esercizi
Rel 151202
paolo macchi
Le sessioni in PHP rel 151202 Pag. 1
Le Sessioni in PHP (remixato da documenti presenti in rete)
Un sistema di memorizzazione di informazioni è offerto dall'utilizzo delle sessioni.
A differenza dei cookie le sessioni non scrivono nulla sul computer dell’utente, ma operano sul server
creando degli specifici file dove vengono salvati alcuni dati importanti relativamente alla sessione di
navigazione del nostro utente. Una volta che la sessione sarà terminata il file con i dati della sessione stessa
verrà eliminato. Una sessione termina nel momento in cui l'utente chiude il browser (o in un diverso
momento eventualmente specificato nelle impostazioni del server o nel codice dell'applicazione).
Una sessione è un modo per memorizzare le informazioni ( in variabili ) da utilizzare
su più pagine . A differenza di un cookie , l'informazione non viene memorizzata sul
computer dell'utente
Le sessioni vengono utilizzate, ad esempio, nella gestione delle autenticazioni (login) degli utenti che, una
volta loggati, verranno identificati come tali da tutte le pagine (.php) del sito.
La prima cosa da fare se vogliamo lavorare con le sessioni è impostare nel file di configurazione del PHP
("php.ini") la direttiva session.save_path, indicando la directory nella quale verranno salvate le informazioni
sulle sessioni dei nostri utenti.
Cookie ( RFC 2109)
I primi cookie risalgono al 1994 utilizzati nel sito di Netscape. Un cookie è un piccolo file (o una stringa) che non supera i 4Kbyte
(ma i superkookie del Flash possono arrivare a 100Kbyte contro i 5Mbyte dell’HTML5!), inviati dal server di un sito e archiviati
nel browser in una directory del disco del client. Non è un programma eseguibile e non può trasportare virus e funziona in
questo modo:
Il server a cui ci colleghiamo memorizza sul nostro hard disk il cookie
Nel cookie è contenuto il nostro numero identificativo, quali aree del sito abbiamo visitato e, magari, anche la nostra email che
abbiamo lasciato
Al successivo collegamento, il server controllerà il cookie sul disco e disporrà dei nostri dati ricordandosi di chi sono e cosa ho
fatto
In questo modo potrebbero comparire banner mirati o personalizzazioni di pagine web o mostrare cosa è stato inserito nel
carrello della spesa nel precedente accesso al sito
Ogni cookie può contenere fino a cinque campi:
Dominio. Indica da dove proviene. Il browser dovrebbe verificare che i server non mentano!
Path . Percorso nella struttura delle directory del server per identificare quale parte della struttura del server può utilizzare il
cookie. Se è /, si intende l’intera struttura.
Content. (contenuto). Nella forma nome=valore. Sia nome sia valore sono qualsiasi scelti dal server
Expires (scadenza) data/ora, specifica quando scade il cookie. Se è assente è scartato alla chiusura (cookie non persistente).
Secure Impostato per indicare che il browser può restituire il cookie solo a un server sicuro. (e-commerce, remote banking,…)
Il browser, prima di inviare una richiesta di pagina a un sito, controlla nella directory dei cookie, se ci sono cookie inseriti dal
dominio a cui si sta rivolgendo. Se ci sono, allora tali cookie vengono inclusi nel messaggio di richiesta. Il server li riceve e li
interpreta. E’ possibile configurare il client per rifiutarli, ma poi non funzionano le applicazioni che necessitano del loro utilizzo!
Le sessioni in PHP rel 151202 Pag. 2
session_start()
La funzione da utilizzare poi all'interno delle nostre pagine .php per aprire una sessione è session_start().
Questa funzione non prevede parametri.
La funzione session_start() deve essere necessariamente utilizzata prima dell'invio di output.
Facciamo un esempio per vedere, in concreto, come funziona session_start().
Poniamo di voler aprire una sessione dove salvare username e password del nostro utente (dati che ci sono
stati forniti tramite un form di login). Ecco il codice:
<?php
//Apro la sessione e...
session_start();
//Recupero username e password dal form
$username = $_POST['user'];
$password = $_POST['pass'];
//Salvo i dati nella variabile (array) globale $_SESSION
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
?>
A questo punto abbiamo salvato all'interno della nostra sessione (grazie alla variabile globale $_SESSION) due diversi valori:
username e password.
Nelle successive pagine .php sarà molto semplice recuperare questi valori, ecco un esempio:
<?php
//Apro la sessione e...
session_start();
//Recupero i dati nell’array di sessione
$username = $_SESSION['username'];
$password = $_SESSION['password'];
//facciamo una stampata a video!
echo "Ciao " . $username . " la tua password è " . $password;
?>
Per finire vediamo come eliminare una sessione (ad esempio a seguito di logout).
//Per eliminare una specifica variabile di sessione useremo:
unset($_SESSION['username']);
//Per eliminare tutte le variabili di sessione useremo:
$_SESSION = array();
Esempio 0 - Come creare pagine protette.
Vediamo come sfruttare le potenzialità delle sessioni, ad esempio per renderci il lavoro più facile se
abbiamo bisogno di portarci dietro, in diverse pagine, un alto numero di variabili.
Le sessioni sono piccoli file di testo server side, ovvero salvati direttamente sul server che fa girare gli script,
che possono contenere qualsiasi cosa noi vogliamo, per esempio variabili o dati in generale.
NOTA
Le sessioni in PHP rel 151202 Pag. 3
A questo proposito, se volete usare le sessioni in locale, accertatevi di creare una cartella di nome "tmp" nel vostro hard disk.
Generalmente il percorso di tale cartella sarà C:\tmp, ma se preferite un'altra posizione non c'è alcun problema: aprite il vostro
php.ini (è salvato in c:\windows o c:\winnt a seconda delle versioni di windows), cercate la riga "session.save_path = /tmp" e
modificatela con il il percorso che preferite...
Passiamo adesso alla sintassi: all'inizio di ogni pagina in cui vorrete usare le sessioni dovrete aggiungere la riga
session start();
che serve appunto a creare una sessione. Fatto? Non ci crederete, ma abbiamo già finito.
Adesso vi basterà scrivere:
$_SESSION['prova'] = "Ciao";
oppure:
$prova = "ciao"; session_register('prova');
affinchè in ogni vostra pagina la variabile di sessione "prova" abbia il valore "Ciao".
Dov'è l'utilità di tutto ciò? Pensiamo per esempio ad un utente che inserisce dei dati in form. Tali dati verranno poi controllati
dallo script per evitare che ci siano errori, per esempio indirizzi email in formato non valido, date di nascita fasulle o password
che non combaciano.
In caso di errore sarebbe bello poter evitare all'utente di riempire nuovamente tutti i campi, e con le sessioni possiamo appunto
realizzare questo. Certo, potremmo passare i dati del form tramite i metodi GET e POST, ma perchè avere un indirizzo
chilometrico e rischiare infiltrazioni?
Vediamo adesso con un semplice script di usare le sessioni.
Si tratta di un modello MOLTO esemplificato di come creare delle pagine del sito nelle quali solo noi
possiamo entrare.
La pagina "form.htm" contiene un semplice form, che tramite il metodo POST passa alla pagina
"controlla.php" due variabili, rispettivamente username e password. Questo il contenuto della nostra
pagina "form.htm":
<form name="login" action="controlla.php" method="POST">
<input type="text" name="username" value="Username..."><br>
<input type="text" name="password" value="Password..."><br>
<input type="submit" value="Login...">
</form>
Questa la nostra applicazione PHP (che chiameremo "controlla.php"):
La pagina "controlla.php" si limita a controllare che i valori immessi nel form corrispondano a due valori da
noi scelti.
<?
$user = "paolo";
$pass = "poldo";
if ($_POST['username'] == $user && $_POST['password'] == $pass) { // user e pass corrette
session_start();
$_SESSION['login'] = "ok"; // sessione login ok
} else {
header("Location: form.htm");
}
?>
Le sessioni in PHP rel 151202 Pag. 4
La pagina "inclusione.php" è il cuore del sistema, e dovrà essere inclusa in tutte le pagine (PHP) che vorrete
proteggere, inserendo all'inizio della pagina una riga del tipo:
include("inclusione.inc.php");
Il codice della pagina si limita ad aprire una sessione, e a controllare che la variabile di sessione login abbia
il valore "ok"; se tale variabile non esiste o non ha il valore desiderato, il visitatore è rimandato alla pagina
del form, ovvero "form.htm".
<?
session_start();
if ($_SESSION['login'] != "ok") {
header("Location: form.htm");
}
?>
Le sessioni in PHP rel 151202 Pag. 5
ESEMPIO 1 - autenticazione con login e password
Index.php
<html>
<head>
<title>Login </title>
<link rel="stylesheet" href="css.css">
</head>
<body>
<div id="container">
<?php
$utente= "UTENTE:";
$pass="PASSWORD";
echo "<FORM ACTION = 'pag2.php?provenienza=1' method='post'>";
echo "Utente"."<input type='text' name='utente'size='20' value=''> <br>";
echo "Password"."<input type='password' name='pass'size='20' value=''> <br>";
echo "<INPUT TYPE=submit value='Ok'>";
echo "</FORM>";
echo "<FORM ACTION = 'pag3.html' method='post'>";
echo "<INPUT TYPE=submit value='Registrati'>";
echo "</FORM>";
?>
</div>
</body>
</head>
Le sessioni in PHP rel 151202 Pag. 6
</html>
Page2.php
<?php
session_start();
?>
<html>
<head>
<title>Login </title>
</head>
<body>
<?php
$login["Luca"]="ciao";
$login["Andrea"]="hello";
//Recupero username e password dal form
$username = $_POST['utente'];
$password = $_POST['pass'];
$trovato=false;
reset($login);
while(list($ElementKey, $Element) = each($login))
{
if($ElementKey==$username && $Element==$password)
{
$_SESSION['username'] = $username;
$_SESSION['password'] = $password;
echo "Benvenuto". $username;
$trovato=true;
echo "<FORM ACTION = 'pag4.php' method='post'>";
echo "<INPUT TYPE=submit value='Continua'>";
echo "</FORM>";
break;
}
}
if($trovato==false)
{
echo "Utente non registrato. Devi registrarti";
echo "<FORM ACTION = 'pag2.php' method='post'>";
echo "<INPUT TYPE=submit value='Registrati'>";
echo "</FORM>";
}
?>
</body>
</head>
</html>
page4.php
<?php
session_start();
Le sessioni in PHP rel 151202 Pag. 7
?>
<html>
<head>
<title>Login </title>
<script language ="javascript">
function controllaMail(){
var pattern = new RegExp("^([a-zA-Z0-9._%-])+@([a-zA-Z0-9.-])+\.[a-zA-Z]{2,4}$");
var txtMail = document.getElementById("email");
if (txtMail.value.search(pattern)== -1) {
alert("Il valore inserito non è indirizzo mail valido");
txtMail.focus();
} else {
alert("Indirizzo mail valido");
}
}
</script>
</head>
<body>
<?php
$user=$_SESSION['username'];
echo "Benvenuto ".$user ."<br>";
echo "Inserisci la tua e-mail";
echo "<br> <br>";
?>
<form method='post' action='pag4.php'>
Inserisci il tuo indirizzo e-mail
<INPUT name="email" type="text" id="email"></br>
<INPUT type="submit" value="OK" onclick="controllaMail()">
</form>
</body>
</head>
</html>
Page3.html (registrazione)
<html>
<head>
<title>Login </title>
<script type="text/javascript">
function fcontrolla(){
var txtPass1 = document.getElementById("passw").value;
var txtPass2 = document.getElementById("passw2").value;
if (txtPass1==txtPass2)
{
var percorso="pag2.php?provenienza=3&utente="+document.getElementById("nome").value+"&pass="+txtPass1;
alert(percorso);
document.location.href = "pag2.php?provenienza=3&utente="+document.getElementById("nome").value+"&pass="+txtPass1;
} else {
alert("Le due password non coincidono");
document.getElementById("passw").value=" ";
document.getElementById("passw2").value=" ";
}
}
</script>
Le sessioni in PHP rel 151202 Pag. 8
</head>
<body>
<FORM method='post'>
Utente <input type='text' name='nome'size='20' value=''> <br>
Password <input type='password' id='passw'size='20' value=''> <br>
Conferma Password<input type='password' id='passw2'size='20' value=''> <br>
<INPUT TYPE=button value='Registrati'onclick="fcontrolla()">
</FORM>
</body>
</head>
</html>
ESEMPIO 2 - scheletro di un sito che simula degli acquisti online
L’esercizio mostra un’applicazione client-server che simula un’acquisto on line con un carrello elettronico.
I prodotti vengono scelti tra quelli mostrati in vetrina e inseriti nel carrello elettronico fino ad arrivare al
loro pagamento in cassa.
L’esercizio è volutamente sintetico: il suo scopo, infatti, è quello di far vedere lo scheletro di
un’applicazione che non perde le informazioni nel passaggio da una pagina Web alla successiva. A questo
proposito si sfruttano session e coockie per superare la “smemoratezza” del protocollo HTTP che, per sua
natura è stateless e non “ricorda” cosa ha fatto in precedenza.
La successione delle operazioni prevede i seguenti passi:
Passo 1. Richiesta delle credenziali per l’accesso agli acquisti
Passo 2. Controllo del nome utente e avvio sessione
Passo 3. Acquisto dei prodotti presenti nel reparto alimentari
Passo 4. Acquisto dei prodotti tecnologici
Passo 5. Riepilogo del conto
Passo 6. Emissione dello scontrino e chiusura della sessione
NOTA Se si volessero conservare le informazioni in modo permanente sarebbe necessario ricorrere a un
database per la memorizzazione dei prodotti e degli utenti ma, non dovrebbe risultare difficile, aggiungerlo.
- Passo 1 (index.php) - Richiesta delle credenziali per l’accesso agli acquisti (fig.1)
Per accedere agli acquisti occorre essere registrati. Il form richiede di inserire il nome utente che, tramite il metodo POST, viene
inoltrato al programma che ne controlla la validità (check.php):
<html>
<head>
<title>Acquista il prodotto - Passo 1: Credenziali</title>
Le sessioni in PHP rel 151202 Pag. 9
</head>
<body>
<h1> Passo 1: Credenziali </h1>
<form action='check.php' method='post'>
Inserisci il nome utente: <input type='text' name='user' />
<input type='submit' value='Entra' />
</form>
</body>
</html>
- Passo 2 (check.php) - Controllo nome utente (fig. 2)
Compito del programma è quello di controllare se un utente è registrato e, in questo caso, di permettere
l’accesso agli acquisti.
Il controllo è fatto sull’array $utenti che ha come elementi 'user1' 'user2’ (a cui sono assegnate le rispettive
password).
Se l’utente esiste viene abilitato ad accedere agli acquisti della sezione alimentari (alimentari.php),
altrimenti viene richiesto di ritornare alla pagina principale (index.php).
<?php
session_start();
//utenti registrati
$utenti['user1']='pass1';
$utenti['user2']='pass2';
$esiste=false; //flag = false(NON registrato)
foreach($utenti as $key => $value) {
// echo $key; //debug
if($_POST['user']==$key) //controlla se utente esiste
{
$esiste=true; //flag=true se utente registrato
$_SESSION['user'] = $_POST['user'];
}
}
?>
<html>
<head>
<title>Acquista il prodotto - Passo 2: Check</title>
</head>
<body>
<body>
<h1> Passo 2: Check </h1>
<?php
if($esiste) { ?>
Benvenuto <?php echo $_POST['user']; ?>
<form action='alimentari.php'>
<input type='submit' value='Vai alla spesa' />
</form>
<?php } else { ?>
Non sei registrato !!!
<form action='index.php'>
Le sessioni in PHP rel 151202 Pag. 10
<input type='submit' value='Torna al login' />
</form>
<?php } ?>
</body>
</html>
- Passo 3 (alimentari.php) – Acquisto prodotti alimentari
Questa pagina Web permette di selezionare uno o più prodotti alimentari (pasta, pesce, carne)e di inviarne
il relativo costo (value) al programma “tecnologia.php”.
<html>
<head>
<title>Acquista il prodotto - Passo 3: Alimentari</title>
</head>
<body>
<h1> Passo 3: Alimentari</h1>
<form action='tecnologia.php' method='post'>
<input type='checkbox' name='alim["pasta"]' value='0.85' /> Pasta (0.85 €)
<input type='checkbox' name='alim["pesce"]' value='11' /> Pesce (11.00€)
<input type='checkbox' name='alim["carne"]' value='20' /> Carne (20.00€)
<input type='submit' value='Avanti' />
</form>
</body>
</html>
- Passo 4 (tecnologia.php) – Acquisto prodotti tecnologici (fig. 4)
Questa pagina Web preleva i valori inviati dalla pagina precedente, con il metodo POST, e inseriti nel
relativo array e ne calcola il totale (“tot”). Per non perdere il valore calcolato passando alla pagina
successiva, la variabile “tot”, è salvata in un cookie di nome “alim”, che verrà ripreso nelle pagine
successive per il riepilogo dei costi (“cassa.php”).
<?php
$tot=0;
foreach($_POST['alim'] as $key => $value)
{
$tot=$value+$tot;
}
setcookie('alim',$tot,time()+3600);
?>
<html>
<head>
<title>Acquista il prodotto - Passo 4: Tecnologia</title>
</head>
<body>
<h1> Passo 4: Tecnologia</h1>
<form action='cassa.php' method='post'>
<input type='checkbox' name='tecn["stereo"]' value='30' /> Stereo (30 €)
<input type='checkbox' name='tecn["cellulare"]' value='50' /> Cellulare (50€)
<input type='checkbox' name='tecn["astronave"]' value='1000' /> Astronave (1000€)
<input type='submit' value='Vai alla cassa' />
</form>
Le sessioni in PHP rel 151202 Pag. 11
</body>
</html>
- Passo 5 (cassa.php) – Riepilogo del conto (fig. 5)
Il programma recupera i costi degli accessori scelti nel reparto tecnologico e ne salva il costo nel coockie
“tecn”.
Quindi calcola il totale recuperando i costi parziali dai due coockie salvati e fa il riepilogo dei costi, insieme
al nome dell’utente che era stato salvato in precdenza nella variabile di sessione. Infine richiama la funzione
di emissione scontrino (“paga.php”)
<?php
session_start();
?>
<?php
$tot=0;
foreach($_POST['tecn'] as $key => $value)
{
$tot=$value+$tot;
}
setcookie('tecn',$tot,time()+3600);
?>
<html>
<head>
<title>Acquista il prodotto - Passo 5: Riepilogo</title>
</head>
<body>
<h1> Passo 5: Riepilogo</h1>
<?php echo $_SESSION['user'];?> hai speso <?php echo $_COOKIE['alim'];?> per gli alimentari e hai speso
<?php echo $tot;?> per la tecnologia. <br>
Il totale è <?php echo $_COOKIE['alim']+$tot; ?>
<form action='paga.php' method='post'>
<input type='submit' value='Paga' />
</form>
</body>
</html>
- Passo 6 (paga.php) – Emissione scontrino e chiusura (fig.6)
Questa pagina stampa a video lo scontrino, servendosi dei valori contenuti nei coockie, saluta l’utente e
distrugge la sessione.
<?php
session_start();
?>
<html>
<head>
Le sessioni in PHP rel 151202 Pag. 12
<title>Acquista il prodotto - Passo 6: Totale</title>
</head>
<body>
<h1> Passo 6 Totale</h1>
</br> Alimentari: <?php echo $_COOKIE['alim'];?>
</br> Tecnologia: <?php echo $_COOKIE['tecn']; ?>
</br>TOTALE è: <?php echo $_COOKIE['alim']+$_COOKIE['tecn']; ?>
</br></br>Alla prossima <?php echo $_SESSION['user'];?>, Ciao...
<?php
// cancella tutte le variabili di sessione
session_unset();
// distrugge la sessione
session_destroy();
?>
</body>
</html>
Top Related