我正在使用与PDOStatement(; )的基于Mysql的PDO连接,并且我已经运行了一些在方法中使用的开发人员的代码.::prepare()::execute()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;
}
Run Code Online (Sandbox Code Playgroud)
在我的心智模型中,我会说PDOStatement无论如何都在这里被清除,因为我发现对象要处理这个内务处理(封装基础知识).因此,调用PDOStatement::closeCursor()看起来对我来说是多余的,特别是因为这可能不是这里想要的:因为语句不能被重用,所以我根本不需要关闭光标.
注意:这段代码是示例性的,在实际代码中,
$stmt->execute(...)如果行计数不是一(1),甚至会抛出异常.
不只是一些驱动程序 - 驱动程序提供的某些设置需要在触发另一个查询之前关闭结果集,例如关闭MySQL
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY.谢天谢地,你可以打电话closeCursor,当它不需要采取行动时它将成功地做任何事情.否则,只需取消设置包含语句句柄的变量即可清除.
另一个问题我何时应该将closeCursor()用于PDO语句?没有接受的答案,我不会怀疑,因为它是所有的愚蠢.
在重用PDO语句var崩溃过程中有一个注释,即取消设置变量不会导致所有错误(内存损坏错误):
[...]我确实尝试在重新分配之前取消设置语句var,但它没有帮助.[...]
但是我不知道对于范围不大的局部变量是否也是如此.我也不使用mod_phpSAPI.
pdo_mysql_stmt_dtor()运行相同的清理操作pdo_mysql_stmt_cursor_closer(),因此只要语句对象显式取消设置或超出范围,操作将始终执行.
因此,closeCursor()如果该声明即将被销毁,则无需致电.我个人也会这么做,因为我喜欢明确可读性,但这归结为个人风格偏好.
基于上面的引用,这只能说明某些关于PDO_mysql - 对于其他驱动程序,这可能不成立.