2010-11-27 214 views
5

我为我的网站写了一个登录系统。当用户注册时,系统会通过电子邮件向用户提供的电子邮件地址发送激活链接。该链接包含两个参数,电子邮件和密钥。电子邮件参数包含用户的电子邮件地址,关键参数包含注册码,以便可以验证注册并将其从待定更改为确认。激活页面应该从电子邮件列中设置了email参数的行中获取状态列。出于某种原因,脚本决定任何链接都是有效的,并尝试更新帐户的状态,无论它是否存在。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 

将通过以下链接激活帐户,但它会重定向到登录页面激活后,如果链接无效。


编辑:

下面是该查询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查询您所使用的状态列一个where字段。

$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)."'"; 

要调试的代码,你怎么样注释掉headerexit命令,然后定义$刚过query1,做一个

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 ;.另外如何尝试,打印mysql_num_rows($ result1);.这些将帮助您了解发生了什么问题。 – Haluk 2010-11-27 01:48:07

+0

正确的查询是通过打印$ QUERY1返回:_SELECT`Status`从户口所在`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请求,电子邮件和密钥......而不是电子邮件和状态进行检查。