当参数相同时,PHP password_verify返回NULL

时间:2015-12-04 00:33:10

标签: php mysql get password-encryption

我的PHP函数password_verify有问题。我编写了使用_GET的简单PHP函数,它有3个参数:$user_unique_idold_passwordnew_password。它会验证old passwordpassword stored in database是否相同。我从我的数据库中使用hash并使用old password功能将其与password_verify()进行比较,但它返回false,即使我100%确定密码是相同的。有人可以帮我解决这个问题吗?我检查了MySQL queries,一切都很顺利。我返回updated_at时间,后来我编码为JSON

这是我在主要文字changeuserpassword.php中的功能,我从链接中调用:

<?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;
        }
    }
}

修改

这是我的数据库截图: enter image description here 我的脚本运行但它总是返回false,这意味着password_verify()返回false。

解决

问题是$stmt->close()声明。我经常使用它们,这就是剧本无效的原因。

1 个答案:

答案 0 :(得分:1)

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

没有理由拥有那么多关闭语句,因为PHP在脚本完成时会自动关闭与SQL的连接。如果您一次连接数量有限或者显而易见的连接数据,那么拥有close语句的原因可能是释放与SQL的连接。