他们都有准备好的语句。 PG_ *是一个包装LIBPQ。 对?
我喜欢在PHP中PDO,但我不打算更改数据库的未来。 我应该使用哪个库? 任何标杆? PHP版本:5.4
他们都有准备好的语句。 PG_ *是一个包装LIBPQ。 对?
我喜欢在PHP中PDO,但我不打算更改数据库的未来。 我应该使用哪个库? 任何标杆? PHP版本:5.4
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_ *更具挑战性,更复杂意味着更多的错误。 正在解决这些错误? 基于一定的错误追踪系统项目,不一定。
IMHO使用接近直接混凝土DB的功能(如pg_
, oci_
, mysql[i]_
等)始终是一点点更快然后使用PDO或任何DBMS层(学说,DIBI等)。
但在OOP架构使用PDO或任何DBMS层应该是更好的方法(恕我直言,再次),当你学会使用这一层,因此将使用它在任何数据库引擎背后。 当然,如果你在应用程序中改变DB引擎不必与整个应用程序的重写打扰。
即使你不打算更改数据库引擎我会建议使用PDO的。 但那只是我的个人意见 :-)
我认为这更多的是品味问题。 PDO
因为它编译可能更快,也可能不是,因为它作为一个包装。 我相信,速差就足够小,不会对你的决定产生影响。
这纯粹是猜测,但PDO
是新的,似乎是为DB连接现在的标准,因此它支持在代码中可能会增长方面,而对于支持mysql_*
大概pg_*
将继续减弱。
的主要优点PDO
是,它的抽象将允许您以后切换到不同的数据库,但我敢打赌,你不会,可能是这应该也不动摇你的决定。
我个人更喜欢一起工作PDO
。 这比“资源”变量更容易通过和控制对象。