9

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

我喜欢 PHP 中的 PDO,但我以后不会更改数据库。我应该使用哪个库?有什么基准吗?PHP版本:5.4

4

3 回答 3

10

PDO 提供了一个很好的接口,但更通用性也意味着处理每个后端的细微特性的麻烦更多。如果您查看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"));

execute() 在 PDO 层意外失败,出现 Database error: SQLSTATE[HY093]: Invalid parameter number: :foo. 似乎无法将 :foo 识别为参数。

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

这个问题看起来与issue #55335相似,在我看来,这被认为是Not a bug ,这是完全错误的。[实际上,我什至自己破解了 PDO 来修复它,但是以一种与其他后端不兼容的方式,所以没有补丁。我对查询词法分析器如此通用感到不安。]

另一方面,pg_* 更接近于 libpq,这种问题一开始就不太可能发生,而且如果发生的话,也更容易解决。

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

于 2012-04-30T19:37:02.827 回答
4

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

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

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

于 2012-04-30T13:33:28.183 回答
1

我认为这更多的是品味问题。 PDO可能因为它被编译而更快,或者它可能不是因为它充当包装器。我相信速度差异会足够小,不会影响您的决定。

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

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

我个人更喜欢与PDO. 传递和控制对象比“资源”变量更容易。

于 2012-04-30T13:35:38.543 回答