0

PHP & MySQL Novice to Ninja, 5th Edition这是一部分 Kevin Yank

通常,当我们执行 SELECT 查询时,我们使用 while 循环或 foreach 循环的条件来检索结果的每一行,一次一个:

while ($row = $result->fetch()) foreach ($result as $row)

当我们以这种方式处理查询结果时,PHP 实际上会在循环请求时从数据库中检索每一行,并在它移动到下一行时将其丢弃。这使 PHP 不必使用大量内存来一次保存所有结果行。

大多数时候,我们开发人员不需要知道 PHP 正在走这条聪明的捷径。但是每隔一段时间,我们会想在处理完前一个查询的所有结果之前向 MySQL 服务器发送另一个 SQL 查询。

如果我们不小心的话,这正是这段代码中即将发生的事情:我们刚刚运行了一个 SELECT 查询来询问属于特定作者的所有笑话的列表,当我们处理这个列表时,我们想为每一个执行一个 DELETE 查询。问题是,据 MySQL 所知,它仍然会忙着向我们发送 SELECT 查询的结果;我们不能只是打断它并要求它开始运行 DELETE!这样做会导致我们的 DELETE 失败并出现错误。

这就是 fetchAll 方法的用武之地。通过在准备好的语句 ($s) 上调用此方法,我们要求 PHP 检索查询的整个结果集并将它们存储在 PHP 数组 ($result) 中:

我的问题是为什么我可以PDOStatement result sets在我的 PHP 代码中使用一个或多个语句时执行 MYSQL 语句?甚至我可以delete在这些行中引用所有行result sets

<?php
    include_once $_SERVER["DOCUMENT_ROOT"] . '/DBconnection.inc.php';

        $pds1 = $dbi->query("SELECT name FROM tbl1");
        $row = $pds1->fetch();
        var_dump($row['name']);

        $pds2 =  $dbi->query("SELECT user FROM tbl2");
        $row = $pds2->fetch();
        var_dump($row['user']);

        $row = $pds1->fetch();
        var_dump($row['name']);

        $row = $pds2->fetch();
        var_dump($row['user']);

        $pds3= $dbi->prepare("DELETE FROM tbl1;");
        $pds3->execute();

        $row = $pds1->fetch();
        var_dump($row['name']);

        $row = $pds2->fetch();
        var_dump($row['user']);



?>
4

1 回答 1

1

这是一个 PDO 的行为将取决于您正在使用的数据库和 PDO 驱动程序实现的区域。当您仍在获取 select 语句的结果时,您可能能够执行新查询,或者您可能不会

一般来说,使用 PDO 连接的最安全和最兼容的方式是:

  1. 执行您的 SELECT 语句
  2. 获取您需要的所有行
  3. 关闭光标(例如:用$pds1->closeCursor()
  4. 执行你的下一个查询
于 2012-11-14T17:30:21.770 回答