PDO VS PG_ *功能(PDO vs pg_* functions)

2019-06-24 01:44发布

他们都有准备好的语句。 PG_ *是一个包装LIBPQ。 对?

我喜欢在PHP中PDO,但我不打算更改数据库的未来。 我应该使用哪个库? 任何标杆? PHP版本:5.4

Answer 1:

PDO提供了一个很好的界面,但更多的通用性也意味着更多的麻烦来处理每个后端的微妙特质。 如果你看的错误追踪系统 ,它有许多悬而未决的问题,其中有些是严重的。

下面是PostgreSQL的一个传闻:PDO的解析器设置为ON standard_conforming_strings麻烦(即现在的默认,为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 ,没有其他条件,然后正常工作。 或者,如果其他条件不包括字符串,它工作正常了。

这个问题看起来类似问题#55335 ,这是斥为在我看来不是一个错误 ,是很错误的。 [事实上,我甚至砍死PDO自己修复它,但在某种程度上是与其他后端不兼容,所以没有补丁。 我被查询词法分析器是很通用不安。]

在另一方面,PG_ *更接近LIBPQ,这种问题不太可能在第一个地方发生,也更容易解决,如果它。

所以我的观点是,并非所有与PDO不错。 在内部,它肯定比PG_ *更具挑战性,更复杂意味着更多的错误。 正在解决这些错误? 基于一定的错误追踪系统项目,不一定。



Answer 2:

IMHO使用接近直接混凝土DB的功能(如pg_oci_mysql[i]_等)始终是一点点更快然后使用PDO或任何DBMS层(学说,DIBI等)。

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

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



Answer 3:

我认为这更多的是品味问题。 PDO因为它编译可能更快,也可能不是,因为它作为一个包装。 我相信,速差就足够小,不会对你的决定产生影响。

这纯粹是猜测,但PDO是新的,似乎是为DB连接现在的标准,因此它支持在代码中可能会增长方面,而对于支持mysql_*大概pg_*将继续减弱。

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

我个人更喜欢一起工作PDO 。 这比“资源”变量更容易通过和控制对象。



文章来源: PDO vs pg_* functions