首页 > 解决方案 > 使用密码散列更新当前密码

问题描述

我正在尝试在我的数据库中运行password_hash当前值...password

$mysqli->query("UPDATE users SET password = '" . password_hash('password', PASSWORD_DEFAULT) . "');

我没有收到任何错误,但密码在更新后按预期不起作用。我唯一能想到的是上面的查询没有从表中获取当前密码值。

不需要准备好的陈述,因为我只是在本地为这个做准备。

标签: phpmysqlmysqlipasswords

解决方案


你不能像这样混合 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;每个帐户都有相同的密码。


推荐阅读