PDO与pg_ *函数

时间:2012-04-30 13:06:43

标签: php postgresql pdo libpq

他们都准备好了陈述。 pg_ *是libpq的包装器。正确?

我喜欢PHP中的PDO,但我将来不会更改数据库。 我应该使用哪个库? 任何基准? PHP版本:5.4

3 个答案:

答案 0 :(得分:9)

PDO提供了一个很好的界面,但更通用性也意味着处理每个后端的细微特性会更麻烦。如果你看一下the bugtracker,它会有一些未解决的问题,其中一些是严肃的。

以下是postgresql的轶事证据:PDO的解析器在将standard_conforming_strings设置为ON时出现问题(现在是PG-9.1的默认设置)。 使用php-5.3.9测试用例:

$dbh->exec("SET standard_conforming_strings=on");
$p=$dbh->prepare("SELECT 1 WHERE 'ab\' = :foo AND 'cd' = :bar");
$p->execute(array(":foo" => "ab", ":bar" => "cd"));

执行()在PDO层意外失败 Database error: SQLSTATE[HY093]: Invalid parameter number: :foo。它似乎无法识别:foo作为参数。

如果查询在'ab\'=:foo之后停止,没有其他条件,那么它可以正常工作。 或者如果其他条件不包含字符串,它也可以正常工作。

这个问题看起来与issue #55335类似,被认为是不是错误,在我看来是非常错误的。 [实际上,我甚至自己修复了PDO来修复它,但是在某种程度上与其他后端不兼容,所以没有补丁。我对查询词法分析器如此通用感到不安。]

另一方面,pg_ *更接近libpq,这种问题不太可能在第一时间发生,如果发生则更容易解决。

所以我的观点是PDO并不是一切都很好。在内部,它肯定比pg_ *更具挑战性,更复杂意味着更多的错误。这些错误是否得到解决?基于某些bugtracker条目,不一定。

答案 1 :(得分:4)

恕我直言使用直接接近具体数据库的函数(如pg_oci_mysql[i]_等)总是比使用PDO或任何DBMS层快一点(Doctrine ,迪比等。)。

但是在OOP架构中使用PDO或任何DBMS层应该是更好的方法(再次恕我直言),因为您学习使用此层,因此将在任何数据库引擎背后使用它。当然,如果您在应用程序中更改数据库引擎您不必费心重写整个应用程序。

即使您不打算更改数据库引擎,我也建议您使用PDO。但那只是我的意见: - )

答案 2 :(得分:1)

我认为这更属于品味问题。 PDO自编译以来可能更快,或者可能不是因为它充当包装器。我确信速度差异会小到不影响您的决定。

这是纯粹的推测,但PDO是新的,现在似乎是数据库连接的标准,因此在代码方面对它的支持可能会增长,而对mysql_*的支持可能会增加pg_*将继续减弱。

PDO的主要优点是它的抽象将允许你稍后切换到不同的数据库,但我打赌你不会,所以这可能不应该影响你的决定。

我个人更喜欢与PDO合作。传递和控制对象比使用"资源"更容易。变量