PHP password_verify returns 参数相同时为NULL
PHP password_verify returns NULL when parameters are the same
我对 PHP 函数 password_verify
有疑问。我编写了简单的 PHP 函数,它使用 _GET
,接受 3 个参数:$user_unique_id
、old_password
和 new_password
。它验证 old password
和 password 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 的连接,如果您一次连接的数量有限或明显需要释放资源。
我对 PHP 函数 password_verify
有疑问。我编写了简单的 PHP 函数,它使用 _GET
,接受 3 个参数:$user_unique_id
、old_password
和 new_password
。它验证 old password
和 password 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;
}
}
}
编辑
这是我的数据库截图:
password_verify()
returns false.
已解决
问题是 $stmt->close()
语句。我经常使用它们,这就是脚本不起作用的原因。
在聊天中与@anton86993 进行调试后,我们发现错误是在不需要时使用了太多 $sql->close()
语句。
没有理由有那么多 close 语句,因为 PHP 会在脚本完成后自动关闭与 SQL 的连接。关闭语句的一个原因可能是释放与 SQL 的连接,如果您一次连接的数量有限或明显需要释放资源。