更新 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"];
我目前正在使用来自我的数据库的以下 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"];