首页 > 解决方案 > PHP:使用 PDO 对象和多个准备语句会影响返回的 Statement 对象

问题描述

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

$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() 可以解决此问题...但这表明所有语句对象之间通过执行方法存在某种联系?

标签: phppdo

解决方案


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

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

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


推荐阅读