1

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

4

2 回答 2

5

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

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

从手册:

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

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

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

当您不需要 closeCursor 语句时:

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

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

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

于 2011-11-10T23:45:48.813 回答
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()当没有结果集(即,只有s 或程序返回结果)时,您不需要 a SELECT,但通常我已经在前一个语句/行的某处完成了 fetchAll。

于 2010-09-16T10:17:20.037 回答