Php 更新多个行。Mysql中密码明文到密码哈希的转换

Php 更新多个行。Mysql中密码明文到密码哈希的转换,php,mysql,hash,Php,Mysql,Hash,我有一个有多个用户的表。如今,用户使用的是平面文本密码 现在,我用VARCHAR(256)创建了一个新列,将每个用户的密码散列放入名为password的列中 我制作了一个PHP,用于获取每个用户,并根据密码哈希进行更新: <?php require("Db.class.php"); require("password.php"); $db = new Db(); $result = $db->query("SELECT idUser, pass FROM user"); if(co

我有一个有多个用户的表。如今,用户使用的是平面文本密码

现在,我用
VARCHAR(256)
创建了一个新列,将每个用户的密码散列放入名为
password
的列中

我制作了一个PHP,用于获取每个用户,并根据密码哈希进行更新:

<?php
require("Db.class.php");
require("password.php");
$db = new Db();
$result = $db->query("SELECT idUser, pass FROM user");

if(count($result) == 0){
    echo "Error!";
    $db->CloseConnection();
}

else if(count($result) > 0){
    foreach($result as $user){
        $passDB = $user["pass"];
        $idUser = $user["idUser"];
        $hash = password_hash($passDB, PASSWORD_BCRYPT);
        $resultUser = $db->query("UPDATE user SET password = :hash WHERE idUser = :idUser",
        array("hash" => $hash, "idUser" => $idUser)); 
    }
    $db->CloseConnection();
}
?>

php只适用于几行。然后,由于效率太低,SQL不会更新以下行


有没有更好的方法来做我想做的事?我必须将php与mysql混合使用,因为我必须使用库中的password\u散列函数转换纯文本密码:

在这种情况下,您可以使用INSERT…ON DUPLICATE KEY UPDATE在单个查询中执行此操作。

下面的代码假定isUser是主键或表中唯一的列

<?php
require("Db.class.php");
require("password.php");
$db = new Db();
$result = $db->query("SELECT idUser, pass FROM user");
if(count($result) == 0){
    echo "Error!";
    $db->CloseConnection();
}
else if(count($result) > 0){
$str="INSERT INTO user (idUser,pass,password) VALUES ";
    foreach($result as $user){
        $passDB = $user["pass"];
        $idUser = $user["idUser"];
        $hash = password_hash($passDB, PASSWORD_BCRYPT);
        $str.="('".$idUser."','".$passDB."','".$hash."'),";
    }
    $str=rtrim($str,",");
    $str.="ON DUPLICATE KEY UPDATE password=VALUES(password);";
    $resultUser = $db->query($str); 
    $db->CloseConnection();
}
?>  

在这种情况下,您可以使用INSERT…ON DUPLICATE KEY UPDATE在单个查询中执行此操作。

下面的代码假定isUser是主键或表中唯一的列

<?php
require("Db.class.php");
require("password.php");
$db = new Db();
$result = $db->query("SELECT idUser, pass FROM user");
if(count($result) == 0){
    echo "Error!";
    $db->CloseConnection();
}
else if(count($result) > 0){
$str="INSERT INTO user (idUser,pass,password) VALUES ";
    foreach($result as $user){
        $passDB = $user["pass"];
        $idUser = $user["idUser"];
        $hash = password_hash($passDB, PASSWORD_BCRYPT);
        $str.="('".$idUser."','".$passDB."','".$hash."'),";
    }
    $str=rtrim($str,",");
    $str.="ON DUPLICATE KEY UPDATE password=VALUES(password);";
    $resultUser = $db->query($str); 
    $db->CloseConnection();
}
?>  
关于您的查询的

$resultUser = $db->query("UPDATE user SET password = PASSWORD(:hash)
 WHERE idUser = :idUser",
参考这里 那么您就不需要在php上进行转换并再次传递

或者,如果您不想重新执行数组

$resultUser = $db->query("UPDATE user SET password = PASSWORD('".$hash."') 
WHERE idUser = '".$idUser."'",
关于你的问题

$resultUser = $db->query("UPDATE user SET password = PASSWORD(:hash)
 WHERE idUser = :idUser",
参考这里 那么您就不需要在php上进行转换并再次传递

或者,如果您不想重新执行数组

$resultUser = $db->query("UPDATE user SET password = PASSWORD('".$hash."') 
WHERE idUser = '".$idUser."'",

你还面临什么问题?如果你能告诉我细节,也许我能帮上忙。明天我会在你的帮助下用另一种方式试试。然后我会回答你。谢谢你还面临什么问题?如果你能告诉我细节,也许我能帮上忙。明天我会在你的帮助下用另一种方式试试。然后我会回答你。谢谢