Ciao a tutti,
sto muovendo i miei primi passi col PHP incontrando ovviamente i primi problemi...
Volendo realizzare un sistema semplice di iscrizione ad una newsletter con tanto di verifica inviata via email ed iscrizione ad un database MySql stavo studiando lo script postato sul sito Web PHP Easy Step:
http://www.phpeasystep.com/phptu/24.html
In pratica partendo da un modulo HTML dove si inseriscono i propri dati si manda il tutto ad uno script in PHP che ricava le informazioni dai campi e li invia in una tabella temporanea di un database assieme ad un codice temporaneo generato in maniera casuale e criptato con lo strumento md5. Fatto questo, lo script invia un messaggio email a chi si vuole iscrivere obbligandolo a confermare la volontà di iscriversi tramite un link che riporta al suo interno lo stesso codice temporaneo:
Codice PHP:
<?php
include('config.php');
// table name
$tbl_name=temp_members_db;
// Random confirmation code
$confirm_code=md5(uniqid(rand()));
// values sent from form
$name=$_POST['name'];
$email=$_POST['email'];
// Insert data into database
$sql="INSERT INTO $tbl_name(confirm_code, name, email)VALUES('$confirm_code', '$name', '$email')";
$result=mysql_query($sql);
// if succesfully inserted data into database, send confirmation link to email
if($result){
// ---------------- SEND MAIL FORM ----------------
// send e-mail to ...
$to=$email;
// Your subject
$subject="Messaggio di conferma iscrizione Newsletter";
// From
$header="from: Newsletter<no_reply@prova.it>";
// Your message
$message="Messaggio di conferma iscrizione Newsletter \r\n";
$message.="Clicca sul link per confermare la tua registrazione alla Newsletter. \r\n";
$message.="http://www.prova.it/confirmation.php?passkey=$confirm_code";
// send email
$sentmail = mail($to,$subject,$message,$header);
}
// if not found
else {
echo "Indirizzo email non trovato nel nostro database";
}
// if your email succesfully sent
if($sentmail){
echo "Un messaggio di conferma e' stato inviato al tuo indirizzo email.";
}
else {
echo "Impossibile inviare il messaggio di conferma al tuo indirizzo di posta elettronica.";
}
?>
Facendo clic sul link dell'email, un altro script in PHP va a vedere se nella tabella temporanea del database esiste il codice e se lo trova sposta i dati dell'iscritto in una tabella definitiva del database e li cancella dalla tabella temporanea:
Codice PHP:
<?php
include('config.php');
// Passkey that got from link
$passkey=$_POST['passkey'];
$tbl_name1="temp_members_db";
// Retrieve data from table where row that match this passkey
$sql1="SELECT * FROM $tbl_name1 WHERE confirm_code ='$passkey'";
$result1=mysql_query($sql1);
// If successfully queried
if($result1){
// Count how many row has this passkey
$count=mysql_num_rows($result1);
// if found this passkey in our database, retrieve data from table "temp_members_db"
if($count == 1){
$rows=mysql_fetch_array($result1);
$name=$rows['name'];
$email=$rows['email'];
$tbl_name2="registered_members";
// Insert data that retrieves from "temp_members_db" into table "registered_members"
$sql2="INSERT INTO $tbl_name2(name, email)VALUES('$name', '$email')";
$result2=mysql_query($sql2);
}
// if not found passkey, display message "Wrong Confirmation code"
else {
echo "Codice di conferma non valido";
}
// if successfully moved data from table"temp_members_db" to table "registered_members" displays message "Your account has been activated" and don't forget to delete confirmation code from table "temp_members_db"
if($result2){
echo "La tua registrazione e' stata attivata";
// Delete information of this user from table "temp_members_db" that has this passkey
$sql3="DELETE FROM $tbl_name1 WHERE confirm_code = '$passkey'";
$result3=mysql_query($sql3);
}
}
?>
Funzione tutto alla grande fino alla verifica del codice: la tabella temporanea con i dati degli iscritti ricavati dal modulo viene popolata correttamente e viene aggiunto il codice random. Il messaggio email viene inviato correttamente e contiene il medesimo codice alfanumerico ma quando si fa clic sul link di conferma nell'email appare il messaggio di codice non valido e i dati non vengono passati nella tabella definitiva del database.
La cosa ancora più grave per me inesperto e che la prima volta, e solo la prima, tutto ha funzionato a dovere ma poi più nulla nel senso che solo il primo ipotetico iscritto ha portato a termine con successo l'iscrizione alla newsletter e i dati sono stati correttamente spostati dalla prima alla seconda tabella del database. Inoltre se lascio vuoto il valore della variabile
Codice PHP:
$confirm_code = '';
tutto funziona e quindi il problema sta nel metodo di confronto del codice random.
Qualcuno mi sa dare una spiegazione?
E già che ci siamo, quanto è affidabile un simile sistema di iscrizione?
Me ne sapete consigliare uno più performante?
Ringraziandovi in anticipo, mi scuso se nel caso si sia già parlato di questo argomento.