Sei sulla pagina 1di 9

PHP e MySQL: funzionalit Login

In questa dispensa viene fornito un esempio per realizzare la funzionalit di login a un sito. Le tecnologie impiegate sono HTML, PHP e MySQL. Saranno descritti in dettaglio i passaggi per accedere al database.

Login : creazione del form HTML


Il form che consente ad un utente di effettuare il login comprende solitamente i seguenti controlli: un campo testo per inserire lo username; un campo password per inserire la password; 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; un pulsante per sottomettere i dati. Naturalmente, ogni controllo deve essere accompagnato da una etichetta esplicativa. Per il momento, limitiamoci a considerare i campi di testo, di password e il pulsante per linvio della richiesta e andiamo a creare il form, senza preoccuparci della grafica.
login.html

<html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="" action=""> <label for="username">Username</label> <input id="username" name="username" type="text"> <label for="password">Password</label> <input id="password" name="password" type="password"> <input id="login-button" type="submit" value="Login"> </form> </body> </html>

Quando lutente fa clic sul pulsante Login, lo username e la password vengono inviati al server per lelaborazione. Lo script PHP che si occupa dellautenticazione dellutente deve: ottenere username e password; accedere al database e verificare se username e password esistono e a quale utente corrispondono; 1
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

inviare la risposta al client; la risposta sar positiva se lutente stato riconosciuto, negativa altrimenti.

Dopo aver deciso quale metodo HTTP utilizzare 1, torniamo al form e inseriamo il metodo nellattributo method. Naturalmente non consigliabile utilizzare get per linvio di password, quindi opteremo per post.
login.html

<html> <head> <title>Esempio Login</title> </head> <body> <form id="login-form" name="login-form" method="post" action=""> <label for="username">Username</label> <input id="username" name="username" type="text"> <label for="password">Password</label> <input id="password" name="password" type="password"> <input id="login-button" type="submit" value="Login"> </form> </body> </html>

Login : creazione dello script PHP


Lo script PHP (login.php) dovr effettuare le seguenti operazioni.
login.php

<?php //recupero dei dati inviati //connessione al database //verifica dell'esistenza dell'utente //disconnessione dal database //elaborazione della risposta ?>

Recupero dei dati inviati

I dati inviati mediante il form vengono memorizzati nellarray $_POST $_POST username inserito password inserita username password Assegniamo tali valori a due variabili locali: $uid = $_POST[username] $pwd = $_POST[password] Vediamo come si modifica il codice di login.html e login.php.
1

Vedere http://www.scribd.com/doc/24193963/Passaggio-di-Parametri-al-Server

2
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

login.html

<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"> <label for="password">Password</label> <input id="password" name="password" type="password"> <input id="login-button" type="submit" value="Login"> </form> </body> </html>
login.php

<?php //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //connessione al database //verifica dell'esistenza dell'utente //disconnessione dal database //elaborazione della risposta ?>

Connessione al database

I comandi PHP necessari per connettersi al database ed eseguire interrogazioni sulle tabelle sono i seguenti:

CONNESSIONE AL SERVER

$conn = mysql_connect(localhost, root, password) or die(impossibile connettersi al server);

SELEZIONE DEL DATABASE

$db = mysql_select_db(nomedb, $conn) or die(impossibile selezionare il database); Vediamo lo script PHP modificato, supponendo che: lhost sia localhost, lo username sia root, non sia richiesta password, il nome del database sia db.

3
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

login.php

<?php //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //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 //disconnessione dal database //elaborazione della risposta ?>

Verifica dellesistenza dellutente

Arrivati a questo punto, dobbiamo preparare ed eseguire la query che verifica se lutente registrato. Il recordset risultante deve poi essere esaminato per valutare i risultati ottenuti. Esso conterr il record dellutente che ha effettuato il login o nessun record, a seconda che lutente sia o meno registrato. I passi necessari per verificare lesistenza dellutente sono i seguenti:

PREPARAZIONE DELLA QUERY

$query = .............;

ESECUZIONE DELLA QUERY

$result = mysql_query($query) or die(query fallita: .mysql_error());

ESTRAZIONE DEI RECORD DAL RECORD SET

while ($row = mysql_fetch_array($result)) { ............. } Per accedere a un campo del record estratto si utilizza la sintassi: $row [nome_campo] Supponiamo che nel database esista una tabella utente come la seguente: utente idUtente username password 1 uid1 pwd1 2 uid2 pwd2 3 uid3 pwd3 La query in questione deve cercare nella tabella utente un record il cui username coincide con $uid e la password con $pwd: 4
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

