我正在使用基于Mysql的PDO连接和 PDOStatement (::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;
}

在我的心智模型中,我会说这里无论如何都清除了PDOStatement,因为我期望该对象负责此内务处理(封装基础知识)。因此,对我来说,调用PDOStatement::closeCursor()似乎是多余的,特别是因为这可能与此处不完全一样:由于该语句不再被重复使用,因此我根本不需要关闭游标。



Stackoverflow上的现有 Material

Charles问题中的commmented back in May 2011 pdo free result:



另一个问题When should I use closeCursor() for PDO statements?没有被接受的答案,我不会对此感到奇怪,因为它全是一厢情愿的。

Reusing PDO statement var crashes the process中,有一个a comment made:取消设置变量不会完全消除所有错误(内存损坏错误):



但是我不知道对于范围将消失的局部变量来说是否也是如此。我也不使用mod_php作为SAPI。

相关Bug资料
  • Bug #66878 Multiple rowsets not returned unless PDO statement object is unset()
  • 最佳答案

    pdo_mysql_stmt_dtor() 运行与 pdo_mysql_stmt_cursor_closer() 相同的清除操作,因此只要声明对象未明确设置或超出范围,该操作将始终执行。

    因此,如果该语句将要被销毁,则不必严格要求调用closeCursor()。就个人而言,我还是会这样做,因为我希望明确表示可读性,但这取决于个人的风格偏好。

    基于上述引用,只能肯定地说到PDO_mysql-对于其他驱动程序,可能不成立。

    10-04 22:56