首页 > 解决方案 > 根据我的 WHERE 子句,非 md5 密码的新列未更新

问题描述

再会

我在我的数据库中添加了一个列,我想在其中使用现有密码,对其进行散列并使用新散列的密码更新 passwordNonMd5 列。我已经包含了 echo 来测试每个密码是否都接收到它们分配的哈希值。但是我的数据库在所有 passwordNonMd5 行中只更新了一个哈希密码。

有人可以指出我的错误吗?

谢谢你

include_once 'dbh.php';
    ini_set('max_execution_time', 300);
    ini_set('memory_limit','1000M');            

    $query = "SELECT password FROM users";

    if ($result = mysqli_query($conn, $query)) {
       while ($row = mysqli_fetch_assoc($result)) {
       $password =  $row["password"];
       echo "$password ";
       $newHash = password_hash($password, PASSWORD_DEFAULT);
       echo "New Hash is: " . $newHash . "\n";
       $insert = "UPDATE users SET passwordNonMd5 = '$newHash'
       WHERE password = $password";
       $query_run = mysqli_query($conn, $insert);
        }
    } 

标签: phpmysqli

解决方案


像这样的东西应该工作:

$sql = 'SELECT * FROM users';
$res = mysqli_query( $conn, $sql );

while( $row = mysqli_fetch_assoc($res) ) {
  // You could salt the password here to make hashes more likely to be unique
  // example: $newPass = password_hash( $row['id'] . $row['password'] . $row['perUserOrSystemDefinedSecret'], PASSWORD_DEFAULT );
  $newPass = password_hash( $row['password'], PASSWORD_DEFAULT );

  // We can sql inject ourself here but as the data is hashed or is probably a integer we should be fine.
  $updateSql = 'UPDATE users SET passwordNonMd5 = "' . $newPass . '" WHERE id = ' . $row['id'];

  mysqli_query( $conn, $updateSql );

}

推荐阅读