更新SQL数据库列将使用相同的数据更新所有行

时间:2019-05-17 02:23:50

标签: php mysql hash passwords

我目前正在使用以下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

该如何解决? 谢谢

3 个答案:

答案 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"];