更新倍数行。在Mysql中

时间:2016-10-13 02:07:26

标签: 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(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_hash函数转换纯文本密码:password compat

3 个答案:

答案 0 :(得分:0)

在这种情况下,您可以使用INSERT ... ON DUPLICATE KEY UPDATE在单个查询中执行此操作。 http://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

下面的代码假定isUser是PRIMARY KEY或表中的UNIQUE列。

<?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();
}
?>  

答案 1 :(得分:0)

答案 2 :(得分:0)

在您的查询上

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

请参阅此处http://dev.mysql.com/doc/refman/5.7/en/password-hashing.html  然后你不需要转换为php并再次传递

或者如果你不想做阵列。

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