他们都准备好了陈述。 pg_ *是libpq的包装器。正确?
我喜欢PHP中的PDO,但我将来不会更改数据库。 我应该使用哪个库? 任何基准? PHP版本:5.4
答案 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
合作。传递和控制对象比使用"资源"更容易。变量