【发布时间】:2014-08-25 14:03:26
【问题描述】:
我正在使用带有 PDOStatement (::prepare(); ::execute()) 的基于 Mysql 的 PDO 连接,并且我运行过之前开发人员的一些代码在方法中使用PDOStatement::closeCursor()。
无论如何,该语句在函数末尾未设置:
public function fooBar($identifier)
{
...
/** @var $dbc PDO */
$dbc = $conn->getConnection();
$stmt = $dbc->prepare('SELECT orderType, orderComment, payload FROM cart WHERE identifier = :identifier');
$stmt->execute(array('identifier' => $identifier));
$stmt->setFetchMode(PDO::FETCH_OBJ);
$cart = $stmt->fetch();
$stmt->closeCursor();
...
return $result;
}
在我的心智模型中,我会说 PDOStatement 无论如何都在这里被清除,因为我希望对象负责这种内务处理(封装基础知识)。因此,调用PDOStatement::closeCursor() 对我来说似乎是多余的,尤其是因为这可能不是这里想要的:由于该语句不会被重复使用,我根本不需要关闭游标。
旁注:此代码是示例性的,在实际代码中,如果行数不是一 (1),甚至会在
$stmt->execute(...)之后引发异常。
Stackoverflow 上的现有资料
Charlescommmented back in May 2011在问题pdo free result:
不只是一些驱动程序——驱动程序提供的一些设置需要在触发另一个查询之前关闭结果集,比如关闭MySQL的
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY。谢天谢地,您可以致电closeCursor,当它不需要采取行动时,它将成功地什么都不做。否则,只需取消设置包含语句句柄的变量即可清理。
另一个问题When should I use closeCursor() for PDO statements? 没有可接受的答案,我并不怀疑,因为这都是空想。
在 Reusing PDO statement var crashes the process 中有 a comment made 表示取消设置变量并不能消除所有错误(内存损坏错误):
[...] 我确实尝试在重新分配语句 var 之前取消设置它,但它没有帮助。 [...]
但是我不知道这是否也适用于范围将消失的局部变量。我也不使用mod_php 作为 SAPI。
相关错误材料
【问题讨论】: