Ciao a tutti,
posto un esempio semplice di come possiamo permettere l'accesso alle aree protette del nostro sito solo agli utenti che abbiano fornito un email valida in fase id registrazione.
Sono richiesti l'utlizzo di MySql, e la configurazione per l'invio delle email in locale
Sintetizzando possiamo dire che questo esempio si svolge nelle seguenti fasi:
1. Realizzazione tabelle necessaire: creatab.php
2. Elaboazione pagina di registrazione: registrazione.php
3. Inserimento dati nel DB ed invio email per la conferma: data_insert.php
4. Conferma della registrazione: confirm_reg.php
5. Realizzazione pagina di login (sfruttando le sessioni): index.php
6. Realizzazione pagina di logout: logout.php
Tutti le spiegazioni del susseguirsi delle azioni sono state aggiunte sotto forma di commenti all'interno delle pagine stesse, per una maggiore chiarezza.
1. Realizzazione tabelle necessaire: iniziamo creando le due tabelle che ci serviranno per il proseguo di questo esempio.
Codice PHP:
<?php
require('connessionedb.php'); //o le vostre istruzioni per il collegaamento al db
$query = "CREATE TABLE user (
user_id INT(11) NOT NULL AUTO_INCREMENT,
user_firstname VARCHAR (50) NOT NULL,
user_lastname VARCHAR (50) NOT NULL,
user_username VARCHAR (11) NOT NULL,
user_password VARCHAR (32) NOT NULL,
user_email VARCHAR (50) NOT NULL,
user_reg TINYINT (1) NOT NULL default 0,
PRIMARY KEY (user_id))";
$users = mysql_query($query) or die(mysql_error());
$qry = "CREATE TABLE confirm (
confirm_id INT(11) NOT NULL AUTO_INCREMENT,
confirm_validator VARCHAR (32) NOT NULL,
confirm_userid INT (11) NOT NULL default 0,
PRIMARY KEY (confirm_id))";
$confirm = mysql_query($qry) or die(mysql_error());
?>
2. Elaboazione pagina di registrazione: registrazione.php. Questa pagina permette all'utente di fornire i propri dati per l'iscrizione al sito.
Codice PHP:
<?php
session_start(); /* session_start - Inizializza i dati di sessione
creando una sessione (o riprendendo quella corrente).
N.B. session_start() va messo all'inizio delle pagine php e prima del codice HTML*/
/*$_SESSION['log'] è la prima variabile di sessione che utilizzeremo.
In questo esempio $_SESSION['log'] contiene un valore asseganto nella pagina di login,
che vedremo più avnti, che in pratica assume due valori (da noi stabiliti): 0 se
l'utente non ha effettuato il login e 1 se l'utente ha effettuato il login.
Nell'esempio concreto impediamo ad un utente logato di effettuare un'altra iscrizione*/
if ($_SESSION['log'] == 1)
{
echo "
[b]Sei già registrato![/b]
Per effettuare una nuova registrazione" .
"ritorna alla Home Page ed effettua il Logout.
";
echo "<a href=\"index.php\"><<< Clicca qui per ritornare alla Home Page</a></p>";
exit();
}
?>
<html>
<head>
<title>Registrazione</title>
<!-- Per comodita e completezza, nello svolgimento degli script,
utilizzeremo 2 javascript che ci permettono di contollare le seguenti azioni:
1. function ver() - la quale controlla che tuttti i campi del nostro form
di inserimento siano compilati.
2. function ControllaMail() - la quale controlla che l'email inserita sia
solo sintatticamente corretta (e non se realmente esistente).
Possiamo dire che il loro utilizzo in questo caso risulta
essere più adatto, rispetto a script equivalenti in php, in quanto gli javascript
vengono eseguiti sul lato client, mentre quelle php
passano al server (lato server) e poi restituite all'utente sotto forma di html. -->
<SCRIPT LANGUAGE="JavaScript">
function ver()
{
for (i=0; i<document.forms[0].elements.length; ++i)
if(document.forms[0].elements[i].value == "")
{
alert("Riempire tutti i campi!");
document.forms[0].elements[i].focus();
return false;
}
return true;
}
</SCRIPT>
<SCRIPT>
function ControllaMail()
{
EmailAddr = document.modulo.email.value;
Filtro = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-]{2,})+\.)+([a-zA-Z0-9]{2,})+$/;
if (Filtro.test(EmailAddr))
return true;
else
{
alert("Controlla l'indirizzo e-mail inserito!");
document.modulo.email.focus();
return false;
}
}
</SCRIPT>
</head>
<body>
<!-- Procediamo costruendo il nostro form che passerà le informazioni inserite alla pagina data_insert.php.
Da notare:
1. action="data_insert.php?action=add&type=user" - che ci permette di passare le 2 variabili action e type,
con i loro rispettivi valori, add e user
2. il richiamo delle funzioni javascript al premere del pulsante "Conferma": onSubmit="return (ver() && ControllaMail());" -->
<form name="modulo" action="data_insert.php?action=add&type=user" method="post" onSubmit="return (ver() && ControllaMail());">
Nome
<input name="firstname" type="text" size="25" maxlength="30">
Cognome
<input name="lastname" type="text" size="25" maxlength="30">
Username
<input name="user" type="text" size="20" maxlength="11">
Password
<input name="pass" type="password" maxlength="8">
E-mail
<input name="email" type="text" size="50" maxlength="50">
<input type="submit" name="Submit" value="Conferma">
</form>
</p>
</body>
</html>
3. Inserimento dati nel DB ed invio email per la conferma: data_insert.php. Questa pagina ci permette di inserire i dati del utente nel db e di inviare un'email contenente un link alla pagina confirm_reg.php per la conferma del iscrizione.
Codice PHP:
<?php
require('connessionedb.php'); //o le vostre istruzioni per il collegamento al database
/*La prima cosa da notere è l'utilizzo di mysql_real_escape_string():
- questa funzione ci permette di inserire nel db (se utiliziamo mysql)
il contenuto della variabile post esattamnete così com'è,
senza creare problemi di sintassi durante l'inserimento.Si veda l'esempio sotto*/
$user = mysql_real_escape_string($_POST['user']); /* Se il valore contenuto in $_POST['user'] è: D'amico questo viene trasformato in: D\'amico*/
$user_mail = $_POST['user']; // Viceversa se usiamo il metodo tradizionale di assegnazione
//rimane il valore originale assegnato: D'amico
//quello che in questo esempio ci serve per inviare una mail all'utente,
//contenente l'username originale (non trasformato).
$pass = mysql_real_escape_string(md5($_POST['pass']));
//La funzione md5 ci permette di trasformare il contenuto di una stringa
//in una sequenza di 32 simboli alfa nimerici detta hash.
//Noi utiliziamo questa funzione per memorizzare nel db NON il valore originale della password,
//ma il suo hash.
//N.B. Questo significa che una volta persa (dimenticata) la password non è più possibile
//risalire al suo valore originale.
$pass_mail = $_POST['pass'];
$firstname = mysql_real_escape_string($_POST['firstname']);
$lastname = mysql_real_escape_string($_POST['lastname']);
//Poi verifichiamo che l'username e l'email non siano gia presenti nel db
$query = "SELECT * FROM user " .
"WHERE user_username = '$user' " .
"OR user_email = '$pass' ";
$result = mysql_query($query) or die (mysql_error());
if (mysql_num_rows($result) != 0)
{
while ($row = mysql_fetch_array($result))
{
//username già presente nel db
if ($row['user_username'] == $user)
{
echo "
";
echo "L'username, [b]" . $row['user_username'] . "[/b] è già in uso da un altro utente, scegliere uno diverso";
echo "</p>";
}
//email già presente nel db
if ($row['user_email'] == $_POST['email'])
{
echo "
";
echo "La casella E-mail, [b]" . $row['user_email'] . "[/b] è già presente nel Data Base, scegliere una diversa";
echo "</p>";
}
}
//rimandiamo l'utente alla pagina precedente
echo "
";
echo "<a href=\"registrazione.php\">";
echo "<<< Clicca qui per ritornare alla pagina precedente";
echo "</a>";
echo "</p>";
exit();
}
//Se invece username e email non sono presenti nel db procediamo con l'inserimanto
else
{
switch ($_GET['action'])
{
case "add":
switch ($_GET['type'])
{
case "user":
$sql = "INSERT INTO user
(user_firstname,
user_lastname,
user_username,
user_password,
user_email)
VALUES
('$firstname',
'$lastname',
'$user',
$pass',
'" . $_POST['email'] . "')";
$users = mysql_query($sql) or die(mysql_error());
$id = mysql_insert_id(); // recuperiamo l'id (contenuto nel campo user_id) dell'utente appena inserito
break;
}
break;
}
}
//Andiamo avanti assegnando un valore casuale alla variabile $msgid:
//un valore identificativo che verrà inserito nella tabella confirm e permetterà la conclusione dell'iscirzione.
//Anche in questo caso utilizziamo la funzione md5, generando però un hash casuale, perchè l'hash generato sia diverso per ogni iscrizione.
$temp = gettimeofday();
$msec = (int) $temp["usec"];
$msgid = md5(time() . $msec);
$ins = "INSERT INTO confirm
(confirm_validator,
confirm_userid)
VALUES
('$msgid',
'$id')";
$res = mysql_query($ins) or die(mysql_error());
?>
<html>
<head>
<title>Inserimento dati</title>
</head>
<body>
<?php
/*Arrivati a questo punto non ci resta che spedire un'email all'utente (all'indirizzo fornito
in fase di registrazione) che contiene:la sua password in chiaro,il suo username ed un link
alla pagina confirm_reg.php.*/
//Vediamo come funziona
$to = $_POST["email"];
$toname = $_POST["firstname"];
$subject = "Completa la tua registrazione";
/* Prima di continuare apriamo una piccola parentesi, chiarendo un concetto molto semplice:
- Se vogliamo inviare un email che contiene formattazioni html, bisogna ricorrere all'utilizzo di una classe.
- Se si vuol mandare un'email semplice che non contiene formattazioni html, non è necessario usare una classe
Nel nostro esempio, abbiamo scelto di inviare un'eamil, utlizzando una classe che definisce
il corpo del messaggio e le intestazione del messaggio.
Forniamo un link ad una classe mail completa e performante
[url]http://phpmailer.sourceforge.net[/url] */
//Definiamo la classe che definisce il corpo del messaggio ($message) e le intestazione del messaggio ($headers)
$boundary = "==MP_Bound_xyccr948x==";
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: multipart/alternative; boundary=\"$boundary\"\r\n";
$headers .= "From: [email]quellochevuoi@tuoserver.it[/email]\r\n"; //inseriamo l'indirizzo email del mittente, cioè il nostro
$html_msg = "<center>";
$html_msg .= "<table width=\"500\" border=0 cellpadding=\"4\">";
$html_msg .= "<tr><td align=\"center\">";
$html_msg .= "</td></tr>";
$html_msg .= "<tr><td>Questi sono i dati della tua registrazione:";
$html_msg .= "</td></tr><tr><td>Username: <font color=\"red\">" . $user_mail . "</font>";
$html_msg .= "</td></tr><tr><td>Password: <font color=\"red\">" . $pass_mail . "</font>";
$html_msg .= "</td></tr><tr><td align=\"center\">";
$html_msg .= "</td></tr></table></center>";
$confirmmessage = "Salve " . $toname . ",\n\n";
$confirmmessage .= "per completare la tua registrazione devi cliccare sul link sottostante:\n\n";
$confirmmessage .= $html_msg . "\n\n";
// Attenzione! Qui sotto dobbiamo inserire il percorso esatto che porta alla nostra pagina confirm_reg.php
$confirmmessage .= "<a href=\"http://localhost/percorso pagina confirm_reg.php" .
"?id=$msgid\">Clicca qui per confermare la tua registrazione</a>";
$message = "This is a Multipart Message in MIME format\n";
$message .= "--$boundary\n";
$message .= "Content-type: text/html; charset=iso-8859-1\n";
$message .= "Content-Transfer-Encoding: 7bit\n\n";
$message .= $confirmmessage . "\n";
$message .= "--$boundary--";
$mailsent = mail($to, $subject, $message, $headers);
if ($mailsent)
{
echo "Salve" . $toname . ",
";
echo "Un messaggio è stato inviato all'indirizzo [b]" . $to . "[/b] da te fornito.
";
echo "IMPORTANTE:
";
echo "Per completare la registrazione al sito devi aprire la tua casella e-mail, leggere il messaggio di conferma e cliccare sul link che troverai all'interno.
";
} else {
echo "Errore durante l'invio dell'e-mail.";
}
?>
</body>
</html>