【问题标题】:Updating SQL database column updates all rows with the same data更新 SQL 数据库列会更新具有相同数据的所有行
【发布时间】:2019-10-04 08:00:18
【问题描述】:

我目前正在使用以下 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 密码哈希:z39kjdddddddddddd
登录 ID:2 密码哈希:z39kjdddddddddddd
登录 ID:3 密码哈希:z39kjdddddddddddd

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

【问题讨论】:

    标签: php mysql hash passwords


    【解决方案1】:

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

    我建议

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        应该是这样的

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-08
          • 1970-01-01
          • 1970-01-01
          • 2015-01-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多