在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。

我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。

当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?


当前回答

将应用程序从一个数据库移动到另一个数据库并不常见,但您迟早会发现自己正在使用不同的RDBMS处理另一个项目。如果你在家里使用PDO,那么在这一点上至少会少学一件事。

除此之外,我发现PDO API更直观一些,而且感觉更真正面向对象。mysqli感觉它只是一个被物化的过程API,如果你明白我的意思的话。简而言之,我发现PDO更容易使用,但这当然是主观的。

其他回答

就我个人而言,我使用PDO,但我认为这主要是一个偏好问题。

PDO有一些特性可以帮助防止SQL注入(准备好的语句),但是如果你小心使用SQL,你也可以用mysqli实现。

迁移到另一个数据库并不是使用PDO的原因。只要你不使用“特殊的SQL特性”,你就可以从一个DB切换到另一个DB。然而,只要你使用例如“SELECT…”你不能去MS-SQL,它是“SELECT TOP 1…”所以这是有问题的。

这里还有一些需要记住的事情:目前(PHP 5.2) PDO库有bug。里面充满了奇怪的虫子。例如:在将PDOStatement存储在变量中之前,应该将变量unset()以避免大量错误。其中大部分问题已经在PHP 5.3中得到了修复,并将于2009年初在PHP 5.3中发布,届时可能会有许多其他错误。如果你想要一个稳定的版本,你应该专注于使用PDO for PHP 6.1,如果你想帮助社区,你应该专注于使用PDO for PHP 5.3。

PDO是标准,它是大多数开发人员希望使用的。mysqli本质上是针对特定问题的定制解决方案,但它具有其他特定于dbms的库的所有问题。PDO是所有努力工作和聪明思维的归宿。

编辑回答。

在对这两个api都有一些使用经验之后,我想说有两个阻塞级别的特性使mysqli无法与本机准备好的语句一起使用。 他们已经在两个优秀(但被低估了)的答案中提到过:

将值绑定到任意数量的占位符 仅以数组形式返回数据

(在这个答案中也提到了)

出于某种原因,mysqli两者都失败了。 现在它对第二个函数(get_result)有了一些改进,但它只能在mysqlnd安装上工作,这意味着你不能在你的脚本中依赖这个函数。

然而,直到今天,它还没有按值绑定。

所以,只有一个选择:PDO

所有其他的原因,比如

命名占位符(这种语法糖被高估了) 不同的数据库支持(实际上没有人使用过) 获取到对象(只是无用的语法糖) 速度差(没有)

都不重要。

同时,这两个api都缺乏一些真正重要的特性,比如

标识符占位符 复杂数据类型的占位符,使动态绑定不那么费力 更短的应用程序代码。

因此,为了满足现实生活的需要,人们必须创建自己的抽象库,基于这些api之一,实现手动解析的占位符。在这种情况下,我更喜欢mysqli,因为它具有较低的抽象级别。

在执行速度方面,MySQLi胜出,但除非你有一个使用MySQLi的良好包装器,否则它的函数处理预处理语句是很糟糕的。

我的还有些bug,但如果有人想要的话,给你。

所以简而言之,如果你正在寻找一个速度增益,那么MySQLi;如果你想要易用性,那么PDO。