PDO有效的SELECT和INSERT

时间:2014-12-21 20:05:47

标签: php mysql pdo

我是PHPPDO的初学者。

下面的代码有效,但速度非常慢。有没有办法让它更有效率?

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

4 个答案:

答案 0 :(得分:1)

我认为这里的效率问题是您在第一个查询的结果中为每一行运行$query2->execute()。您可以执行多次插入以提高效率。

How to insert multiple rows in one query

答案 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)

我会想到几个优化:

  1. 在while循环之外准备插入物(没有必要重新准备它并且成本很高)
  2. 在事务中进行所有插入,如果有大量数据,只需提交较小的块或使用mysql的保存点。