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='" .

我试图在PHP中为用户创建一个忘记密码的页面,但是当我输入代码时,页面只是重新加载,没有其他任何事情发生。没有错误,什么都没有

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']
    ,则代码>将在打开后分配
  • 结果为:未定义的提交变量
第二部分:

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)