到目前为止,我一直在使用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怎么样?
答案 0 :(得分:5)
这不是真的。如果您发现自己需要使用closeCursor,那么最佳时间之一是insert / update / delete命令,很少用于已经获取结果的SELECT语句。
例如,如果您从表中选择所有记录,然后发出$ stmt-> fetch(),这实际上会立即完成closeCursor的目标,因为行现在不再处于未获取状态。
从手册:
此方法对于以前执行的PDOStatement对象仍具有未获取行的行时不支持执行PDOStatement对象的数据库驱动程序非常有用。如果您的数据库驱动程序受此限制,则问题可能表现为无序错误。
如果您确实需要closeCursor,请执行以下任何一种情况:
当您不需要closeCursor声明时:
关闭游标的有用方法是unset()(即:unset($ stmt))并将语句设置为null($ stmt = null),打开内置垃圾收集器的大门以清除所有内容
有关详细信息,请参阅手册:http://php.net/manual/en/pdostatement.closecursor.php
答案 1 :(得分: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
,但通常我已经在之前的某个地方完成了fetchAll声明/行。