Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO有效选择和插入_Php_Mysql_Pdo - Fatal编程技术网

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

我是PHP和PDO的初学者

下面的代码可以工作,但速度非常慢。有没有办法使它更有效率

虽然效率不高,但却能完成工作。我尝试过其他的解决方案,但都不管用

有什么建议吗

    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的保存点即可。
添加断点以检查哪些操作花费的时间最多此问题可能更适合