PHP| PEAR:MDB2 vs PDO vs Native-PHP(原始)

Posted

技术标签:

【中文标题】PHP| PEAR:MDB2 vs PDO vs Native-PHP(原始)【英文标题】:PHP| PEAR:MDB2 vs PDO vs Native-PHP (Raw) 【发布时间】:2011-11-17 01:58:26 【问题描述】:

在通过 Internet 进行了某种研究之后(以及在 *** 上) - 我仍在努力决定哪种方法最适合我在 php 编程时学习/使用和挖掘更多内容。

我了解在处理 DB 时使用 DAO 的一些优势,而不是使用分布在应用程序文件中的直接 mysql_* 函数。

当谈到在 MDB2 与 PDO 之间做出决定时 - 有利于 PDO 的一件事是它不抽象 mysql_* 函数,它直接与 mysql api 对话,就像mysql_* 做。它也是 PHP 的编译 C 扩展,因此非常快。虽然 MDB2(或其他库)是用 PHP 编写的,所以它们需要在运行时解析并位于 mysql_* 函数之上。那么,就速度而言,PDO 获胜?!?

在比较 DB 抽象层与原生非抽象 PHP 方式时, DB 抽象层在使用绑定参数(准备好的语句)的方式上的安全优势,这将防止大多数 sql 注入攻击,而且如果有需要/请求,将来切换 RDBMS 类型会更容易——即使它是并不常见 - (这些 DAO 库中还有其他优点和不错的耗时功能)。

无论如何,我希望有专家可以帮助我决定我应该使用其中一个库,如果是,哪个是最推荐的?或者我应该编写自己的 DAO 库来为我服务我的项目会随着时间的推移而得到改进吗?

谢谢。

【问题讨论】:

PDO 可能有一个已编译的组件,但它仍然做了很多“原始”接口没有的处理。仍然有开销,但在不同的地方。您将从这里得到的唯一好的答案是尝试 pdo v.s. mdb2 对比“原始”,看看哪一个在您的特定情况下更好。 我确实练习过 PEAR:MDB2 - 困境在于使用其中一个库(MDB2、PDO、ADOdb ..),如果是,那么哪个是最推荐的(因为它们基本上都是用于相同的目的,但语法略有不同),或者我应该抽象我自己的 DAO - 这样我将确切地知道代码的外观,并且我可以完全控制它而不是依赖于 3rd 维度代码?!?另外,据我了解,PDO 的性能优于其他库,因为他直接与数据库通信,而不是通过一些建立在 mysql_* 函数之上的抽象来实现 mysql_*() 不是抽象的。它们是对底层 libmysql 客户端库的直接调用,就像 PDO 一样。 mysql_*() 只是更直接地映射到库调用。 是的,我确实意识到 mysql_*() 不是抽象,我所指的是 - 我应该构建自己的 DAO 库,它实际上是使用原始方法为数据库抽象层是不是吗?如果一个人创建了一个数据库类来处理他所有的应用程序数据库连接和查询/获取数据——这不是抽象数据库吗?谢谢! 【参考方案1】:

问自己这些问题:

我的代码是瓶颈还是数据库?当您对数据库执行数千个简单查询时,缓慢的 php 代码是一个问题。当您每个请求只执行几十个查询时,db 层的开销可能不会很明显 您是否需要切换到不同的数据库系统?如果您正在为具有明确要求的客户开展工作,那么您很可能无论如何都被锁定在 DMBS 上,而且您不必关心互操作性。

另外,MDB2 现在已经很老了。如果我是你,我会使用 Doctrine DBAL——它可以在没有 Doctrine 的情况下使用,它位于 PDO 之上。我不会使用旧的“原生”mysql_* 函数。

【讨论】:

所以基本上你更喜欢在大多数情况下使用抽象层,除了那些对 DB 有超过几十个查询的情况?你建议避免使用“native: mysql_*() 函数不惜一切代价,即使在抽象自己的 DB 类抽象层库时?以前从未听说过 Doctrines DBAL - 如果位于 PDO 之上 - 为什么只使用 PDO,因为缺乏功能?很高兴知道 MDB2 很旧,我第一次听说了。谢谢!

以上是关于PHP| PEAR:MDB2 vs PDO vs Native-PHP(原始)的主要内容,如果未能解决你的问题,请参考以下文章

PDO vs MYSQLI,Prepared Statemens 和绑定参数

安全问题:Mysqli vs PDO [重复]

如何使用PDO从SET类型列返回多个值?

PHP 数组——方括号 vs 花括号($array[$i] vs $array$i)

mod_php vs cgi vs fast-cgi

PHP 注释:# vs. //