我的PHP函数password_verify
有问题。我编写了使用_GET
的简单PHP函数,它有3个参数:$user_unique_id
,old_password
和new_password
。它会验证old password
和password 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;
}
}
}
修改
这是我的数据库截图:
我的脚本运行但它总是返回false,这意味着password_verify()
返回false。
解决
问题是$stmt->close()
声明。我经常使用它们,这就是剧本无效的原因。
答案 0 :(得分:1)
在聊天中使用@ anton86993进行调试后,我们发现该错误是在不需要时使用了太多$sql->close()
语句。
没有理由拥有那么多关闭语句,因为PHP在脚本完成时会自动关闭与SQL的连接。如果您一次连接数量有限或者显而易见的连接数据,那么拥有close语句的原因可能是释放与SQL的连接。