Php 电子邮件激活脚本存在问题

Php 电子邮件激活脚本存在问题,php,sql,Php,Sql,有人想试试为什么这个电子邮件激活不起作用吗?基本上,我发送两个url查询变量,它们将activationkey和电子邮件存储为stings。我将它们提取为列表(),并将它们用作db查询。测试时,所有db对象都正常工作,但当我从电子邮件中运行脚本时,它会打印回显语句:“帐户现在处于活动状态…”但当我检查数据库时,它没有更新我告诉它的那些内容,即activationkey、status和userid 奇怪的是:当我在数据库中只有一个用户时,代码就会按它应该的方式执行。但是,只要我尝试添加另一个用户,

有人想试试为什么这个电子邮件激活不起作用吗?基本上,我发送两个url查询变量,它们将activationkey和电子邮件存储为stings。我将它们提取为
列表()
,并将它们用作db查询。测试时,所有db对象都正常工作,但当我从电子邮件中运行脚本时,它会打印回显语句:“帐户现在处于活动状态…”但当我检查数据库时,它没有更新我告诉它的那些内容,即activationkey、status和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.";
}

是否可以将字段
userid
定义为键?如果是,它应该是唯一的,但您始终将其设置为1

尝试从更新中删除该部分:

, userid='1'

我不知道数据库的结构,但我假设userid是一个自动递增键。我猜问题出在
userid='1'
这部分代码中,您总是假设用户的id为1

您还可以通过直接查询激活密钥来简化代码


此外,您应该确保您正在逃离查询字符串和电子邮件,以防止数据库注入攻击。您可以使用mysql\u real\u escape\u string或基于数据库类的其他选项。

您可以在问题中发布您的表架构吗?我只有3个表:users,其中包含所有用户信息列(例如用户名、电子邮件、userid、密码、dob)。成员,它有一个id列和描述列(它描述为用户提供的每一级别的服务)。我还有一个查找表,它将users表中的userid字段与member表id和description连接起来。但是,此激活脚本需要影响的唯一表是用户表。就像我说的,只要用户表中只有一个用户信息,它就可以工作。这让我觉得你有一个奇怪的列导致了问题。或者您的身份验证密钥有问题。实际上,activationkey列是varchar(100),也许我应该将其设置为int(?)。我知道问题是什么!我认为我使activationkey是唯一的,因此它不能正确地删除一个值,使其为null,否则它将与其他null值冲突。让我检查一下。如何在sql中去掉列中的unique?我想它的ALTER TABLE用户有些什么嘿,非常感谢您的快速回复。实际上,这听起来可能在语义上有误导性,但userid实际上与用户拥有的帐户类型相关(1为基本帐户,2为标准帐户,3为高级帐户),因此它不会自动递增。激活后,他们会自动获得一个“基本帐户”。我有一个自动递增的id字段…是的,我肯定会添加安全措施,但首先我想让它正常工作。那么我的更新查询呢:我是否仍然需要引用字符串中的$email以便它可以更新正确的记录?首先,我认为您应该检查是否确实从查询字符串中获得了所需的值。我认为你应该通过
&
而不是
&
&
您在HTML中使用
&
来编码
&
如果它被用于URI,但是在查询字符串中它将是
&
(在我看来)也不需要这两个步骤,只需进行更新:
更新用户设置激活键='',状态='activated',userid='1',其中email='$email'和activationkey='$queryString'
。如果更新成功,受影响的行将告诉您。当然,在处理用户的数据之前,你应该清理/验证这些数据,就像GWW所说的。我做了一个print_r($email)和print_r($queryString),两个都准确地返回了url中的字符串,没问题。这就是为什么我感到困惑:我得到了所有正确的数据,但我的更新查询没有相应地进行更改。如果查询中的电子邮件和来自查询字符串的$email是相同的,那么它应该查找并更新这些记录,对吗?但是,我将增加安全性并减少所涉及的步骤。如果你能想点别的,请告诉我。谢谢。我猜类似于
if($dbname->受影响的行)//有一个更新(不知道你的DB类)
$dbname->Query('select activationkey, id, email from users WHERE activationkey="'.$queryString.'" and email = "'.$email.'"');