PHP 帐户激活问题

Posted

技术标签:

【中文标题】PHP 帐户激活问题【英文标题】:PHP Account Activation Issues 【发布时间】:2011-05-16 10:19:44 【问题描述】:

我为我的网站编写了一个登录系统。当用户注册时,系统会通过电子邮件将激活链接发送到用户提供的电子邮件地址。该链接包含两个参数,电子邮件和密钥。 email 参数有用户的电子邮件地址,key 参数有注册码,这样注册就可以被验证并从待定变为已确认。激活页面应该从电子邮件列中设置了电子邮件参数的行中获取状态列。出于某种原因,脚本判断任何链接都是有效的,并尝试更新帐户的状态,无论它是否存在。

这是我的代码:

<?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/activate.php?email=zach@zbrowntechnology.com&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     

【问题讨论】:

【参考方案1】:

你能不能试着把你的代码改成这样:

$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();

?>

【讨论】:

是的!这解决了它,我想我忽略了这一点。谢谢!为你 +1! 我不明白如何解决它?连接是可选参数,如果没有指定,它将使用最后打开的连接。帐户不是关键字,所以`Accounts` == Accounts。你有什么改变? ;) 好吧,我认为它有效。现在又说所有链接(有效或无效)都是无效的。 你能告诉我电子邮件表中的状态值是什么吗:zach@zbrowntechnology.com 但他的代码似乎是正确的,尝试将 if 更改为:if(mysql_fetch_array($result1) == false) (谁知道?)【参考方案2】:

我注意到您正在选择状态,以检查它是否已确认..

您的状态字段是已确认/未确认的正确存储位置?

你不应该检查钥匙吗?

换句话说,而不是:

$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 替换为您存储 KEY 的字段的名称。因为这是您使用 $_GET 请求、电子邮件和密钥检查的内容。而不是电子邮件和状态。

【讨论】:

不正确,请阅读手册php.net/manual/en/function.mysql-num-rows.php【参考方案3】:

我注意到的第一件事是,在您的 mysql 查询中,您使用 status 列作为 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 的内容。

更新:

阅读您最近的输入,我认为这可能对您有用:

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;

【讨论】:

列名是Status。它包含注册密钥,激活后包含字符串“Confirmed”。所以,我应该检查一下 Status 列是否 = $key,不是吗? 如果您对它感到满意,那没关系。继续尝试打印 $query1;。还有如何尝试,打印 mysql_num_rows($result1);。这些将帮助您了解问题所在。 打印 $query1 返回正确的查询:SELECT Status FROM Accounts WHERE Email='zach@zbrowntechnology.com' AND Status='2772190956485245'

以上是关于PHP 帐户激活问题的主要内容,如果未能解决你的问题,请参考以下文章

PHP mail() 激活

多商店,使用 prestashop 手动激活帐户

检查用户是不是激活了他/她的帐户的最有效方法?

反应帐户激活

生成/存储帐户激活码

Djoser:触发用户帐户激活操作