出于调试目的,我希望能够克隆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));
}
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;
}
与其重复您的查询,您应该扩展PDOStatement并使PDO使用该类
$pdo->setAttribute(PDO::ATTR_STATEMENT_CLASS, [yourclass]::class);
在自己的类中,您可以使PDOStatement 可查找,即:缓存fetch
/fetchAll
/fetchColumn
函数的结果