2010-11-27 5 views
5

Я написал систему входа для своего сайта. Когда пользователь регистрируется, система отправляет ссылку активации на адрес электронной почты, предоставленный пользователем. Ссылка содержит два параметра: адрес электронной почты и ключ. Параметр электронной почты имеет адрес электронной почты пользователя, а ключевой параметр имеет регистрационный код, чтобы регистрация могла быть проверена и изменена с ожидающего подтверждения. На странице активации предполагается получить столбец «Статус» из строки, в которой указан параметр электронной почты в столбце «Электронная почта». По какой-то причине сценарий решает, что любая ссылка действительна, и пытается обновить статус учетной записи, существует ли она или нет.Вопросы активации учетной записи PHP

Вот мой код:

<?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; 
} 

?> 

Вот действительная ссылка активации:

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

Он будет активировать эту учетную запись, перейдя по ссылке, но он будет перенаправлять на страницу входа после активации, если ссылка недействительна.


EDIT:

Вот результат запроса 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  

ответ

4

Вы можете попробовать изменить свой код на этот:

$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) { 

Это должно работать ..

Если это не сработает, попробуйте следующее:

$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) { 

==== Полный код ====

<?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

Первое, что я замечаю это, в вашем MySQL Query вы используете статус столбец как где поле.

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

От того, как вы написали свой код, кажется, что это должно быть:

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

Для отладки кода, как о закомментировать команды header и exit, а затем только после определения $ query1, do a

print $query1; 

Повторите попытку страницы, и это поможет вам увидеть, что вы передаете mysql.

UPDATE:

Читают недавний ввод Я думаю, что это может работать для вас:

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

Название colomn Статус. Он содержит регистрационный ключ, и после его активации он содержит строку «Подтверждено». Итак, я должен проверить, не является ли столбец Status = ключ $, не так ли? – 2010-11-27 01:40:54

+0

Это нормально, если вам это удобно. Попробуйте распечатать $ query1 ;. Также как насчет try, print mysql_num_rows ($ result1) ;. это поможет вам понять, что происходит не так. – Haluk 2010-11-27 01:48:07

+0

Правильный запрос возвращается путем печати $ query1: _SELECT `Status` FROM Accounts WHERE` Email`='[email protected] 'И `Status` =' 2772190956485245'_ – 2010-11-27 01:54:25

4

Я заметил, что вы выбираете статус, чтобы проверить, если его подтвердить или нет ..

В вашем поле Состояние подтверждено/неподтверждено сохранено правильно?

Разве вы не должны проверять ключ?

Другими словами, вместо того, чтобы:

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

Использование:

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

Замена Key с именем поля хранятся КЛЮЧ в ..так как это то, что вы проверяете с помощью вашего запроса $ _GET, электронной почты и ключа, а не электронной почты и статуса.

Смежные вопросы