更新 SQL 数据库列会更新具有相同数据的所有行

Updating SQL database column updates all rows with the same data

我目前正在使用来自我的数据库的以下 PHP 到 select 纯文本密码,使用 bcrypt 对它们进行哈希处理,然后在 table 中更新它们:

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 密码哈希:z39kjdddddddddddd
登录 ID:2 密码哈希:z39kjdddddddddddd
登录 ID:3 密码哈希:z39kjdddddddddddd

我该如何解决这个问题? 谢谢

您正在使用缺少 WHERE 子句的脚本 $sql = "UPDATE login SET Password='$hashed_password' ";,当然,您 table 中的所有数据将只有一种散列密码

我建议

$sql = "UPDATE login SET Password='$hashed_password' WHERE id =".$row["id"];

在您的查询中,您获得了所有密码,但没有获得每一行的主键。那么您如何知道要更新哪一行? 您还必须获取 table 的主键并使用它来更新行。

假设您的 table 有一个名为 '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";
}

您可能需要考虑找到一种方法来了解密码是否已更新,并且只更新那些未更新的行。

为了更新,我们需要使用 where 子句。在您的代码中没有 where 子句。

$sql = "UPDATE login SET Password='$hashed_password' ";

应该是

 sql = "UPDATE login SET Password='$hashed_password' WHERE id =".$row["id"];