PDO->bindParam、PDO->bindValue 和 PDO->closeCursor

Posted

技术标签:

【中文标题】PDO->bindParam、PDO->bindValue 和 PDO->closeCursor【英文标题】:PDO->bindParam, PDO->bindValue and PDO->closeCursor 【发布时间】:2011-04-13 03:01:12 【问题描述】:

到目前为止,我一直在使用PDO->bindParam,但是在阅读手册时,我发现PDO->bindValue 可以告诉PDO->bindValue 按值传递,而PDO->bindParam 通过引用传递,这是唯一的区别吗?

$modThread = db()->prepare("UPDATE `threads` SET `modtime` = UNIX_TIMESTAMP( ) WHERE `threadid` =:id LIMIT 1");

while(something)

        $modThread->bindParam(':id', $thread);
        $modThread->execute();
//*******************HERE********************//

再次阅读我发现的手册时:PDO->closeCursor 我应该把它放在标记的地方吗?它是可选的/自动调用的吗?似乎只有某些司机需要它。在不需要/支持它的驱动程序上调用它会导致错误吗? mysql 怎么样?

【问题讨论】:

***.com/questions/1179874/… 提供了有关第一部分的一些信息(请参阅未选择的答案) 【参考方案1】:

这里的“重复”bindParam() 并不是真正需要的:

$thread = 0;
$modThread->bindParam(':id', $thread);

while($thread < 20)

    $thread++;
    $modThread->execute(); //executing with the new value, which you couldn't do with bindValue

当没有结果集时,您不需要closeCursor()(即,只有SELECT s 或程序返回结果),但通常我已经在前一个语句/行的某处完成了 fetchAll。

【讨论】:

【参考方案2】:

这不是真的。如果您发现自己需要使用 closeCursor,最佳时间之一是插入/更新/删除命令,而很少用于您已经获取结果的 SELECT 语句。

例如,如果您从表中选择所有记录,然后发出 $stmt->fetch(),这实际上立即完成了 closeCursor 的目标,因为这些行现在不再处于未提取状态。

来自手册:

当先前执行的 PDOStatement 对象仍有未获取的行时,此方法对于不支持执行 PDOStatement 对象的数据库驱动程序很有用。如果您的数据库驱动程序存在此限制,则问题可能会表现为无序错误。

您真正需要 closeCursor 的时间是在以下任何情况下:

如果您的 DB 驱动程序不允许执行新的 stmt,而前一次执行中存在未提取的行 您有多个准备好的语句并希望一个接一个地执行它们 ($stmt1->execute(); $stmt->closeCursor(); $stmt2->execute(); $stmt2->closeCursor( ); $stmt3...等) 您有多个 stmts 必须在同一个块内执行插入/更新/删除。这是真的,因为虽然你没有得到 mysql 行结果,但你确实得到了受影响的行数结果集(这仍然是一个结果)。 使用事务时 当您想要发出选择样式的准备好的语句并执行它们,但直到稍后才检索数据时

当你不需要 closeCursor 语句时:

如果您在执行下一条语句之前已经获取了行(如 $stmt->fetch())。此时,行处于“已获取”状态并释放驱动程序以执行新语句。

对于关闭游标同样有用的是 unset()(即:unset($stmt))并将语句设置为 null($stmt = null),打开内置垃圾收集器的大门以清除所有内容.

查看手册了解更多信息:http://php.net/manual/en/pdostatement.closecursor.php

【讨论】:

以上是关于PDO->bindParam、PDO->bindValue 和 PDO->closeCursor的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP PDO 显示 bindParam 的值

使用 PHP PDO 显示 bindParam 的值

PHP PDO 与 bindParam 与 bindValue? [复制]

PHP PDO::bindParam() 数据类型.. 它是如何工作的?

带有准备好的语句的 PDO bindParam() 不起作用

PDO::bindParam 在 foreach 循环中,所有值都设置为相同吗?