Php 首次单击激活链接时如何激活帐户?
我正在尝试创建一个激活页面,这样当用户单击他们的激活链接时,它会将用户导航到activate.php页面,并显示一条消息,说明帐户是否激活 我的问题是,它一直显示消息“代码和用户名不匹配!帐户未激活”。它根本不显示成功消息“帐户已激活”,即使已单击激活链接 此外,如果已识别正确的用户名和代码,则数据库中的“活动”列应更改为“1”,但仍显示“0”,表示帐户仍处于非活动状态 我的问题是,为什么它不能识别用户名和激活码是正确的 下面是registration.php脚本,它在其中插入用户的注册详细信息并通过电子邮件发送激活链接:Php 首次单击激活链接时如何激活帐户?,php,mysqli,Php,Mysqli,我正在尝试创建一个激活页面,这样当用户单击他们的激活链接时,它会将用户导航到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 = "";
}
$teacherpassword=md5(md5(“j3j”。$teacherpassword.D2n”);
$code=md5(兰特(1,9));
$insertsql=”
插入教师
(教师姓名、教师姓氏、教师电子邮件、教师别名、教师用户名、教师密码、代码)
价值观
(?, ?, ?, ?, ?, ?, ?)
";
if(!$insert=$mysqli->prepare($insertsql)){
//在此处使用prepare操作处理错误
}
$insert->bind_参数(“SSS”)、$getfirstname、$GetNames、,
$getemail、$getid、$getuser、,
$teacherpassword,$code);
$insert->execute();
如果($insert->errno){
//在此处处理查询错误
}
$insert->close();
$getuser=$_POST['user'];
$code=md5(兰特(1,9));
$site=”http://helios.hud.ac.uk/......../Mobile_app";
$webmaster=“Mayur Patel”;
$headers=“From:$webmaster”;
$subject=“激活您的帐户”;
$message=“感谢注册。单击下面的链接以激活您的帐户。\n”;
$message.=“$site/activate.php?user=$getuser&code=$code\n”;
$message.=“您必须激活您的帐户才能登录”;
if(邮件($getemail、$subject、$message、$headers)){
$errormsg=“您已经注册。您必须从发送到$getemail的激活链接激活您的帐户”;
$getfirstname=“”;
$GetName=“”;
$getid=“”;
$getuser=“”;
$getemail=“”;
}
下面是activate.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.";
}
?>
我是如何做到的:
当用户通过以下方式激活其帐户时,在数据库(新列)中创建一个安全密钥:
example.com/activate/username/security_key
它将“激活”列设置为1。现在设置一个新的散列,这样就不可能“再次”激活它并得到一些奇怪的bug
现在,当用户想要登录时,他没有设置任何凭据,但电子邮件是已知的。因此,只需给他发送一封带有恢复链接的“密码丢失”电子邮件:
example.com/set-password/username/security_key
出于安全原因,最好在其行中的每次更新时刷新安全密钥。因此,当第三方用户(黑客)看到他的安全密钥时,您永远不会看到奇怪的情况
我希望这对你有帮助:)
最后,呼吸点新鲜空气,花点时间,头脑清醒地再看一次。最好先在纸上画出这样的系统,这样你就知道你在做什么了。(我也这么做了,它确实帮了我!)明白了,错误在这里: $update->bind_param(“iss”,1,$user_to_be_activated,$code_to_be_matched) 只是它没有通过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.";
}
您可以在此处进行测试:
详情如下:
用户:master
代码:bbb111
用户:管理员
代码:abc123
当然,尝试一些错误的方法。似乎您生成了一个存储在数据库中的随机代码,然后生成了另一个添加到电子邮件中的代码。这两个代码可能不同:)您只需要删除第二个代码md5,因为您已经有过一次代码md5。我遇到的问题是,虽然它只是用php和mysqli编码,但您知道该如何编码这是mysqli和php,同时我将正确设置数据库表以包含安全密钥列。如果我在数据库中添加一个“SecurityKey”列,我还需要在数据库中存储激活码的“Code”列吗?不,你不再需要你的“Code”了。但是,如果您愿意,也可以使用“代码”,这并不重要,只要它有一个描述性的名称。是的,我知道如何建立这个,但如果你自己做这是最好的做法。看看下面的函数:time(),sha1(),random(),mysqli的update函数,mail()。我不知道您在OOP方面有什么经验,但如果您有经验,可以看看Cakephp、Zend或symfony等框架。它使你更容易建立东西。