我需要关闭未使用的准备好的语句吗?

时间:2019-03-11 14:17:34

标签: php pdo prepared-statement

我已经开发了某种查询生成器,并编写了一些测试来检查QueryBuilder是否构建正确的查询。

因此,我有一组自行编写的查询,这是QueryBuilder应产生的预期查询。

在我看来,仅比较这些查询还是测试这些查询是否由基础DBMS编译是不够的。

因此,我正在使用PDO::Prepare(而EmulationMode = off!)来让DBMS检查我期望的查询。

此PHPUnit测试非常简单:

/**
 * @dataProvider provideExpectedSQLResults
 */
public function testExpectedSQLResults(string $sql)
{
    $this->getPdo()->prepare($sql);
}

通过这种方式,我什至可以检查我的QueryBuilder是否正确地执行了(未)命名参数。

现在我的问题:

我是否必须“清理”所有这些打开的准备好的语句?

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说。

我认为您正在将开放式数据库连接与准备好的语句混淆。对于准备好的语句,PDO返回需要调用execute的PDOStatment对象。实际上,PDO甚至没有执行方法。

http://php.net/manual/en/class.pdo.php

此外,没有打开或关闭的准备好的语句。

在您的示例代码中:

public function testExpectedSQLResults(string $sql)
{
    $this->getPdo()->prepare($sql);
}

这本质上是没有实际意义的(除非您只是这样做以引发异常,这在下面仍然很常见),因为您永远不会执行此查询,因为您不会返回实际上具有execute方法的PDOStatment对象。

对于数据库连接,通常您也不必为此担心

对于测试PDO::prepare确实返回布尔值false或引发异常,具体取决于其设置方式。参数化的数据在源代码中不存在(通常)。它取决于应用程序运行时的状态。输入数据(如果需要)。没有这个,就无法真正测试它。

基本上,您在上面所做的只是测试SQL的语法,这通常是好是坏,并​​且不会根据用户输入而改变太多。即使是动态查询也无法使用,因为您的SQL在语法上是否正确。如果不是,则必须更改生成它的代码,在开发时会发现一些问题。

如果使用类似 PHPUnit 的工具,则单元测试是另一回事。您可以在其中使用固定装置和模拟来输入数据等。这更多是针对已知用例测试代码,因此,如果在此处更改代码,则不会突然出现错误。等等。您可以对此进行研究。您没有在问题中提及它,所以我假设您没有使用它。

在PHPUnit中,您可以使用注释来测试该测试方法是否抛出特定的异常,例如:

/**
 * @expectedException \PDOException
 */

https://phpunit.readthedocs.io/en/8.0/index.html

希望有帮助。