pdo-> bindparam,pdo-> bindvalue和pdo->闭合器
题
到目前为止我一直在使用 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怎么样?
解决方案
“重复出现” 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。
其他提示
这不是真的。如果您发现自己需要使用闭合器,则最佳时间之一是用于插入/update/delete命令,很少对于您已经获得结果的选择语句。
例如,如果您从表中选择所有记录,则会发出$ stmt-> fetch(),这实际上会立即实现闭合器的目标,因为行现在不再处于不可或缺的状态。
从手册中:
此方法对于当先前执行的pdostatement对象仍然没有etwawed行时,对于不支持执行pdostatement对象的数据库驱动程序很有用。如果您的数据库驱动程序受到此限制,则该问题可能会出现在序列外错误中。
当您真正需要封闭者时,在以下任何情况下:
- 如果您的数据库驱动程序不允许在以前的执行中可用时执行新的STMT
- 您有多个已准备好的语句,并希望执行单词($ stmt1-> execute(); $ stmt-> closecursor(); $ stmt2-> execute(); $ stmt2-> execute(); $ stmt2-> closecursor() stmt3 ...等)
- 您有多个STMT必须在同一块中执行插入/update/delete。这是正确的,因为,尽管您没有获得MySQL行结果,但您确实会获得受影响的行结果的数量(这仍然是结果)。
- 使用交易时
- 当您要发布精选风格准备的语句并执行这些语句时,但直到稍后才检索数据
当您不需要封闭式语句时:
- 如果您已经在执行下一个语句之前先获取行(如$ stmt-> fetch())。此时,行处于“获取”状态,并释放驾驶员执行新语句。
与关闭光标一样有用的是unset()(即:unsot($ stmt)),并将语句设置为null($ stmt = null),为内置垃圾收集器打开门以清除所有内容。
有关更多信息,请参见手册: http://php.net/manual/en/pdostatement.closecursor.php