PHP忘记密码
我试图在PHP中为用户创建一个忘记密码的页面,但是当我输入代码时,页面只是重新加载,没有其他任何事情发生。没有错误,什么都没有PHP忘记密码,php,html,mysql,Php,Html,Mysql,我试图在PHP中为用户创建一个忘记密码的页面,但是当我输入代码时,页面只是重新加载,没有其他任何事情发生。没有错误,什么都没有 if($submit){ $email = mysqli_real_escape_string($conn, $_POST["email"]); $submit = $_POST['submit']; $email_check = mysqli_query($conn ,"SELECT * FROM users WHERE email='" .
if($submit){
$email = mysqli_real_escape_string($conn, $_POST["email"]);
$submit = $_POST['submit'];
$email_check = mysqli_query($conn ,"SELECT * FROM users WHERE email='" . $email. "'");
$count = mysqli_num_rows($email_check);
if($count != 0 ){
// generate a new password
$random = rand(72891, 92729);
$new_password = $random;
$email_password = $new_password;
$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));
$new_password = password_hash($new_password);
mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");
$subject = "Login information";
$message = "Your password has been changed to $email_password";
$from = "From: example.me";
mail($email, $subject, $message, $from);
echo "Your new password has been sent to you";
} else {
echo"This email does not exists";
}
}
您正在测试
$submit
,但在测试中定义了$submit
,因此$submit
的评估结果可能不正确
尝试将外部
if($submit)
更改为if(!empty($\u POST))
在验证if
语句之后才声明
使用另一个变量进行验证。最好从检查是否提交了$\u POST
开始
if ($_SERVER['REQUEST_METHOD'] == 'POST')
通过电子邮件发送密码更改
$message = "Your password has been changed to $email_password";
到
数据库中存储的密码已被散列两次删除
$new_password = password_hash($new_password);
需要执行SQL来更新数据库中的密码哈希
$sql = "update users set pw='" . $new_password. "' WHERE email='" . $email. "'";
if (mysqli_query($conn, $sql)) {
echo "Password updated successfully";
} else {
echo "Error updating record: " . mysqli_error($conn);
}
mysqli_close($conn);
我会告诉你你的代码到底是怎么回事
第1部分:
if($submit){
$email = mysqli_real_escape_string($conn, $_POST["email"]);
$submit = $_POST['submit'];
$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));
$new_password = password_hash($new_password);
mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");
$submit=$\u POST['submit']如果($submit)
,则代码>将在打开后分配
- 结果为:未定义的提交变量
第二部分:
if($submit){
$email = mysqli_real_escape_string($conn, $_POST["email"]);
$submit = $_POST['submit'];
$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));
$new_password = password_hash($new_password);
mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");
您正在尝试双重散列,这不会给您带来任何额外的好处,并且在以后尝试时也会失败。这里发生的事情是,第二个失败了,甚至不应该被使用
为什么失败了?因为,它缺少一个参数
- 结果:
警告:password_hash()至少需要2个参数,1个参数在第x行的/path/to/file.php中给出
- 添加的结果:一个空密码行(当更新发生时,请参阅“第3部分”)
第三部分:
if($submit){
$email = mysqli_real_escape_string($conn, $_POST["email"]);
$submit = $_POST['submit'];
$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));
$new_password = password_hash($new_password);
mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");
查询不包含它的数据库连接
- 结果:
警告:mysqli_query()至少需要两个参数,其中一个参数在第x行的/path/to/file.php中给出
关于您的变量和使用的连接API是未知的,因此您必须确保使用相同的MySQL API进行连接,并且您的变量和POST数组包含值
错误报告将帮助您,检查查询中的错误也是如此
参考资料:
最后注释:
if($submit){
$email = mysqli_real_escape_string($conn, $_POST["email"]);
$submit = $_POST['submit'];
$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));
$new_password = password_hash($new_password);
mysqli_query("update users set pw='" . $new_password. "' WHERE email='" . $email. "'");
使用事先准备好的声明,这样更安全
还有,;您应该让用户在使用唯一/一次性令牌的重置中选择自己的密码,并将其散列为“一次”,而不是两次,并且不应该邮寄他们的密码,原因很多。这是最常见的做法。如果用户的电子邮件帐户曾经被泄露,并且他们没有删除包含其登录密码的电子邮件,那么他们的登录帐户也有被泄露的风险。您正在进行双重哈希运算,从未查询过更新。在什么情况下,$submit
会有真实值?你确保它是真实的吗?没有错误;那是因为你没有检查它们。一旦低于条件的代码生效,您将看到您做错了什么;很多。@Fred ii-$email\u密码是$random=rand(7289192729)这只是一个随机数。@MichaelCoker是的,我错了。尽管如此,我对它们的双重散列的评论是正确的。我删除了我的评论。你错过了很多东西,这不能解决这个问题。你也错过了很多stuff@Fred-请详细说明?问题不在于为什么没有错误吗?恐怕你掉进了一个很深的兔子洞里。请仔细阅读他们的代码。然后,看看我在他们的问题下留下的评论。正如你所知道的,我没有发布一个答案,因为这一切。你会明白我的意思(我希望)。“通过电子邮件发送密码更改$message=”你的密码已更改为$email\u password”;“-这有什么问题?变量在双引号内求值。@Fred ii$email\u密码通过$new\u密码加载$random。然后保持不变。然后对$new_passord进行哈希运算。所以$email\u密码应该包含用户可读的值。这很安静。