Php PDO有效选择和插入
我是PHP和PDO的初学者 下面的代码可以工作,但速度非常慢。有没有办法使它更有效率 虽然效率不高,但却能完成工作。我尝试过其他的解决方案,但都不管用 有什么建议吗Php PDO有效选择和插入,php,mysql,pdo,Php,Mysql,Pdo,我是PHP和PDO的初学者 下面的代码可以工作,但速度非常慢。有没有办法使它更有效率 虽然效率不高,但却能完成工作。我尝试过其他的解决方案,但都不管用 有什么建议吗 public function register_new_member(){ global $bcrypt; global $populera; $query = $this->db->prepare("SELECT id, lid, firstname, s
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());
}
}
我认为这里的效率问题在于,对于第一次查询的结果中的每一行,都要运行$query2->execute。您可以进行多次插入以提高效率
你不清楚“非常非常慢”是什么意思 您可以尝试使用此查询批量填充登录表
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();
散列函数可能很慢-因为您为所有用户设置了相同的密码,所以可以将此计算移出循环。它应该很慢,因为散列通常会重复一些回合,以使暴力强制变得很困难 我无法从你的代码中判断你是否对每个散列使用了随机盐。如果你是而且应该是,那么这个建议会给你留下许多用同样的盐散列的密码。我不确定这样做的风险有多大,因为不管怎样,您都将它们设置为相同的值
就我个人而言,我会尝试想出一个解决方案,在这个解决方案中,我没有预设密码,例如,生成一个随机令牌,我给每个用户发送电子邮件,这样他们就可以为自己创建一个新密码。无论如何,您可能需要一些东西来让用户重置忘记的密码。我会为此考虑一些优化: 在while循环之外准备insert没有必要重新准备,而且成本高昂 在事务中进行所有插入,如果有大量数据,只需提交较小的数据块或使用mysql的保存点即可。
添加断点以检查哪些操作花费的时间最多此问题可能更适合