为了避免不必要的信息,我的代码大致如下:
$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条以上的记录。
更新:似乎语句对象的execute方法是我的第二次获取返回false的原因。为此,在第二次获取之前再次调用$ stt1-> execute()解决了此问题……但这表明在所有语句对象之间通过execute方法存在某种联系吗?
答案 0 :(得分:1)
不同的数据库具有不同的约束。这不是PHP或PDO的问题,而是数据库连接。
虽然您可以依靠任何数据库连接器来支持至少一个带有待处理行的游标,但是许多数据库将您限制为一个,并要求您在执行新语句之前完全获取或显式关闭基础游标。
这确实是数据库连接的属性,因为所有PDO语句都绑定到一个。 (如果它们不保持绑定到数据库连接,它们将从何处获取数据?)如果您使用的数据库一次仅支持一个打开的预处理语句,则别无选择,只能序列化您的数据访问或打开与数据库的多个连接。您可能还想看看the closeCursor
method of the PDOStatement
class。