php - 使用密码散列更新当前密码
问题描述
我正在尝试在我的数据库中运行password_hash
当前值...password
$mysqli->query("UPDATE users SET password = '" . password_hash('password', PASSWORD_DEFAULT) . "');
我没有收到任何错误,但密码在更新后按预期不起作用。我唯一能想到的是上面的查询没有从表中获取当前密码值。
不需要准备好的陈述,因为我只是在本地为这个做准备。
解决方案
你不能像这样混合 PHP 和 SQL。password_hash
是一个PHP函数。您需要将用户数据提取到 PHP 中,对其进行迭代并将每条记录保存到数据库中。这样做时使用 SQL 事务。
// Remember to always enable error reporting
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'pass', 'test');
$mysqli->set_charset('utf8mb4'); // always set the charset
$users = $mysqli->query('SELECT Id, password FROM users');
// start transaction and prepare a statement
$mysqli->begin_transaction();
$stmt = $mysqli->prepare('UPDATE users SET `password`=? WHERE Id=?');
foreach ($users as $user) {
// make a hash out of the password
$hash = password_hash($user['password'], PASSWORD_DEFAULT);
$stmt->bind_param('ss', $hash, $user['Id']);
$stmt->execute();
}
// commit the data to DB and end transaction
$mysqli->commit();
始终使用准备好的语句。绝对没有理由不使用参数绑定!如果您从一开始就使用参数绑定,您会更快地注意到您的方法存在缺陷。现在您已将所有密码更改为字符串password
;每个帐户都有相同的密码。
推荐阅读
- spring-data-jpa - Spring Data JPA + JpaSpecificationExecutor + NamedEntityGraph
- javascript - 在使用异步等待的参数列表之后缺少 )
- java - 当我单击列表视图而不选择项目(JavaFX)时,我不断收到空指针异常?
- php - 如何从对象数组中列出 html 元素(PHP)
- java - 如何修复这个对 hashmap.get 的可疑调用
- html - 引导网格列未正确显示
- vue.js - 如何限制数组vuejs中显示的数据数量
- firebase - Firebase - Firestore - 创建一个函数来验证用户是否存在于 Auth 中
- java - 如何在 jvm 应用程序中引发长时间的完全 GC 暂停?
- python - 基于条件的去重字典元素[Python]