gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 04:13:39 28 4
gpt4 key购买 nike

到目前为止我一直在使用 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 怎么样?

最佳答案

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

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

来自手册:

This method is useful for database drivers that do not support executing a PDOStatement object when a previously executed PDOStatement object still has unfetched rows. If your database driver suffers from this limitation, the problem may manifest itself in an out-of-sequence error.

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

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

当您不需要 closeCursor 语句时:

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

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

有关更多信息,请参阅手册:http://php.net/manual/en/pdostatement.closecursor.php

关于php - PDO->bindParam、PDO->bindValue 和 PDO->closeCursor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725346/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com