Salve,
Non desidero la soluzione, bensì una spiegazione teorica alla risoluzione del problema.
Vorrei arrivare per ragionamento, vorrei capire l'errore per imparare! C=
Devo capire l'errore, il punto in cui la logica del file non torna e mi crea questo errore, oppure direttamente la correzione, ma devo capire tutto quindi seguita da una spiegazione, voglio imparare! =D
L'algoritmo effettua:
1. Creazione tabelle nel database;
2. Registrazione di un account: Nome, Cognome, Nickname (utilizzato per accedere) Password ed Email.
3. Un email invia Nickname e Password, e un link per confermare la registrazione.
4. Avviene in confronto del codice alfanumerico di 32 caratteri presente sul database e quello presente nel link per completare la registrazione e qui E' ERRORE!
In pratica (sintesi):
Mi registro, un email mi invia un link di conferma con un codice di 32 caratteri alfanumerici.
Tipo:
http://MIOSITOWEB/conferma_registrastrazione.php?id= e un codice di 32 caratteri
Ora deve fare il confronto con la tabella CONFIRM_VALIDATOR quando clicco il link (che contiene questo codice alfanumerico). Se il codice del link è uguale a quello della tabella, la tabella CONFIRM_USERID aumenta da 0 a 1!
Ma siccome il link conduce ad una pagina di errore (pagina non trovata) e non avviene il confronto per un motivo che mi sfugge l'account non si può convalidare mai! ^-^
Passiamo al codice:
file: conferma_registrazione.php
Codice PHP:
<?php
require('db.php');
$id = $_GET['id'];
$sql = "SELECT * FROM confirm WHERE confirm_validator = '$id'";
$query = mysql_query($sql) or die(mysql_error());
$pcarray = mysql_fetch_array($query); // Memorizza nell'array
$pcarray if (!is_array($pcarray)) {
echo "Oops! Niente da confermare!";
exit; }
$user_id = $pcarray["confirm_userid"];
// Aggiorna la tabella user
$update = "UPDATE user SET " . "user_reg = 1 " . "WHERE user_id = '$user_id'";
$result = mysql_query($update) or die(mysql_error());
?>
<html> <head> <title>Iscrizione confermata!</title> </head> <body> <h3>Complimenti, la tua iscrizione al sito è stata confermata!</h3><br> <p><a href="index.php">Clicca qui per tornare alla Home Page ed effettuare il log-in</a></p> </body> </html>
Questa è la pagina che si occupa di ricevere il link e di fare il confronto di codice, facendo l'update della tabella da 0 a 1 se il codice corrisponde, attivando quindi l'account!
file: creazione_tabelle.php
Codice PHP:
<?php
// Istruzioni collegamento con il Database
require('db.php');
$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());
$user = mysql_real_escape_string($_POST['user']);
$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());
?>
Questa pagina si occupa di creare le due tabelle CONFIRM E USER.
file: registrazione.php
Codice PHP:
<?php
require('db.php');
$user = mysql_real_escape_string($_POST['user']);
$user_mail = $_POST['user'];
//Hash per non memorizzare il valore originale della password
$pass = md5($_POST['pass']);
$pass_mail = $_POST['pass'];
$firstname = mysql_real_escape_string($_POST['firstname']);
$lastname = mysql_real_escape_string($_POST['lastname']);
//Verifico che NickName e Email non siano già presenti sul DataBase
$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))
{
//Se il nickname esiste
if ($row['user_username'] == $user)
{
echo "<p>";
echo "L'username, <b>" . $row['user_username'] . "</b> è già in uso da un altro utente, scegliere uno diverso";
echo "</p>";
}
//Se l'email esiste
if ($row['user_email'] == $_POST['email'])
{
echo "<p>";
echo "La casella E-mail, <b>" . $row['user_email'] . "</b> è già presente nel DataBase, scegliere una diversa";
echo "</p>";
}
}
//Torna alla pagina di registrazione se esistono
echo "<p>";
echo "<a href=\"registrazione.php\">";
echo "<-- Clicca qui per ritornare alla pagina precedente";
echo "</a>";
echo "</p>";
exit();
}
//Se non sono presenti nel DataBase
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();
// Recupero l'ID (user_id) dell'utente appena registrato
break;
}
break;
}
}
//Andiamo avanti assegnando un valore casuale alla variabile $msgid che contiene un valore identificativo che viene inserito nella tabella confirm. (utilizzo MD5 e Hasho)
$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
//Invio un Email contentente NickName, password in chiaro e link per confermare la registrazione.
$to = $_POST["email"];
$toname = $_POST["firstname"];
$subject = "Completa la tua registrazione";
$boundary = "==MP_Bound_xyccr948x==";
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: multipart/alternative; boundary=\"$boundary\"\r\n";
$headers .= "From: miaemail@gmail.com \r\n";
$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";
confirm_reg.php
$confirmmessage .= "<a href=\"http://MIOSITOWEB/conferma_registrazione.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 . ",<br>";
echo "Un messaggio è stato inviato all'indirizzo <b>" . $to . "</b> da te fornito.<br><br>";
echo "IMPORTANTE:<br>";
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.<br><br>";
} else {
echo "Errore durante l'invio dell'e-mail.";
}
?>
</body>
</html>
Questo è il file della registrazione, si occupa di controllare la compilazione del form, di inviare i dati ad un altro file che successivamente li riporta sul database, e di inviare l'email con nick, password e codice di attivazione.
Spero di essere stato molto chiaro nella spiegazione e che siccome tutti quanti sono passati dalle basi della programmazione, spero quindi di essere aiutato a capire almeno la logica che mi ha fatto sbagliare, voglio imparare tutto, migliorare! =))
Grazie dell'attenzione, una buona giornata! ^-^