php - 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() 可以解决此问题...但这表明所有语句对象之间通过执行方法存在某种联系?
解决方案
不同的数据库有不同的约束。这不是 PHP 或 PDO 的问题,而是数据库连接的问题。
虽然您可以依靠任何 DB 连接器来支持至少一个带有待处理行的游标,但许多数据库会将您限制为一个,并要求您在执行新语句之前完全获取或显式关闭底层游标。
这确实是数据库连接的一个属性,因为所有 PDO 语句都绑定到一个。(如果他们没有保持绑定到数据库连接,他们将从哪里获取数据?)如果您使用的数据库一次只支持一个打开的准备好的语句,您将别无选择,只能序列化您的访问或打开到数据库的多个连接。您可能还想看看类的closeCursor
方法PDOStatement
。
推荐阅读
- python - 从 python 数据框创建嵌套 JSON
- c# - 在数据表中仅按列显示的正确方法是什么
- python-3.x - 即使在熊猫成功安装后,气流中也没有命名为熊猫的模块错误
- python - 如何在 Django 中为 css 和 js 文件创建公共文件夹?
- oracle - oracle如何查询一个月前执行的sql
- azure - 为什么我的 Azure 应用服务对两个计划收费?
- single-sign-on - 使用 Kerberos 的 SoapUI SSO
- .net - 是否可以从 .net 框架 4.6 Web 应用程序创建 Docker Linux 容器?
- ios - 停止呈现 PushNotification
- javascript - 将动作脚本重写为 javascript