当前位置: 首页 > 知识库问答 >
问题:

首次点击激活链接时如何激活账户?

许曦
2023-03-14

我试图创建一个激活页面,以便当用户点击他们的激活链接时,它将引导用户到activate.php页面,并显示一条消息,说明阉羊帐户是否激活。

我的问题是,它一直显示消息“代码和用户名不匹配!帐户未激活。”它根本不显示成功消息“帐户已激活”,即使已单击激活链接。

此外,如果识别了正确的用户名和代码,数据库中的“活动”列应该更改为“1”,但它仍然显示“0”,这意味着帐户仍然不活动。

我的问题是,为什么它不能识别用户名和激活码是正确的?

下面是插入用户注册详细信息并通过电子邮件发送激活链接的registration.php脚本:

$teacherpassword = md5(md5("j3j".$teacherpassword."D2n"));  
$code = md5(rand(1,9));

$insertsql = "
INSERT INTO Teacher
(TeacherForename, TeacherSurname, TeacherEmail, TeacherAlias, TeacherUsername, TeacherPassword, Code)
VALUES
(?, ?, ?, ?, ?, ?, ?)
";
if (!$insert = $mysqli->prepare($insertsql)) {
// Handle errors with prepare operation here
}                                           

$insert->bind_param("sssssss", $getfirstname, $getsurname,
$getemail, $getid, $getuser,
$teacherpassword, $code);

$insert->execute();

if ($insert->errno) {
// Handle query error here
}

$insert->close();

    $getuser = $_POST['user'];
    $code = md5(rand(1,9));

    $site = "http://helios.hud.ac.uk/......../Mobile_app";
    $webmaster = "Mayur Patel <.......@hud.ac.uk>";
    $headers = "From: $webmaster";
    $subject = "Activate Your Account";
    $message = "Thanks for Registering. Click the link below to Acivate your Account. \n";
    $message .= "$site/activate.php?user=$getuser&code=$code\n";
    $message .= "You must Activate your Account to Login";

    if(mail($getemail, $subject, $message, $headers)){
    $errormsg = "You have been Registered. You must Activate your Account from the Activation Link sent to <b>$getemail</b>";
    $getfirstname = "";
    $getsurname = "";
    $getid = "";
    $getuser = "";
    $getemail = "";
    }

下面是激活。php页面,检查激活链接,执行mysqli操作并显示消息:

 <?php
    $user_to_be_activated  =   $_GET['user'];
    $code_to_be_matched   =   $_GET['code'];


    // don't use $mysqli->prepare here
    $query = "SELECT TeacherUsername, Active, Code FROM Teacher WHERE TeacherUsername = ? AND Code = ? ";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$user_to_be_activated, $code_to_be_matched);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherUsername, $dbActive, $dbCode);
    //get number of rows
    $stmt->store_result();
    $counting = $stmt->num_rows();

    if($counting == '1')
    {

   $updatesql = "UPDATE Teacher SET Active = ? WHERE TeacherUsername = ? AND Code = ?";                                         
    $update = $mysqli->prepare($updatesql);
    $update->bind_param("iss", 1, $user_to_be_activated, $code_to_be_matched);
        $update->execute();
        $update->close();

        echo "Account is Activated";
    }
    else
    {
        echo "The Code and Username doesn't match! Account is not Activated.";
    }

        ?>

我只是希望它能够在第一次点击链接时激活帐户。

共有3个答案

董和风
2023-03-14

看起来你生成了一个随机代码,存储在数据库中,然后你生成了另一个代码,添加到电子邮件中。这两个代码可能是不同的:)

步胜
2023-03-14

我是如何做到的:

在数据库中创建一个security_key(新列),当一个用户通过以下方式激活他的帐户时:

      example.com/activate/username/security_key

它将“激活”列设置为1。现在设置一个新的散列,这样就不可能“再次”激活它并得到一些奇怪的bug。

现在,当用户想要登录时,他没有设置任何凭据,但是电子邮件是已知的。所以只要给他发一封带有恢复链接的“丢失密码”电子邮件:

     example.com/set-password/username/security_key

出于安全原因,最好在他行中的每次更新时刷新security_key。所以你永远不会有奇怪的事情发生,第三方用户(黑客)可以看到他的安全密钥。

我希望这对你有帮助:)

