2010-11-27 5 views
5

J'ai écrit un système de connexion pour mon site Web. Lorsque l'utilisateur s'enregistre, le système envoie un lien d'activation par e-mail à l'adresse e-mail fournie par l'utilisateur. Le lien contient deux paramètres, email et clé. Le paramètre e-mail a l'adresse e-mail de l'utilisateur et le paramètre clé a le code d'enregistrement afin que l'enregistrement puisse être vérifié et passé de en attente à confirmé. La page d'activation est censée extraire la colonne Statut de la ligne dont le paramètre de messagerie est défini dans la colonne Email. Pour une raison quelconque, le script décide que tout lien est valide et tente de mettre à jour le statut du compte, qu'il existe ou non.Problèmes d'activation de compte PHP

Voici mon code:

<?php 

$email = $_GET['email']; 
if($email == "") { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
    exit; 
} 
$key = $_GET['key']; 
if($key == "") { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
    exit; 
} 

$con = mysql_connect("HOST", "USER", "PASS") or die(mysql_error()); 
mysql_select_db("zach_yardad", $con) or die(mysql_error()); 
$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 
$result1 = mysql_query($query1) or die(mysql_error()); 
if(mysql_num_rows($result1) <= 0) { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} else { 
    $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'"; 
    mysql_query($query) or die(mysql_error()); 
    header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
    exit; 
} 

?> 

Voici un lien d'activation valide:

http://www.zbrowntechnology.info/yard/[email protected]&key=2772190956485245 

Il activer ce compte en suivant le lien, mais il sera redirigé vers la page de connexion après l'activation si le lien n'est pas valide.


EDIT:

Voici le résultat de la requête DESCRIBE `Accounts`:

First Name varchar(65) NO  NULL  
Last Name varchar(65) NO  NULL  
Email varchar(100) NO  NULL  
Username varchar(65) NO  NULL  
Password varchar(65) NO  NULL  
Status varchar(65) NO  NULL  

Répondre

4

Pouvez-vous essayer de changer votre code à ceci:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"); 
if(mysql_num_rows($query1) <= 0) { 

Cela devrait fonctionner ..

Si cela ne fonctionne pas, essayez ceci:

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'", $con); 
    if(mysql_num_rows($query1) <= 0) { 

==== Code complet ====

<?php 
if($_GET['email'] == "") { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 

if($_GET['key'] == "") { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 

$email = mysql_real_escape_string($_GET['email']); 
$key = mysql_real_escape_string($_GET['key']); 

$con = mysql_connect('HOST', 'USER', 'PASS'); 
mysql_select_db('zach_yardad', $con) or die(mysql_error()); 

$query1 = mysql_query("SELECT `Status` FROM `Accounts` WHERE `Email` = '" . $email . "' AND `Status` = '" . $key ."'", $con); 
if(mysql_num_rows($query1) <= 0) { 
header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit(); 
} else { 
mysql_query("UPDATE `Accounts` SET `Status`='Confirmed' WHERE `Email`='$email'", $con); 
header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
exit(); 
} 
?> 
+0

Yep! Ceci l'a arrangé, devinez que j'ai négligé cela. Merci! +1 pour vous! –

+0

heureux que vous l'avez corrigé Zach – 422

+0

je ne comprends pas comment cela pourrait résoudre ce problème? La connexion est un paramètre facultatif, elle utilisera la dernière connexion ouverte si elle n'est pas spécifiée. Les comptes ne sont pas un mot-clé, donc '\' Accounts \ '== Accounts'. Qu'avez-vous changé? ;) – meze

0

La première chose que je remarque est, dans votre requête mysql vous utilisez le état colonne comme un champ où.

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 

De la façon dont vous avez écrit votre code, il semble que ce devrait être:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'"; 

Pour déboguer le code, que diriez-vous que vous commentez les commandes header et exit et puis juste après avoir défini $ query1, faire un

print $query1; 

Re-essayer la page et cela vous aidera à voir ce que vous passez à mysql.

MISE À JOUR:

La lecture de votre entrée récente Je pense que cela pourrait fonctionner pour vous:

if(mysql_num_rows($result1) > 0) { 
    $query = "UPDATE Accounts SET `Status`='Confirmed' WHERE `Email`='$email'"; 
    mysql_query($query) or die(mysql_error()); 
    header("Location: http://www.zbrowntechnology.info/yard/login.php?message=Registration Complete!"); 
    exit; 

} else { 
    header("Location: http://www.zbrowntechnology.info/yard/register.php?message=Invalid Activation Link!"); 
exit; 
} 
+0

Le nom de colomn est Etat. Il contient la clé d'enregistrement, et après qu'il est activé, il contient la chaîne "Confirmé". Donc, je devrais vérifier pour voir si la colonne Statut = la clé $, ne devrais-je pas? –

+0

Ce n'est pas grave si vous êtes à l'aise avec cela. Allez-y et essayez d'imprimer $ query1 ;. Aussi, que diriez-vous d'essayer, imprimer mysql_num_rows ($ result1) ;. ceux-ci vous aideront à voir ce qui ne va pas. – Haluk

+0

La requête correcte est renvoyée par l'impression de $ query1: _SELECT 'Status' FROM Comptes WHERE' Email'='[email protected] 'AND 'Status' =' 2772190956485245'_ –

4

je remarquai que vous sélectionnez l'état, pour vérifier si son confirmé ou non ..

Votre champ Statut est celui où les données confirmées/non confirmées sont stockées correctement?

Ne devriez-vous pas vérifier la clé?

En d'autres termes, au lieu de:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Status`='".mysql_real_escape_string($key)."'"; 

Utilisation:

$query1 = "SELECT `Status` FROM Accounts WHERE `Email`='".mysql_real_escape_string($email)."' AND `Key`='".mysql_real_escape_string($key)."'"; 

Remplacement Key avec le nom du champ que vous stocker la clé dans ..comme c'est ce que vous vérifiez avec votre demande $ _GET, email et clé .. pas email et statut.

+1

incorrect, veuillez lire le manuel http: // php. net/manual/fr/function.mysql-num-rows.php –

+1

qui a l'air mieux – 422