2011-02-02 50 views
0

任何人想试试为什么此电子邮件激活不起作用?基本上,我发送两个URL查询变量,将激活密钥和电子邮件存储为响应。我将它们解压缩为list()并将它们用作db查询。所有的db对象在测试时运行良好,但是当我从电子邮件运行脚本时,它会打印出回显语句:“该帐户现在处于活动状态......”但是当我检查数据库时,它没有更新这些东西我告诉它即激活密钥,状态和userid。电子邮件激活脚本的问题

下面是一个奇怪的部分:当我在数据库中只有一个用户时,代码就会按照它应该执行的操作。但只要我尝试添加另一个用户,它就不会按照指示更新新记录。所以我的问题是:为什么这个代码只在数据库中有一个用户时才有效,而当有多个用户时呢?这没有任何意义。非常感谢这里的帮助。

include $_SERVER['DOCUMENT_ROOT']. '/video_dating/includes/Database.php'; 
list($queryString,$email) = explode('&', $_SERVER['QUERY_STRING']); 

print_r($email); 
$dbname = new Database(); 
$dbname->Query('select activationkey, id, email from users'); 
$userinfo = $dbname->Getdata(); 
foreach ($userinfo as $users) 
{ 

    if ($queryString == $users['activationkey']) 
    { 
    $dbname->Query("update users set activationkey='', status='activated', userid='1' where email='$email'"); 
    echo "Thank you for registering. Your account is now active. Please login any time."; 

    } 
    else 
     echo "Sorry, your account was not activated."; 
} 

回答

0

是否可以将字段userid定义为关键字?如果是的话,它应该是唯一的,但你总是把它设置为1次

尝试从更新去除部分:

, userid='1' 
+0

嘿,非常感谢您的快速回复。实际上,它听起来可能在语义上具有误导性,但用户标识实际上与用户拥有的帐户类型相关联(1为基本,2为标准,3为高级),因此它不会自动增加。激活后,他们会自动获得“基本账户”。我确实有一个id字段auto_increment ...是的,我一定会增加安全措施,但首先我想让这个东西正常工作。那么我的更新查询怎么样:我是否还需要在字符串中引用$ email,以便更新正确的记录? – bill 2011-02-02 17:45:11

+0

起初,我认为你应该检查你是否真的从QUERY_STRING中获得了所需的值。我认为你应该用'&`而不是`&`爆炸。在HTML中使用`&`来编码`&`,如果它使用例如对于URIs,但在QUERY_STRING里面,它会是'&` – 2011-02-02 18:42:45

2

我不知道你的数据库的结构,但我认为用户ID是自动递增键。我猜你的问题是userid='1'这部分代码,你总是假设用户的ID是1.

你也可以通过直接查询激活密钥来简化你的代码。

即。

$dbname->Query('select activationkey, id, email from users WHERE activationkey="'.$queryString.'" and email = "'.$email.'"'); 

此外,你应该确保你正在逃避你的queryString和电子邮件,以防止数据库注入攻击。您可以使用mysql_real_escape_string或基于数据库类的替代方案。