最后,呼吸点新鲜空气,花点时间,头脑清醒地再看一次。最好先在纸上画出这样的系统,这样你就知道你在做什么了。(我也这么做了,真的帮了我的忙!)

桑鸿志
2023-03-14

明白了,错误在这里:

$update-

只是它没有通过1,我不知道为什么它没有显示错误。

因此,您可以将数字1放入变量中,然后在sql代码中使用它,如下所示:

所以整个代码:

   $code_activated = 1;

// don't use $mysqli->prepare here
    $query = "SELECT TeacherUsername, Active, Code FROM Teacher WHERE TeacherUsername = ? AND Code = ? ";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$user_to_be_activated, $code_to_be_matched);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherUsername, $dbActive, $dbCode);
    //get number of rows
    $stmt->store_result();
    $counting = $stmt->num_rows();

    if($counting == '1')
    {

   $updatesql = "UPDATE Teacher SET Active = ? WHERE TeacherUsername = ? AND Code = ?";                                         
    $update = $mysqli->prepare($updatesql);
    $update->bind_param("sss", $code_activated, $user_to_be_activated,  $code_to_be_matched);
        $update->execute() or die(mysql_error());
        $update->close();

        echo "Account is Activated";
    }
    else
    {
        echo "The Code and Username doesn't match! Account is not Activated.";
    }

您可以在这里测试:

http://design05.comuf.com/avtivate.php

详情如下:

用户:master

代码: bbb111

http://design05.comuf.com/avtivate.php?user=master

用户:管理员

代码:abc123

http://design05.comuf.com/avtivate.php?user=admin

当然,尝试一些错误的。

 类似资料:
  • 多亏了来自NickFroty的youtube教程,我能够在php中创建一个合适的注册系统,我已经能够将他的代码从mysql转换为mysqli,并且能够在用户注册后通过电子邮件发送激活链接。 下面的代码将在数据库中插入注册详细信息,并在用户注册后将消息和激活链接发送到用户的电子邮件。 但是我现在有个问题。如果我点击链接,它会将用户导航到页面。 我的问题是:在用户点击激活链接后,它如何激活用户的帐户?

  • 目前,用户注册后立即就能完全控制自己的账户(第 7 章)。本节,我们要添加一步,激活用户的账户,从而确认用户拥有注册时使用的电子邮件地址。为此,我们要为用户创建激活令牌和摘要,然后给用户发送一封电子邮件,提供包含令牌的链接。用户点击这个链接后,激活这个账户。 我们要采取的实现步骤与注册用户(8.2 节)和记住用户(8.4 节)差不多,如下所示: 用户一开始处于“未激活”状态; 用户注册后,生成一个

  • 当实例的试用期结束时,Navicat Monitor 需要令牌以继续监控该实例。令牌可以作为永久许可证或订阅购买。若要管理你的令牌并许可你的实例,请前往“配置”->“激活令牌密钥和许可实例”。 【注意】永久许可证和订阅方案不能在同一个 Navicat Monitor 上使用。在更改激活方法之前,你需要取消激活令牌密钥或退出你的 Navicat ID。 永久许可证 如果你购买了永久许可证,你将收到一

  • 我想准备一个与Activiti合作的环境。我遵循张贴在https://activiti.gitbook.io/activiti-7-developers-guide/getting-started/getting-started-activiti-cloud/getting-started-docker-compose . 当我启动应用程序时,我停了下来。我在cmd中键入make modeler,

  • 问题内容: 在Twitter Bootstrap导航栏中以粗体显示活动链接的标准方法是什么?显然,链接通过获得“活动”类而获得活动外观。例如,下面的链接是活动的。当我单击导航栏中的任何链接时,是否应该使用jQuery从元素中删除所有类,然后将该类添加到我已确定的链接中? 编辑 :我包括 链接之后。当我单击链接时出现警报,但是“活动”类未添加到链接中。 这是我所有的导航栏HTML: 问题答案: 您需

  • 我正在为我的a-Level做一个编程课程,我被一个问题困住了。我希望你们中的一个能帮助我。 我正在建立一个会员系统,目前我正处于电子邮件激活阶段。通过使用连接数据库的php和mysqli编码,我已经能够将电子邮件激活链接设置为工作状态,以便当用户单击激活链接时,它通过将“活动”数据库字段从“0”设置为“1”来激活用户的帐户。 我唯一的问题是,如果用户在电子邮件中再次单击激活链接,因为用户已经处于活