在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。
我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。
当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?
在我们的地方,我们使用mysqli和PDO来处理准备好的语句和事务支持。有些项目使用其中一种,有些使用另一种。我们几乎不可能迁移到另一个RDBMS。
我更喜欢PDO,原因只有一个,它允许对预处理语句使用命名参数,而据我所知mysqli不允许。
当我们合并我们的项目只使用一种方法时,选择其中一种作为标准是否还有其他优点和缺点?
当前回答
在我的基准测试脚本中,每个方法都要测试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)。
其他回答
在我的基准测试脚本中,每个方法都要测试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,因为在我看来,语句支持更好。我使用的是activerecord式的数据访问层,实现动态生成的语句要容易得多。MySQLi的参数绑定必须在一个函数/方法调用中完成,所以如果你直到运行时才知道你想绑定多少个参数,你就被迫使用call_user_func_array()(我相信这是正确的函数名)来进行选择。忘记简单的动态结果绑定。
最重要的是,我喜欢PDO,因为它是一个非常合理的抽象级别。在不希望编写SQL的完全抽象的系统中使用它很容易,但它也使使用更优化的纯查询类型的系统或混合和匹配这两者变得容易。
就我个人而言,我使用PDO,但我认为这主要是一个偏好问题。
PDO有一些特性可以帮助防止SQL注入(准备好的语句),但是如果你小心使用SQL,你也可以用mysqli实现。
迁移到另一个数据库并不是使用PDO的原因。只要你不使用“特殊的SQL特性”,你就可以从一个DB切换到另一个DB。然而,只要你使用例如“SELECT…”你不能去MS-SQL,它是“SELECT TOP 1…”所以这是有问题的。
PDO有一件事,MySQLi没有,我真的很喜欢的是PDO的能力,返回一个结果作为一个指定类类型的对象(例如$ PDO ->fetchObject('MyClass'))。MySQLi的fetch_object()将只返回一个stdClass对象。
将应用程序从一个数据库移动到另一个数据库并不常见,但您迟早会发现自己正在使用不同的RDBMS处理另一个项目。如果你在家里使用PDO,那么在这一点上至少会少学一件事。
除此之外,我发现PDO API更直观一些,而且感觉更真正面向对象。mysqli感觉它只是一个被物化的过程API,如果你明白我的意思的话。简而言之,我发现PDO更容易使用,但这当然是主观的。