我目前正在使用以下PHP从数据库中选择纯文本密码,使用bcrypt对其进行散列,然后在表中对其进行更新:
PHP:
$select = "SELECT Password
FROM Login";
$result = $conn->query($select);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
echo "Password: " . $row["Password"]. "<br>";
$hashed_password = password_hash($row["Password"], PASSWORD_DEFAULT);
$sql = "UPDATE login SET Password='$hashed_password' ";
mysqli_query($conn,$sql);
echo " Succesfully Updated. <br>";
}
} else {
echo "0 results";
}
但是,它为每个值使用相同的哈希(密码)进行更新:
---登录---
登录ID:1密码哈希:z39kjddddddddddddd
登录ID:2密码哈希:z39kjddddddddddddd
登录ID:3密码哈希:z39kjddddddddddddd
该如何解决? 谢谢
答案 0 :(得分:2)
您正在使用缺少$sql = "UPDATE login SET Password='$hashed_password' ";
子句的脚本WHERE
,显然,表中的所有数据将只有一种哈希密码
我建议
$sql = "UPDATE login SET Password='$hashed_password' WHERE id =".$row["id"];
答案 1 :(得分:0)
在查询中,您获得了所有密码,但没有获得每一行的主键。那您怎么知道要更新哪一行呢? 您还必须获取表的主键,并使用它来更新行。
假设您的表中有一个名为“ id”的行,这是主键。
$select = "SELECT id, Password FROM Login";
$result = $conn->query($select);
if ($result->num_rows > 0) {
// output data of each row
while($row = $result->fetch_assoc()) {
$id = $row['id'];
echo "Password: " . $row["Password"]. "<br>";
$hashed_password = password_hash($row["Password"], PASSWORD_DEFAULT);
$sql = "UPDATE `login` SET Password='$hashed_password' WHERE `id` = {$id}";
mysqli_query($conn, $sql);
echo " Successfully Updated. <br>";
}
} else {
echo "0 results";
}
您可能想考虑找到一种方法来知道密码是否已更新,而仅更新那些未更新的行。
答案 2 :(得分:0)
为了更新,我们需要使用where子句。您的代码中没有where子句。
$sql = "UPDATE login SET Password='$hashed_password' ";
应该像
sql = "UPDATE login SET Password='$hashed_password' WHERE id =".$row["id"];