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

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

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


当前回答

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

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

其他回答

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

关于PDO的另一个值得注意的(好的)区别是,它的PDO::quote()方法自动添加外围引号,而mysqli::real_escape_string()(和类似的)不会:

PDO::quote()在输入字符串周围放置引号(如果需要)和 使用引号转义输入字符串中的特殊字符 适合底层驱动程序的样式。

在我的基准测试脚本中,每个方法都要测试10000次,并打印每个方法总时间的差值。你应该在你自己的配置上这样做,我相信结果会有所不同!

以下是我的结果:

"SELECT NULL" -> PGO()更快~ 0.35秒 "SHOW TABLE STATUS" -> mysqli()加快~ 2.3秒 "SELECT * FROM users" -> mysqli()快了~ 33秒

注意:通过使用->fetch_row() for mysqli,列名不会添加到数组中,我没有找到在PGO中这样做的方法。但即使我使用->fetch_array(), mysqli略慢,但仍然比PGO快(除了SELECT NULL)。

PDO有一件事,MySQLi没有,我真的很喜欢的是PDO的能力,返回一个结果作为一个指定类类型的对象(例如$ PDO ->fetchObject('MyClass'))。MySQLi的fetch_object()将只返回一个stdClass对象。

有一件事要记住。

Mysqli不支持fetch_assoc()函数,该函数将返回带有表示列名的键的列。当然,你也可以自己写一个函数来实现它,它甚至不是很长,但我真的很难写出来(对于不相信它的人:如果它对你来说很容易,你可以自己试试,不要作弊:))