我试图创建一个激活页面,以便当用户点击他们的激活链接时,它将引导用户到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.";
}
?>
我只是希望它能够在第一次点击链接时激活帐户。
看起来你生成了一个随机代码,存储在数据库中,然后你生成了另一个代码,添加到电子邮件中。这两个代码可能是不同的:)
我是如何做到的:
在数据库中创建一个security_key(新列),当一个用户通过以下方式激活他的帐户时:
example.com/activate/username/security_key
它将“激活”列设置为1。现在设置一个新的散列,这样就不可能“再次”激活它并得到一些奇怪的bug。
现在,当用户想要登录时,他没有设置任何凭据,但是电子邮件是已知的。所以只要给他发一封带有恢复链接的“丢失密码”电子邮件:
example.com/set-password/username/security_key
出于安全原因,最好在他行中的每次更新时刷新security_key。所以你永远不会有奇怪的事情发生,第三方用户(黑客)可以看到他的安全密钥。
我希望这对你有帮助:)
最后,呼吸点新鲜空气,花点时间,头脑清醒地再看一次。最好先在纸上画出这样的系统,这样你就知道你在做什么了。(我也这么做了,真的帮了我的忙!)
明白了,错误在这里:
$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”来激活用户的帐户。 我唯一的问题是,如果用户在电子邮件中再次单击激活链接,因为用户已经处于活