PHP忘了密码

时间:2017-01-14 23:35:50

标签: 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='" . $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";
    }
}

3 个答案:

答案 0 :(得分:2)

我会告诉你这里的代码究竟发生了什么。

第1部分:

Error: Uncaught (in promise): TypeError: undefined is not a function
TypeError: undefined is not a function
at module.exports (main.js:202298:5)
at getMIMEFromPath (main.js:172965:5)
at new Jimp (main.js:172900:9)
at main.js:172940:23
at new t (polyfills.js:3:11329)
at Function.Jimp.read (main.js:172932:19)
at HomePage.testJimp (main.js:79089:51)
at DebugAppView.View_HomePage0.handleEvent_25 (/AppModule/HomePage/component.ngfactory.js:310:34)
at DebugAppView.<anonymous>(main.js:126150:37)
at HTMLButtonElement.<anonymous> (main.js:55299:36)
at s (polyfills.js:3:4211)
at new t (polyfills.js:3:11355)
at Function.Jimp.read (main.js:172932:19)
at HomePage.testJimp (main.js:79089:51)
at DebugAppView.View_HomePage0.handleEvent_25 (component.ngfactory.js:310:34)
at DebugAppView.<anonymous> (main.js:126150:37)
at HTMLButtonElement.<anonymous> (main.js:55299:36)
at t.invokeTask (polyfills.js:3:9723)
at Object.inner.inner.fork.onInvokeTask (main.js:53370:37)
at t.invokeTask (polyfills.js:3:9697)
    在您打开if($submit){ $email = mysqli_real_escape_string($conn, $_POST["email"]); $submit = $_POST['submit']; 后分配
  • $submit = $_POST['submit'];
  • error reporting的结果:未定义的提交变量。

第2部分:

if($submit)

您正在尝试加倍哈希,它不会给您带来任何额外的好处,并且在以后尝试verify时也会失败。这里发生的事情是第二个失败了,甚至根本不应该使用。

为什么会失败?因为它缺少一个参数。

  • 结果:

      

    警告:password_hash()需要至少2个参数,在第x行的/path/to/file.php中给出1

  • 添加结果:空密码行(发生UPDATE时。请参阅&#34;第3部分&#34;)。

第3部分:

$new_password = password_hash($new_password, PASSWORD_BCRYPT, array('cost' => 14));         
$new_password = password_hash($new_password);

查询不包含数据库连接。

  • 结果:
      

    警告:mysqli_query()需要至少2个参数,在第x行的/path/to/file.php中给出1

关于您的变量和使用的连接API是未知的,因此您必须确保使用相同的MySQL API进行连接,并且您的变量和POST数组包含值。

错误报告将帮助您,同时检查查询错误。

参考文献:

最终说明:

使用准备好的声明,它更安全

也;您应该让用户在重置时选择自己的密码并使用唯一/一次性令牌并对其进行哈希处理&#34;一次&#34;,而不是两次,并且由于很多原因不应该邮寄他们的密码。这是最常见的做法。如果用户的电子邮件帐户遭到入侵并且他们没有删除包含其登录密码的电子邮件,那么他们就有可能使他们的登录帐户遭到入侵。

答案 1 :(得分:0)

在您的$submit声明验证之后才会声明

if

使用其他变量进行验证。开始的好地方是检查并查看是否提交了$_POST

if ($_SERVER['REQUEST_METHOD'] == 'POST')

通过电子邮件发送密码更改

$message = "Your password has been changed to $email_password";

$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);

答案 2 :(得分:-1)

您正在测试"但在测试中定义$submit,因此$submit可能不会评估为真。

尝试将外部$submit更改为if ($submit)