Академический Документы
Профессиональный Документы
Культура Документы
In una precedente dispensa, reperibile allurl http://www.scribd.com/cinziabb/d/83483496Invio-di-dati-al-server-e-gestione-con-PHP abbiamo visto come creare un form HTML per il login di un utente a un sito e come gestire questi dati lato server, con il linguaggio PHP. Il form prevedeva solo due campi per linserimento di username e password e il pulsante submit per linvio dei dati al server. Normalmente, un form per il login contiene qualche controllo in pi, come: un link da utilizzare nel caso in cui si sia dimenticata la password; un link da utilizzare per effettuare la registrazione; una casella di controllo da utilizzare se si desidera essere identificati ogni volta che si torna a visitare il sito. Lesempio che vi propongo realizza un form pi completo e vi consente di comprendere come gestire con PHP non solo i dati provenienti da campi testo/password ma anche da selezioni di caselle di controllo (checkbox). Ci occuperemo, inoltre, dellinvio di cookie al client.
<form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text"><br><br> <label for="password">Password</label> <input id="password" name="password" type="password"><br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox"> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form>
1
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
Sappiamo che quando lutente fa clic sul pulsante Login, lo username e la password vengono inviati al server per lelaborazione ma non abbiamo ancora visto come viene passato il contenuto di una checkbox e dove possiamo reperirlo sul server. Apro, quindi, una piccola parentesi per mostrarvi come gestire i dati provenienti dalla selezione di checkbox e radiobutton.
Potete determinare quale casella di controllo lutente ha selezionato, testando quale/quali elementi dellarray $_POST sono stati impostati. Per ogni casella selezionata dallutente, il contenuto del suo campo value sar trasferito nellarray opportuno. Di conseguenza, supponendo che lutente scelga la casella di controllo comico, la situazione sar la seguente: $_POST[opzione1] = comico $_POST[opzione2] non impostato $_POST[opzione3] non impostato Per controllare se un elemento dellarray stato impostato, si usa la funzione PHP isset. Lo script seguente produce a video le checkbox selezionate.
<html> <head> <title>Checkbox.php</title> </head> <body> <p> Hai scelto le seguenti opzioni: </p> <br/> <?php if (isset($_POST["opzione1"])) echo $_POST["opzione1"]."<br/>"; if (isset($_POST ["opzione2"]))
2
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
echo $_ POST ["opzione2"]."<br/>"; if (isset($_POST ["opzione3"])) echo $_ POST ["opzione3"]; ?> </body> </html>
Potete determinare nel codice PHP quale pulsante radio lutente ha selezionato, testando il contenuto di $_POST[domanda]. Per esempio, il seguente script PHP produce a video il pulsante selezionato.
<html> <head> <title>Radiobutton.php</title> </head> <body> <p> Hai scelto la seguente opzione: </p> <br/> <?php echo $_POST["domanda"]."<br/>"; ?> </body> </html>
In questo caso siamo sicuri che almeno un radiobutton selezionato perch il primo pulsante radio selezionato di default e possiamo fare a meno di utilizzare isset(). In caso contrario necessario ricorrere alluso di isset per verificare se lutente ha effettuato una selezione.
3
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
4
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
E-commerce. quando, in un sito di e-commerce si vuole mantenere nel carrello, fino al momento dell'acquisto, la memoria delle scelte effettuate durante la navigazione. Contatori. Quando si vuole mantenere un contatore di visite, di utenti online e cos via.
I cookie possono essere salvati sia nella memoria volatile dell'applicazione client, che sul disco sotto forma di file di testo. Nel primo caso si tratta di cookie temporanei: verranno automaticamente eliminati al momento della chiusura della finestra del browser e di tutte le finestre "figlie". Vengono anche chiamati "magic cookies" (in quanto compaiono e scompaiono). I cookie persistenti al contrario, se non cancellati manualmente, possono restare memorizzati sul client per mesi o anni a seconda del termine di validit con cui vengono impostati. Questa distinzione importante perch da essa dipende la portata con cui le applicazioni lato-server saranno in grado di tracciare l'utente.
Inviare cookie
Solo i primi 2 parametri sono obbligatori. Gli altri saranno impostati ai valori di default, se non diversamente specificato. name: il nome del cookie. value: il contenuto del cookie. Se value coincide con la stringa vuota () significa che si intende cancellare il cookie con il nome dato. expire: lora di scadenza del cookie, cio per quanto tempo il cookie rimarr memorizzato nel client. Il valore di default 0, il che equivale a impostare un magic cookie. Solitamente si imposta utilizzando la funzione time()1 a cui si aggiunge il numero di secondi di validit (es. time()+3600) path: il percorso sul server per il quale il cookie sar valido. Se path non viene specificato il cookie si intender valido solo per i percorsi compresi nell'ambito della directory in cui si trova la pagina che lo ha inviato. All'opposto il percorso "/" il pi ampio immaginabile, e rappresenta l'intera documentRoot del webserver. Il parametro Path stato pensato per evitare che, ad esempio, una pagina presente nel percorso "/utenti/utente1" possa leggere il cookie inviato da una pagina presente in "/utenti/utente2". domain: il dominio per cui il cookie valido. Per default coincide con il dominio del server (es. www.miodominio.com) e pu coincidere anche con un indirizzo IP. secure: indica che il cookie deve essere trasmesso solo su una connessione HTTPS sicura. Quando il valore 1, il cookie viene impostato solo se esiste una connessione sicura. Il valore di default 0.
Un esempio di cookie :
<?php setcookie(userid, paperino, time() + 3600); ?>
La funzione time restituisce il timestamp attuale, cio il numero di secondi trascorsi dal 01/01/1970. Il timestamp consente di risalire alla data corrente.
5
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
Lo script contenente setcookie deve essere inserito prima di qualsiasi output. Ottenere i cookie Dopo aver impostato un cookie, possibile accedervi al successivo caricamento della pagina mediante larray globale $_COOKIE. I valori dei cookie sono caricati automaticamente in $_COOKIE. Ad esempio, per produrre in output il contenuto del cookie userid impostato in precedenza, si scrive:
<?php if (isset($_COOKIE[userid])) { echo $_COOKIE[userid]; } ?>
Loutput sar il valore del cookie di nome userid, cio paperino. I nomi dei cookie possono anche essere impostati come nomi di array. Per esempio:
<?php setcookie(cookie[uno], benvenuto); setcookie(cookie[due], gentile); setcookie(cookie[tre], paperino); ?>
Dopo che questi cookie sono stati impostati, possibile leggerli come segue:
<?php if (isset($_COOKIE[cookie])) { foreach ($_COOKIE[cookie] as $value) { echo $value <br/>; } } ?>
Eliminare i cookie Per eliminare un cookie basta chiamare setcookie con gli stessi parametri con cui stato impostato, ad eccezione di value, che dovr essere stringa vuota e di expire, che dovr essere impostato ad una data passata.
Esempio <?php
setcookie(userid, , time()-3600); ?>
password gi impostati e potr effettuare il login solo premendo il pulsante del form. Utilizziamo allo scopo lo stesso script impiegato per il login (http://www.scribd.com/cinziabb/d/83483496-Invio-di-dati-al-server-e-gestione-con-PHP), apportando le necessarie modifiche.
login.php
<?php //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; if (isset($_POST["remember"])) $remember = $_POST["remember"]; else $remember = null; //connessione al database $conn = mysql_connect("localhost", "root", "") or die("Impossibile connettersi al server"); $db = mysql_select_db("db", $conn) or die("impossibile selezionare il database"); //verifica dell'esistenza dell'utente $query = "SELECT username, password FROM utente WHERE username='$uid' AND password='$pwd'"; $result = mysql_query($query) or die("query fallita: ".mysql_error()); $trovato = false; while ($row = mysql_fetch_array($result)) $trovato = true; //disconnessione dal database mysql_close($conn); //elaborazione della risposta if ($trovato) { //lutente registrato if ($remember != null) { //se ha selezionato Remember me gli inviamo i cookie setcookie("login[username]", $uid, time() + 604800); //7 giorni setcookie ("login[password]", $pwd, time() + 604800); } //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } else //lutente non registrato e riceve un messaggio di errore echo "login errato; } ?> <html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text" value="<?php if
7
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
(isset($_COOKIE['login'])) echo $_COOKIE['login']['username'];?>"> <br><br> <label for="password">Password</label> <input id="password" name="password" type="password" value ="<?php if (isset($_COOKIE['login'])) echo $_COOKIE['login']['password'];?>"> <br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox" <? php if (isset($_COOKIE['login'])) echo 'checked';?>> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form> </body> </html>
Si possono verificare le seguenti possibilit: 1) Lutente accede alla pagina senza avere un cookie impostato e senza aver effettuato il login. In questo caso lutente vedr il form senza valori preimpostati e la casella ricordami sar non selezionata. 2) Lutente accede alla pagina avendo gi un cookie impostato e senza aver effettuato il login. In questo caso lutente vedr il form con i valori di username e password preimpostati e la casella ricordami sar selezionata. 3) Lutente accede alla pagina dopo aver effettuato il login. In questo caso lutente vedr il form con i valori di username e password preimpostati e la casella ricordami sar selezionata o meno a seconda della scelta fatta dallutente allatto del login. Se allatto del login la checkbox viene selezionata, allora allutente viene anche inviato un cookie. Redirezione dellutente Nellesempio mostrato, lutente registrato viene redirezionato ad una sua pagina personale mediante il codice:
La funzione header consente, appunto, di reindirizzare lutente a unaltra pagina, utilizzando la sintassi seguente: header(location: nome_file); Si osservi che il codice dellesempio contiene, dopo il nome del file, un punto interrogativo e unespressione del tipo nome_attributo=valore_attributo. In tal modo siamo in grado di passare alla pagina home.php uninformazione sul nome dellutente, che apparir nella query string. Linformazione sar anche presente nellarray $_GET allinterno dellelemento che ha come indice il nome dellattributo. Quindi, potremo recuperare il nome dellutente accedendo a $_GET[username]. 8
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
<?php //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; if (isset($_POST["remember"])) $remember = $_POST["remember"]; else $remember = null; //connessione al database $conn = mysql_connect("localhost", "root", "") or die("Impossibile connettersi al server"); $db = mysql_select_db("db", $conn) or die("impossibile selezionare il database"); //verifica dell'esistenza dell'utente $query = "SELECT username, password FROM utente WHERE username='$uid' AND password='$pwd'"; $result = mysql_query($query) or die("query fallita: ".mysql_error()); $trovato = false; while ($row = mysql_fetch_array($result)) $trovato = true; //disconnessione dal database mysql_close($conn); //elaborazione della risposta if ($trovato) { //lutente registrato if ($remember != null) { //se ha selezionato Remember me gli inviamo i cookie setcookie("login[username]", $uid, time() + 604800); //7 giorni setcookie ("login[password]", $pwd, time() + 604800); } //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } else //lutente non registrato e riceve un messaggio di errore echo "login errato;
9
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012
} else { //l'utente non ha effettuato il login //verifichiamo se esiste un cookie if (isset ($_COOKIE['login'])) { //recupero dati dai cookie $uid = $_COOKIE['login']['username']; $pwd = $_COOKIE['login']['password']; //redirezione dell'utente alla sua pagina personale header("location: home.php?username=".$uid); } } ?> <html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="post" action="login.php"> <label for="username">Username</label> <input id="username" name="username" type="text"> <br><br> <label for="password">Password</label> <input id="password" name="password" type="password"> <br><br> <a href="#">Hai dimenticato la password?</a><br><br> <input id="remember" name="remember" value="remember" type="checkbox"> <label for="remember">Ricordami</label> <input id="login-button" type="submit" value="Login"><br><br> <a href="#">Sei un nuovo utente? Registrati</a> </form> </body> </html>
Quest'opera stata rilasciata con licenza Creative Commons Attribution-ShareAlike 3.0 Unported. Per leggere una copia della licenza visita il sito web http://creativecommons.org/licenses/by-sa/3.0/ o spedisci una lettera a Creative Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
10
Bocchi Cinzia Ultimo aggiornamento: 10/03/2012