mysqli或者PDO-优缺点是什么?
在我们的位置上,我们在使用mysqli和PDO进行准备语句和事务支持之类的工作之间有所分歧。有些项目使用一个,另一些使用。我们迁移到另一个RDBMS的现实可能性很小。
我更喜欢PDO,原因是它允许为准备好的语句使用命名参数,而据我所知mysqli不允许。
在我们将项目合并为仅使用一种方法时,是否有其他选择作为标准的利弊?
解决方案
回答
将应用程序从一个数据库迁移到另一个数据库并不常见,但是迟早我们可能会发现自己正在使用不同的RDBMS处理另一个项目。如果我们在家中使用PDO,那么到那时至少要少学习一件事。
除此之外,我发现PDO API更加直观,并且感觉更加面向对象。如果我们知道我的意思,mysqli感觉它只是一个已被对象化的过程API。简而言之,我发现PDO更易于使用,但这当然是主观的。
回答
我个人使用PDO,但我认为这主要是偏好问题。
PDO具有一些功能,可以帮助再次进行SQL注入(准备好的语句),但是如果我们对SQL保持谨慎,也可以使用mysqli来实现。
转移到另一个数据库并不是使用PDO的主要原因。只要我们不使用"特殊SQL功能",就可以从一个数据库切换到另一个数据库。但是,例如在使用" SELECT ... LIMIT 1"时,我们将无法访问MS-SQL,它是" SELECT TOP 1 ..."。因此无论如何这都是有问题的。
回答
我开始使用PDO,因为我认为语句支持会更好。我使用的是ActiveRecord式数据访问层,实现动态生成的语句要容易得多。 MySQLi的参数绑定必须在单个函数/方法调用中完成,因此,如果我们直到运行时才知道要绑定多少个参数,我们将被迫使用call_user_func_array()
(我相信这是正确的功能名称)进行选择。不用担心简单的动态结果绑定。
最重要的是,我喜欢PDO,因为它是非常合理的抽象级别。在不需要编写SQL的完全抽象的系统中使用它很容易,但也可以使它使用更优化的纯查询类型的系统,或者将两者混合和匹配,变得很容易。
回答
PDO是标准,这是大多数开发人员期望使用的标准。 mysqli本质上是针对特定问题的定制解决方案,但它具有其他特定于DBMS的库的所有问题。 PDO是所有辛勤工作和明智思维的去向。
回答
要记住一件事。
Mysqli不支持fetch_assoc()函数,该函数将返回带有表示列名的键的列。当然,可以编写自己的函数来做到这一点,它甚至不算很长,但是我确实很难编写它(对于非信奉者:如果我们觉得简单,可以花一些时间自己尝试一下,不要这样做。 t作弊:))
回答
PDO具有MySQLi我不真正喜欢的一件事是PDO能够将结果作为指定类类型的对象返回(例如$ pdo-> fetchObject('MyClass'))。 MySQLi的
fetch_object()将仅返回
stdClass`对象。
回答
还有一些需要记住的地方:目前(PHP 5.2),PDO库存在错误。它充满了奇怪的错误。例如:在将" PDOStatement"存储到变量中之前,该变量应为" unset()",以避免产生大量错误。其中大多数已在PHP 5.3中修复,它们将在2009年初在PHP 5.3中发布,可能还会有许多其他错误。如果我们想要一个稳定的版本,则应该专注于将PDO用于PHP 6.1,而如果我们想为社区提供帮助,则应专注于将PDO用于PHP 5.3.
回答
好吧,我们可以与面向对象方面,准备好的语句,它成为标准的事实等进行争论。但是我知道,在大多数情况下,说服某人使用杀手级功能会更好。就是这样:
使用PDO的真正好处是我们可以获取数据,然后将其自动注入到对象中。如果我们不想使用ORM(因为这只是一个快速的脚本),但是我们确实喜欢对象映射,那么它真的很酷:
class Student { public $id; public $first_name; public $last_name public function getFullName() { return $this->first_name.' '.$this->last_name } } try { $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password) $stmt = $dbh->query("SELECT * FROM students"); /* MAGIC HAPPENS HERE */ $stmt->setFetchMode(PDO::FETCH_INTO, new Student); foreach($stmt as $student) { echo $student->getFullName().'<br />'; } $dbh = null; } catch(PDOException $e) { echo $e->getMessage(); }
回答
从执行速度的角度来看,MySQLi胜出了,但是除非我们使用MySQLi有一个很好的包装器,否则它处理预准备语句的功能将很糟糕。
我的里面仍然有bug,但是如果有人想要,它就在这里。
简而言之,如果我们正在寻找速度上的增长,那么MySQLi;如果我们想易于使用,请使用PDO。
回答
在我的基准脚本中,每种方法都经过10000次测试,并打印出每种方法的总时间差。我们应该按照自己的配置进行操作,我相信结果会有所不同!
这些是我的结果:
- "
SELECT NULL"-> PGO()
快了〜0.35秒 - "
SHOW TABLE STATUS"-> mysqli()
快了〜2.3秒 - "
SELECT * FROM users"-> mysqli()
快了〜33秒
注意:通过对mysqli使用-> fetch_row(),列名未添加到数组中,我没有找到在PGO中执行此操作的方法。但是,即使我使用-> fetch_array(),mysqli也会稍慢一些,但仍然比PGO快(SELECT NULL除外)。