无法使令牌在MYSQL查询中工作

时间:2019-07-17 08:32:29

标签: php html mysqli

我正在为在我的网站中拥有帐户(目前在本地托管)的用户创建密码重置功能。我将PHPMYSQL用于代码的所有逻辑。 我的一些信息:

  • 我的PHP文件:

    1. login.php
    2. new_password.php
    3. forget_password.php
  • 我的数据库表:

    • password_resets
    • users

我想要这些步骤:

  1. 如果用户忘记了密码,将其密码重定向到forget_password.php并输入Email
  2. 如果Email表中存在users,则应将随机生成并存储在password_resets表中的重置密码链接发送到其电子邮件。
  3. 用户单击链接时,应将其重定向到new_password.php
  4. 当用户输入新密码时,我检查从电子邮件获取的令牌是否等于存储在DB中的令牌。如果它们相同,我将在users表中更新新密码。

程序可以将电子邮件地址和令牌保存在password_resets表中。它还可以将重置链接发送给用户,但是users表并未使用新密码进行更新。

除了令牌部分,我的代码运行良好。如果删除了if(isset($_GET['token'])),则在SQL查询中得到的$tokenundefined error。但是,如果按如下所示添加它,则整个代码将无法正常工作而没有任何错误通知。它使我一直回到new_password.php页,对数据库没有任何作用。即使输入不匹配的密码,也不会得到$password_confirm_err。当尝试回显令牌时,它会打印出来。我不知道为什么它不能在sql查询中使用。

<?php // Initialize the session
 session_start();
// Include config file
  require_once "users_config.php";


 // Define variables and initialize with empty values
  $new_password=$confirm_password="";
  $new_password_err=$confirm_password_err="";
 // Processing form data when form is submitted

if(isset($_GET['token'])){$token = $_GET['token']; echo $_GET['token']; 
// ENTER A NEW PASSWORD
if (isset($_POST['new_pass'])) {
$new_password = mysqli_real_escape_string($link, $_POST['new_password']);
$confirm_password = mysqli_real_escape_string($link,$_POST['confirm_password']);

// Grab to token that came from the email link

if(empty(trim($_POST["new_password"]))) {
    $new_password_err="Please enter the new password.";
}
elseif(strlen(trim($_POST["new_password"])) < 6) {
    $new_password_err="Password must have atleast 6 characters.";
}
else {
    $new_password=trim($_POST["new_password"]);
}
// Validate confirm password
if(empty(trim($_POST["confirm_password"]))) {
    $confirm_password_err="Please confirm the password.";
}
else {
    $confirm_password=trim($_POST["confirm_password"]);
    if(empty($new_password_err) && ($new_password !=$confirm_password)) {
        $confirm_password_err="Password did not match.";
    }
}
// Check input errors before updating the database
if(empty($new_password_err) && empty($confirm_password_err)) {


  // select email address of user from the password_reset table 
  $mysql = "SELECT email FROM password_resets WHERE token='$token' LIMIT 1";
  $results = mysqli_query($link, $mysql);
  $email = mysqli_fetch_assoc($results)['email'];

  if ($email) {
    $sql = "UPDATE users SET password='$new_password' WHERE email='$email'";
    if($stmt=mysqli_prepare($link, $sql)) {
        // Bind variables to the prepared statement as parameters
        mysqli_stmt_bind_param($stmt, "si", $param_password, $param_email);
        // Set parameters
        $param_password=password_hash($new_password, PASSWORD_DEFAULT);
        $param_email=$email;
        // Attempt to execute the prepared statement
        if(mysqli_stmt_execute($stmt)) {
            // Password updated successfully. Destroy the session, and redirect to login page
            session_destroy();
            header("location: users_login.php");
            exit();
        }
        else {
            echo "Oops! Something went wrong. Please try again later.";
        }
    }
    // Close statement
    mysqli_stmt_close($stmt);
}
// Close connection
mysqli_close($link);
}
}   
 }

我希望“用户”表中的用户密码会使用新密码进行更新,但不是。

0 个答案:

没有答案