在重置密码之前验证数据库中的电子邮件

时间:2015-04-10 17:45:04

标签: php mysql email sql-update

假设我的用户已将他们的电子邮件输入重置密码表单,他们会收到一封电子邮件,其中包含一个链接,该链接会将他们带到上面的页面,并在其链接中显示特殊代码

例如 -

http://mylink.com/resetpassword.php?email=blabla@gmail.com&code=2384753

当我尝试使用$_GET['email']从链接中获取电子邮件并使用查询进行检查时,它无法正常工作

以下是我的代码的一部分:

$email = $_GET['email'];

$check = mysqli_query($conn, "SELECT * FROM users WHERE email='$email' ");

if(mysqli_num_rows($check) == 1){

mysqli_query($conn, "UPDATE users SET password='$password' ");

}else{
    echo "failed 2";
}

但我收到failed 2错误。而且我很确定它是因为当我点击提交时,链接中的所有额外内容都会消失,而它只是resetpassword.php

当我打开错误报告时,会出现以下内容 -

Notice: Undefined index: email in /var/www/resetpass.php on line 6

有谁知道问题可能是什么?

2 个答案:

答案 0 :(得分:0)

您需要对@符号进行URL编码,然后对其进行解码

echo urlencode('blabla@gmail.com');
//outputs blabla%40gmail.com

您还需要意识到您已将值直接传递给SQL,这使您可以对SQL injection

进行全面开放

最后你必须有一个WHERE声明。在这种情况下,我将假设您已经清理过$email$password(您真的需要考虑password_hash

mysqli_query($conn, "UPDATE users SET password='$password' WHERE email='$email' ");

答案 1 :(得分:0)

当我建议您这样做时,当resetpassword.php页面加载时,您检查电子邮件和代码是否有效(通过数据库中的检查),然后将这些值放在表单中的隐藏字段中resetpassword页面。

当您执行submit时,由于$_GET的操作标记仅为form,因此resetpassword.php消失了$_GET该操作代码中的{{1}}个变量。