PHP password_verify returns 参数相同时为NULL

PHP password_verify returns NULL when parameters are the same

我对 PHP 函数 password_verify 有疑问。我编写了简单的 PHP 函数,它使用 _GET,接受 3 个参数:$user_unique_idold_passwordnew_password。它验证 old passwordpassword stored in database 是否相同。我使用我的数据库中的 hash 并使用 password_verify() 函数将它与 old password 进行比较,但它 returns false 即使我 100% 确定密码是相同。有人可以帮我解决这个问题吗?我检查了 MySQL queries 并且一切正常。我 return updated_at 时间,后来我编码为 JSON.

这是我在主脚本中的函数 changeuserpassword.php 我从 link:

调用
<?php
require_once 'include/DB_Functions.php';
$db = new DB_Functions();

// JSON Response Array
$response = array();

// Receiving The Post Params
$old_password = $_GET['old_password'];
$new_password = $_GET['new_password'];
$user_unique_id = $_GET['user_unique_id'];

// Change User Password
$user = $db->changeUserPassword($user_unique_id, $old_password, $new_password);

if ($user != false) {
    $response["error"] = false;
    $response["user"]["updated_at"] = $user["updated_at"];
    echo json_encode($response);
} else {
    $response["error"] = true;
    $response["error_msg"] = "Podano nieprawidłowe stare hasło";
    echo json_encode($response);    
}
?>

这是我在changeuserpassword.php主脚本中使用的函数。它被称为 changeUserPassword:

/**
 * Change User Account Password
 */
public function changeUserPassword($user_unique_id, $old_password, $new_password) {
    $stmt = $this->conn->prepare("SELECT user.`encrypted_password` 
                                    FROM `user` 
                                    WHERE user.`unique_id` = ?");   // Preparing SELECT Query To The `user` Table
    $stmt->bind_param("s", $user_unique_id);                        // Binding With Params

    if ($stmt->execute()) {
        $user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query
        $stmt->close();

        $password_hash = $user["encrypted_password"];   // Decrypting Hashed Password

        // Checking Currrent Password Identity With Decrypted Password
        if (password_verify($old_password, $password_hash)) {   // Old Password And Current One Are The Same
            $encrypted_password = password_hash($new_password, PASSWORD_DEFAULT);   // Hashing New Password

            $stmt = $this->conn->prepare("UPDATE user 
                                            SET user.`encrypted_password` = ?, user.`updated_at` = NOW() 
                                            WHERE user.`unique_id` = ?");
            $stmt->bind_param("ss", $encrypted_password, $user_unique_id);
            $result = $stmt->execute();
            $stmt-close();

            // Checking For Succesfull UPDATE
            if ($result) {
                $stmt = $this->conn->prepare("SELECT user.`updated_at` 
                                                FROM `user` 
                                                WHERE user.`unique_id` = ?");
                $stmt->bind_param("s", $user_unique_id);
                $stmt->execute();
                $user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query
                $stmt->close();

                return $user;
            }
        } else {    // Old Password And Current One Are Different
            return false;
        }
    }
}

编辑

这是我的数据库截图: 我的脚本运行但它总是 return false 这意味着 password_verify() returns false.

已解决

问题是 $stmt->close() 语句。我经常使用它们,这就是脚本不起作用的原因。

在聊天中与@anton86993 进行调试后,我们发现错误是在不需要时使用了太多 $sql->close() 语句。

没有理由有那么多 close 语句,因为 PHP 会在脚本完成后自动关闭与 SQL 的连接。关闭语句的一个原因可能是释放与 SQL 的连接,如果您一次连接的数量有限或明显需要释放资源。