克隆PDOStatement

时间:2014-08-20 14:36:29

标签: php object pdo resultset

出于调试目的,我希望能够克隆PDOStatement,或者在不从语句中删除行的情况下获取数据。

这是一个展示我正在尝试做的事情的例子:

public function execute($query)
{
    // Prepare the statement
    if (!($stmt = $this->prepare($query))) {
        return false;
    }

    // Execute the statement
    $stmt->execute($params);

    // Print the query with a custom debug tool
    if( $config->debug ) {
        Debug::print($query);
        Debug::print($stmt->fetchAll(PDO::FETCH_ASSOC));
    }

    // Return the PDOStatement
    return $stmt;
}

问题是fetchAll()完成它的工作,从我的语句中删除每个结果,并且函数返回一个空数组。

我正在寻找一种方法来打印查询结果(调试目的)并返回初始语句(处理目的),而不查询我的数据库两次!

我试图克隆我的陈述,但没有成功:

if( $config->debug ) {
    $_stmt = clone $stmt;
    Debug::print($query);
    Debug::print($_stmt->fetchAll(PDO::FETCH_ASSOC));
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

PDOStatement不可复制。

实现我想要的唯一方法是重新执行声明:

public function execute($query)
{
    // Prepare the statement
    if (!($stmt = $this->prepare($query))) {
        return false;
    }

    // Execute the statement
    $stmt->execute($params);

    // Print the query with a custom debug tool
    if( $config->debug ) {
        Debug::print($query);
        Debug::print($stmt->fetchAll(PDO::FETCH_ASSOC));
        $stmt->execute($params);
    }

    // Return the PDOStatement
    return $stmt;
}

答案 1 :(得分:0)

不应重复查询,而应扩展PDOStatement并使PDO使用该类

$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, [yourclass]::class);

在自己的课程中,您可以制作PDOStatement seekable ,即。缓存fetch / fetchAll / fetchColumn函数的结果。