【发布时间】:2019-03-11 14:17:34
【问题描述】:
我开发了某种查询构建器,并且编写了一些测试来检查 QueryBuilder 是否构建了正确的查询。
所以我有一组自己编写的查询,它们是预期的查询,QueryBuilder 将产生。
在我看来,仅仅比较这些查询是不够的,还要测试这些查询是否由底层 DBMS 编译。
因此,我使用 PDO::Prepare(而 EmulationMode=off!),让 DBMS 检查我的预期查询。
这个 PHPUnit 测试非常简单:
/**
* @dataProvider provideExpectedSQLResults
*/
public function testExpectedSQLResults(string $sql)
{
$this->getPdo()->prepare($sql);
}
这样我什至可以检查我的 QueryBuilder 是否正确(未)命名参数。
现在我的问题:
我是否必须“清理”所有这些打开的准备好的语句?
【问题讨论】:
-
PHP 会在每次脚本终止时为您执行此操作。
-
在纯 PHP 中,您会返回一个 PDOStatment 对象来跟踪它们。所以 PHP 作为一个整体不会为你做这些。所以答案是不用担心他们。
-
使用应该在
__destruct()方法中添加public function __destruct(){ $this->getPdo()->close() } -
我认为您将准备好的语句与打开的数据库连接混淆了。 PDO 中没有打开或关闭的准备好的语句,我不知道
My QueryBuilder是什么意思......但我可以在你的testExpectedSQLResults方法中告诉你,你不会执行该查询,因为你不从PDO::prepare返回语句对象 -
一旦您的语句句柄/对象超出范围,PHP 垃圾收集器就会启动。
标签: php pdo prepared-statement