mysqli或PDO-优缺点是什么?

php mysql pdo mysqli database-abstraction

133740 观看

13回复

17020 作者的声誉

在我们的位置上,我们在使用mysqli和PDO进行诸如准备好的语句和事务支持之类的操作之间是分开的。有些项目使用一个,另一些使用。我们迁移到另一个RDBMS的现实可能性很小。

我更喜欢PDO,这是因为它允许预准备语句使用命名参数,而据我所知mysqli不允许。

在我们将项目合并为仅使用一种方法时,是否有其他选择作为标准的利弊?

作者: Polsonby 的来源 发布者: 2008 年 8 月 17 日

回应 (13)


57

116717 作者的声誉

将应用程序从一个数据库迁移到另一个数据库并不常见,但是迟早您可能会发现自己正在使用不同的RDBMS处理另一个项目。如果您在家中使用PDO,那么到那时至少要少学习一件事。

除此之外,我发现PDO API更加直观,并且感觉更加面向对象。如果您知道我的意思,mysqli感觉这只是一个已被对象化的过程API。简而言之,我发现PDO更易于使用,但这当然是主观的。

作者: Theo 发布者: 17.08.2008 09:55

5

17443 作者的声誉

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

PDO的某些功能可以帮助SQL注入(准备好的语句),但是如果您对SQL保持谨慎,也可以使用mysqli来实现。

转移到另一个数据库并不是使用PDO的主要原因。只要您不使用“特殊SQL功能”,就可以从一个数据库切换到另一个数据库。但是,例如在使用“ SELECT ... LIMIT 1”时,您将无法使用MS-SQL,它是“ SELECT TOP 1 ...”。因此无论如何这都是有问题的。

作者: BlaM 发布者: 19.08.2008 06:55

25

14975 作者的声誉

我开始使用PDO,因为我认为语句支持会更好。我使用的是ActiveRecord风格的数据访问层,实现动态生成的语句要容易得多。MySQLi的参数绑定必须在单个函数/方法调用中完成,因此,如果您直到运行时才知道要绑定多少个参数,您将被迫使用call_user_func_array()(我相信这是正确的函数名)进行选择。忘记简单的动态结果绑定。

最重要的是,我喜欢PDO,因为它是非常合理的抽象级别。在不需要编写SQL的完全抽象的系统中使用它很容易,但是也可以使它使用更优化的纯查询类型的系统,或者将两者混搭在一起。

作者: Brian Warshaw 发布者: 08.09.2008 02:17

17

688 作者的声誉

PDO是标准,这是大多数开发人员期望使用的标准。mysqli本质上是针对特定问题的定制解决方案,但它具有其他特定于DBMS的库的所有问题。PDO是所有辛勤工作和明智思维的去向。

作者: Dave Gregory 发布者: 10.09.2008 09:56

-4

3640 作者的声誉

要记住一件事。

Mysqli不支持fetch_assoc()函数,该函数将返回带有表示列名的键的列。当然,可以编写自己的函数来做到这一点,虽然还不算很长,但是我确实很难编写它(对于非信奉者:如果您觉得很容易,可以花一些时间自己尝试一下,不要这样做。 t作弊:))

作者: michal kralik 发布者: 24.09.2008 01:45

3

234 作者的声誉

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

作者: Unlabeled Meat 发布者: 24.09.2008 02:01

15

2941 作者的声誉

还有一点要记住:目前(PHP 5.2),PDO库存在错误。它充满了奇怪的错误。例如:在将a存储到PDOStatement变量中之前,该变量应unset()避免大量错误。其中大多数已在PHP 5.3中修复,它们将于2009年初在PHP 5.3中发布,可能还会有许多其他错误。如果您想要一个稳定的版本,则应该专注于将PDO用于PHP 6.1,而如果您想为社区提供帮助,则应专注于将PDO用于PHP 5.3。

作者: Tom 发布者: 15.12.2008 03:45

243

380597 作者的声誉

好吧,您可以与面向对象方面,准备好的语句,它成为标准的事实等进行争论。但是我知道,在大多数情况下,说服某人使用杀手级功能会更好。就是这样:

使用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();
}
作者: e-satis 发布者: 15.12.2008 04:49

6

0 作者的声誉

从执行速度的角度来看,MySQLi胜出了,但是除非您使用MySQLi有一个好的包装器,否则它处理预准备语句的功能将很糟糕。

我的里面仍然有虫子,但是如果有人想要,它就在这里

简而言之,如果您正在寻找速度上的增长,那么MySQLi;如果您想易于使用,请使用PDO。

作者: Joseph Montanez 发布者: 10.04.2009 06:04

4

83 作者的声誉

在我的基准脚本中,每种方法经过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除外)。

作者: Dobb 发布者: 14.10.2010 08:43

10

112502 作者的声誉

关于PDO的另一个显着(良好)区别是,它的PDO::quote()方法会自动添加封闭的引号,而mysqli::real_escape_string()(和类似的)则不会:

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

作者: Alix Axel 发布者: 26.07.2011 04:20

8

1000 作者的声誉

如果您的站点/ Web应用程序真正成为现实,那么PDO将使扩展变得容易得多,因为您可以每天设置主连接和从属连接以在数据库中分配负载,此外PHP正朝着将PDO迁移为标准的方向发展。

PDO资讯

扩展Web应用程序

作者: Dfranc3373 发布者: 20.04.2012 10:58

5

137263 作者的声誉

编辑答案。

在对这两种API都有一定的经验之后,我会说有2种阻止级别的功能,这些功能使mysqli无法与本机预处理语句一起使用。
他们已经在2个出色的答案中被提及(但被低估了):

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

(在此答案中也都提到了)

由于某种原因,mysqli都失败了。
如今,第二个版本(get_result)有了一些改进,但仅适用于mysqlnd安装,这意味着您不能在脚本中依赖此功能。

但是直到今天,它都没有按值绑定。

因此,只有一种选择:PDO

所有其他原因,例如

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

并不重要。

同时,这两个API都缺少一些真正重要的功能,例如

  • 标识符占位符
  • 复杂数据类型的占位符,以使动态绑定的工作量减轻
  • 较短的应用程序代码。

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

作者: Your Common Sense 发布者: 13.01.2013 01:06
32x32