【问题标题】:PHP: Using PDO object and multiple prepare statement affects the Statement object returnedPHP:使用 PDO 对象和多个准备语句会影响返回的 Statement 对象
【发布时间】:2019-04-12 17:28:15
【问题描述】:

为了避免不必要的信息,我的代码大致流程如下:

$db = new PDO(DSN, DB_USER, DB_PW);


$sql1 = "SELECT * FROM Table1";

// fetching the first result
$stt1 = $db->prepare($sql1);
if ($stt1->execute()) {
    $result = $stt1->fetch(PDO::FETCH_ASSOC);
}

// doing update in the middle by using the SAME $db object, but different statement variable
$sql2 = "UPDATE Table1 SET field1 = 'footest1' WHERE id = 1";
$stt2 = $db->prepare($sql2);
$stt2->execute();

// fetching the next result
$result = $stt1->fetch(PDO::FETCH_ASSOC);

好的,我运行了这个,令我惊讶的是,当我获取下一个结果时,我得到了错误。在中间准备另一个语句 ($stt2) 是否会中断我已经创建的 $stt1?

我在这张桌子上有 15 条以上的记录。

更新:似乎语句对象的执行方法是我第二次获取返回 false 的原因。为此,在第二次获取之前再次调用 $stt1->execute() 可以解决此问题...但这表明所有语句对象之间通过 execute 方法存在某种联系?

【问题讨论】:

  • 我找不到这方面的文档参考,但您似乎不能以这种方式重用准备好的语句。
  • @TimBiegeleisen 到底是什么让我感到困惑。即使我将第一条语句和第二条语句存储在两个不同的变量上,这也意味着内存中的不同位置....
  • 我认为如果您没有实际使用第一个语句,它可能会起作用。
  • 这可能取决于您使用的是缓冲查询还是非缓冲查询。见php.net/manual/en/mysqlinfo.concepts.buffering.php
  • 而不是 fetch 使用 fetchAll 那么你就不需要继续从第一个获取结果

标签: php pdo


【解决方案1】:

不同的数据库有不同的约束。这不是 PHP 或 PDO 的问题,而是数据库连接的问题。

虽然您可以依赖任何数据库连接器来支持至少一个带有待处理行的游标,但许多数据库会将您限制为一个,并要求您在执行新语句之前完全获取或显式关闭底层游标。

这确实是数据库连接的一个属性,因为所有 PDO 语句都绑定到一个。 (如果他们没有保持绑定到数据库连接,他们会从哪里获取数据?)如果您使用的数据库一次只支持一个打开的准备好的语句,您将别无选择,只能序列化您的访问或打开到数据库的多个连接。您可能还想看看the closeCursor method of the PDOStatement class

【讨论】:

    猜你喜欢
    • 2011-04-09
    • 2011-01-09
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多