获取其他查询时的新PDO ::查询

时间:2016-09-16 08:38:30

标签: php pdo

有一个旧的PHP代码示例(不是真正的代码,只是为了解决问题)。

    $q = mysql_query("SELECT MILLIONS ROWS FROM TABLES");
    while($row = mysql_fetch_assoc($q)) {
        // other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic 
        $q2 = mysql_query("SELECT SOME DATA");
        $data = mysql_fetch_assoc($q2);
        $q3 = mysql_query("UPDATE SOME ROWS");
        $q4 = mysql_query("SELECT SOME OTHER DATA");
        // many other code, that works with DataBase and do many other things
        // ...
    }

这个旧代码工作正常。 但我需要将此代码移动到PHP7和PDO(而不是mysql_)。 在项目中大约有3000个代码这样的地方。

我尝试重写这样的代码:

    $pdo = new PDO('connection string');
    $q = $pdo->query("SELECT MILLIONS ROWS FROM TABLES");
    while($row = $q->fetch()) {
        // other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic 
        $q2 = $pdo->query("SELECT SOME DATA");
        $data = $q2->fetch();
        $q3 = $pdo->query("UPDATE SOME ROWS");
        $q4 = $pdo->query("SELECT SOME OTHER DATA");
        // many other code, that works with DataBase and do many other things
        // ...
    }

它不起作用:循环执行一次,尽管表中的行数百万。 这很自然,因为它写在手册中:

  

如果在下次调用PDO :: query()之前未获取结果集中的所有数据,则您的调用可能会失败。在发出对PDO :: query()的下一次调用之前,调用PDOStatement :: closeCursor()以释放与PDOStatement对象关联的数据库资源。

我可以使用fetchAll重写代码,然后它就可以了。

    $pdo = new PDO('connection string');
    $q = $pdo->query("SELECT MILLIONS ROWS FROM TABLES");
    $rows = $q->fetchAll();
    foreach($rows as $row) {
         // other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic 
        $q2 = $pdo->query("SELECT SOME DATA");
        $data = $q2->fetch();
        $q3 = $pdo->query("UPDATE SOME ROWS");
        $q4 = $pdo->query("SELECT SOME OTHER DATA");
        // many other code, that works with DataBase and do many other things
        // ...
    }

但是这个选项不适合我,因为fetchAll会占用所有内存并且脚本会失败。

另外,我可以重写这样的代码:

    $pdo = new PDO('connection string');
    for($i=0; $<=10000; $i++) {
        $offset = $i * 1000;
        $q = $pdo->query("SELECT ROWS FROM TABLES LIMIT $offset, 1000");
        $rows = $q->fetchAll();
        foreach($rows as $row) {
            // other different queries (SELECT, INSERT, DELETE, UPDATE) & other complex logic 
            $q2 = $pdo->query("SELECT SOME DATA");
            $data = $q2->fetch();
            $q3 = $pdo->query("UPDATE SOME ROWS");
            $q4 = $pdo->query("SELECT SOME OTHER DATA");
            // many other code, that works with DataBase and do many other things
            // ...
        }
    }

但是这种方法不适合我,因为我必须在项目中重写很多代码而我不想这样做。

如何将此代码移至PDO? 是否有其他方法可以在通过第一个查询获取数据时进行PDO查询?

2 个答案:

答案 0 :(得分:0)

你不能输入1个查询吗?

SELECT `Table2`.* FROM `Table2`
JOIN `Table1`
ON `Table1`.`id` = `Table2`.`id`

这将更高效,并提供您想要的结果。

答案 1 :(得分:0)

尝试下一步方法:

$q = PDO::query("SELECT Table2.* FROM Table1 JOIN Table2 ON Table2.id=Table1.id");
while($data = $q->fetch()) {
    // some code here
}