我有一个包含多个用户的表。今天用户使用平面文本密码。
现在我使用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
答案 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."'",