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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top