SELECT username, password FROM utente WHERE username = $uid AND password = $pwd; Osservate che le variabili PHP devono essere racchiuse tra apici. Vediamo lo script PHP modificato:
login.php

<?php //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //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 //elaborazione della risposta ?>

La variabile $trovato, valorizzata inizialmente a false, acquisisce il valore true solo se si entra nel ciclo while, cio solo se il recordset risultante contiene almeno un record. In altri termini, $trovato varr true solo se lutente che ha effettuato il login effettivamente registrato. Il ciclo while estrae dal recordset risultante un record alla volta e lo assegna a $row. $row pertanto un array associativo i cui indici coincidono con i nomi dei campi della tabella utente. Disconnessione dal database

La disconnessione avviene mediante il comando: mysql_close($conn); A seguire lo script modificato.

5
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

login.php

<?php //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //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 ?>

Elaborazione della risposta

La variabile $trovato, come detto in precedenza, vale true solo se lutente stato trovato nella tabella utente; in caso contrario vale false. Di conseguenza, sufficiente analizzare il valore di questa variabile per stabilire il tipo di risposta da restituire allutente. Per il momento invieremo la risposta utilizzando la funzione echo. Ecco lo script completo:
login.php

<?php //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //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) echo "Benvenuto ".$uid; else

6
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

echo "Login errato o utente non registrato"; ?>

PHP e HTML in ununica pagina


Se avete provato ad eseguire il codice precedente vi sarete accorti che la risposta inviata allutente appare in una pagina priva di elementi HTML. Questo non un comportamento desiderabile poich la risposta dovrebbe apparire nella stessa pagina che lutente ha utilizzato per inviare i dati o in una pagina simile. Le soluzioni per ovviare a tale inconveniente sono molteplici ma noi ne vedremo una in particolare che consiste nellutilizzare una sola pagina invece di due per contenere sia il codice HTML che lo script PHP. Per includere tutto in una singola pagina PHP bisogna essere in grado di determinare se lutente la sta visualizzando per la prima volta e quindi deve ancora effettuare il login, oppure se ha gi inviato i dati richiesti. Questa verifica si pu effettuare controllando se larray $_POST ha almeno un campo impostato. Infatti, quando lutente preme il pulsante Login, larray $_POST viene valorizzato con i dati immessi nelle caselle username e password. Se lutente non specifica dati in queste caselle, gli elementi dellarray vengono valorizzati a stringa vuota. Diversamente, se lutente non ha ancora effettuato il login, larray $_POST non contiene elementi. A tale scopo utilizzeremo la funzione isset. Inoltre, il valore dellattributo action deve coincidere con la pagina PHP oppure pu essere stringa vuota. Il codice della pagina singola login.php diventa il seguente.
login.php

<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"> <label for="password">Password</label> <input id="password" name="password" type="password"> <input id="login-button" type="submit" value="Login"> </form> <?php //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //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
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

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) echo "Benvenuto ".$uid; else echo "Login errato o utente non registrato"; } ?> </body> </html>

Organizzare il codice PHP con le funzioni


Nel seguito trovate un esempio di codice php organizzato con le funzioni. Il risultato ottenuto , comunque, sempre lo stesso.
<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"> <label for="password">Password</label> <input id="password" name="password" type="password"> <input id="login-button" type="submit" value="Login"> </form> <?php function connect($database) { $host = "localhost"; $root = "root"; $passw = " "; $conn = mysql_connect($host, $root, $passw) or die("Impossibile connettersi al server"); $db = mysql_select_db($database, $conn) or die("impossibile selezionare il database"); return $conn; } function disconnect($conn) { mysql_close($conn); } function executeQuery($query) { $result = mysql_query($query)

8
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012

or die("query fallita: ".mysql_error()); return $result; } //verifica dell'effettuazione del login if (isset($_POST["username"])) { //recupero dei dati inviati $uid = $_POST["username"]; $pwd = $_POST["password"]; //connessione al database $conn = connect("db"); //verifica dell'esistenza dell'utente $query = "SELECT username, password FROM username='$uid' AND password='$pwd'"; $result = executeQuery($query); $trovato = false; while ($row = mysql_fetch_array($result)) $trovato = true; //disconnessione dal database disconnect($conn); //elaborazione della risposta if ($trovato) echo "Benvenuto ".$uid; else echo "Login errato o utente non registrato"; } ?> </body> </html>

utente

WHERE

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.

9
Bocchi Cinzia Ultimo aggiornamento: 25/11/2012