【问题标题】:Update multiples row. Password plain text to password hash in Mysql更新多行。密码纯文本到Mysql中的密码哈希
【发布时间】:2016-10-15 23:43:17
【问题描述】:

我有一个有多个用户的表。今天用户在平面文本密码。

现在我用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

【问题讨论】:

    标签: php mysql hash


    【解决方案1】:

    在这种情况下,您可以使用 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();
    }
    ?>  
    

    【讨论】:

    • 您还面临哪些问题?如果你能详细告诉我,也许我可以帮忙。
    • 明天我会在你的帮助下尝试另一种方式。所以之后我会回答你。谢谢!
    【解决方案2】:

    根据您的查询

    $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."'",
    

    【讨论】:

      猜你喜欢
      • 2015-08-23
      • 2014-07-15
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-13
      相关资源
      最近更新 更多