Aspettando che arrivino gli alieni a salvarci ho fatto e già testato questa sotto specie di "guida" utilizzando PDO che è sicuramente il modo più all' avanguardia per interagire con il DB. Ovviamente mi aspetto critiche e insulti dai big affinchè possa essere migliorata.
Verranno creati i seguenti files:
- config.php
definisce il nome della tabella degli utenti, il nome delle colonne di username e password ed i parametri generali per l' accesso al DB.
Verrà incluso sempre prima di ogni connessione al DB a meno che non ci si voglia connettere ad un altro DB
- auth_class.php
contiene le classi per l' autenticazione, il logout e per la connessione al DB
- form_login.html
contiene il modulo html
- login.php
esegue il login richiamando la classe c_auth() presente nel file auth_class.php
- logout.php
esegue il logout richiamando la classe c_auth() presente nel file auth_class.php
- pagina_protetta.php
effettua il test di verifica del login
Il file config.php non fa altro che definire i parametri di connessione per il database.
L' ho pensato per gestire connessioni anche ad altri DB specificando quindi l' istanza.
config.php
Codice PHP:
define("DB_ISTANCE", "mysql");
define("DB_HOST_NAME", "localhost");
define("DB_USER", "nomeutentedeldb");
define("DB_PASS", "password_del_db");
define("DB_NAME", "nomedeldb");
define("USER_TABLE_NAME", "nome_tabella_utenti");
define("USER_COLUMN_NAME", "nome_colonna_username");
define("USER_COLUMN_PASS", "nome_colonna_password");
auth_class.php
La classe c_db() effettua la connessione al DB. Necessita dei parametri di connessione inseriti nel file config.php, oppure di qualsiasi altro parametro per qualsiasi altra connessione.
Codice PHP:
class c_db
{
public $_link; //Contiene la connessione al DB
//Crea la connessione
public function __construct($dbistance, $host, $user, $pass, $dbname)
{
//blocco try/catch di gestione delle eccezioni
try
{
$col = $dbistance.":host=".$host.";dbname=".$dbname;
//la proprieta' $_link sarà l' oggetto della connessione
$this->_link = new PDO($col, $user, $pass);
}
catch(PDOException $e)
{
//notifica in caso di errore nel tentativo di connessione
echo $e->getMessage();
}
}//method end
}//class end
//Classe per il login/logout
class c_auth
{
//effettua l' autenticazione
public function f_login($username, $password)
{
//controllo campi vuoti e variabili non settate
if(isset($username, $password) and $username != "" and $password != "")
{
$o_db = new c_db(DB_ISTANCE, DB_HOST_NAME, DB_USER, DB_PASS, DB_NAME);
$sql = "SELECT * FROM ".USER_TABLE_NAME." WHERE ".USER_COLUMN_NAME." = :username AND ".USER_COLUMN_PASS." = :password";
$stmt = $conn->_link->prepare($sql);
// bind dei parametri
$stmt->bindParam(':username', $username);
$stmt->bindParam(':password', $password);
//Eseguo la query
$stmt->execute();
//Se esistono risultati il login e' andato a buon fine
if($stmt->rowCount() > 0)
{
// creo un' array contenente il risultato
$result = $stmt->fetch();
/*
Memorizzo in sessione i dati relativi all' utente loggato,
ogni sessione avra' quindi la chiave associativa = al nome della colonna
della tabella utenti, se la colonna che contiene l' username si chiama
"username" la $_SESSION["user"]["username"] sarà la sessione contenente
l' username
*/
foreach($result as $key => $value)
{
$_SESSION["user"][$key] = $value;
}
print "Accesso eseguito con successo.<br> <a href=\"pagina_protetta.php\">Vai alla pagina protetta</a>";
/****************************************
* ...o redirect dove ti pare con:
* header("Location: dove_ti_pare.php");
*****************************************/
}
else
{
print "Login errato";
}
}//if campi vuoti
else
{
print "Specificare nome utente e password please ;-)";
}
}//method end
//Esegue il logout
public function f_logout()
{
session_destroy();
$msg = "Hai effettuato il logout.<br><a href=\"form_login.html\">esegui il login</a>";
$msg .= "<br><a href=\"pagina_protetta.php\">Pagina protetta</a>";
print $msg;
//...oppure una redirect:
//header("location: index.php");
}
} //class c_auth end
form_login.html
Codice PHP:
<form action="login.php" method="post">
<input type="text" name="username"> Username
<br>
<input type="password" name="password"> Password
<br>
<input type="submit">
</form>
login.php
Codice PHP:
//Avvio la sessione
session_start();
//includo la classe per il login
include("auth_class.php");
//includo il file config.php con i dati per l' accesso al DB
include("config.php");
$o_auth = new c_auth();
$o_auth->f_login($_POST["username"], $_POST["password"]);
logout.php
Codice PHP:
//Avvio la sessione
session_start();
//includo la classe per il login
include("auth_class.php");
$o_auth = new c_auth();
$o_auth->f_logout();
pagina_protetta.php farà da test per il login.
Come prima cosa viene invocata la funzione session_start() grazie alla quale potremo utilizzare le variabili di sessione memorizzate in precedenza.
La funzione session_start() non deve essere preceduta da nessun output (echo o print)
pagina_protetta.php
Codice PHP:
//Avvio la sessione
session_start();
//Se non e' stato effettuato l' accesso blocco tutto
if(!isset($_SESSION["user"]))
{
print "non sei loggato <a href=\"form_login.html\">esegui il login</a>";
//...o redirect
exit;
}
//se è stato effettuato l' accesso visualizza il contenuto
//...
//...
//...
Aspetto gli insulti, ciao!