我是PHP
和PDO
的初学者。
下面的代码有效,但速度非常慢。有没有办法让它更有效率?
while()
效率不高但是工作正常。我尝试了其他解决方案,但没有任何效果。
有什么建议吗?
public function register_new_member(){
global $bcrypt;
global $populera;
$query = $this->db->prepare("SELECT id, lid, firstname, surname FROM `members`");
try{
$query->execute();
while ($data = $query->fetch()){
$id = $data['id'];
$lid = $data['lid'];
$username = $populera->create_username($data['firstname'],$data['surname']);
//Show data
echo "<br>Username: ".$username;
echo "<br>ID: ".$id;
echo "<br>LID: ".$lid;
//Static password - change after login
$password = "password";
//Bcrypt
$pass = $bcrypt->generateHash($password);
//Show data
echo "<br>Password: ".$pass;
$query2 = $this->db->prepare("INSERT INTO `login` (`id`, `lid`, `user`, `password`) VALUES (?, ?, ?, ?) ");
$query2->bindValue(1, $id);
$query2->bindValue(2, $lid);
$query2->bindValue(3, $username);
$query2->bindValue(4, $pass);
$query2->execute();
}
//Success?
echo "<br>Saved!";
}catch(PDOException $e){
die($e->getMessage());
}
}
答案 0 :(得分:1)
我认为这里的效率问题是您在第一个查询的结果中为每一行运行$query2->execute()
。您可以执行多次插入以提高效率。
答案 1 :(得分:1)
您不清楚very very slow
的含义。
您可以尝试此查询批量填充login
表格。
INSERT INTO login (id, lid, user)
SELECT id,
lid,
CONCAT(firstname, ' ', surname) AS user
FROM members
这应该更新你需要的所有行。
最后,您必须从php执行此操作以设置密码。这会将所有空密码或空白密码设置为起点密码。
//Bcrypt
$pass = $bcrypt->generateHash($password);
$query2 = $this->db->prepare("UPDATE login SET password ? WHERE password IS NULL OR LENGTH(password) = 0");
$query2->bindValue(1, $pass);
$query2->execute();
答案 2 :(得分:1)
哈希函数可能很慢 - 因为您为所有用户设置的密码相同,您可以将此计算移出循环。 (它应该很慢,因为散列通常会重复一些“轮次”以使暴力变硬。)
如果您为每个哈希使用随机盐,我无法从您的代码中判断出来。如果你(并且你应该),那么这个建议会给你留下许多使用相同盐进行哈希处理的密码。我不确定这是多么冒险,因为无论如何你都将它们设置为相同的值。
就个人而言,我会尝试提出一个我没有预设密码的解决方案 - 例如。生成随机令牌,我通过电子邮件发送每个用户,以便他们可以为自己创建新密码。 (无论如何,您可能需要让用户重置忘记的密码。)
答案 3 :(得分:1)
我会想到几个优化: