mysqli或PDO - 有什么优缺点?

时间:2008-08-17 09:47:23

标签: php mysql pdo mysqli database-abstraction

在我们的位置,我们将使用mysqli和PDO分为准备语句和事务支持之类的东西。有些项目使用一个,另一个项目。我们几乎没有可能转移到另一个RDBMS。

我更喜欢PDO,因为它允许为预准备语句命名参数,并且据我所知,mysqli没有。

在我们整合项目以仅使用一种方法时,是否还有其他优点和缺点选择其中一种作为标准?

13 个答案:

答案 0 :(得分:243)

好吧,你可以争论面向对象的方面,准备好的陈述,它成为一个标准的事实等等。但我知道大多数时候,说服某人使用杀手功能更好地工作。它就是:

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();
}

答案 1 :(得分:57)

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

除此之外,我发现PDO API更直观一些,感觉更真实的面向对象。如果你知道我的意思,mysqli觉得它只是一个被客观化的程序API。简而言之,我发现PDO更容易使用,但这当然是主观的。

答案 2 :(得分:25)

我开始使用PDO,因为在我看来,语句支持更好。我正在使用ActiveRecord-esque数据访问层,并且实现动态生成的语句要容易得多。 MySQLi的参数绑定必须在单个函数/方法调用中完成,所以如果你直到运行时才知道你要绑定多少个参数,你就不得不使用call_user_func_array()(我相信这是正确的)功能名称)用于选择。忘记简单的动态结果绑定。

最重要的是,我喜欢PDO,因为它是一个非常合理的抽象层次。在完全抽象的系统中使用它很容易,你不想编写SQL,但它也可以很容易地使用更优化,纯粹的查询类型的系统,或者混合和匹配这两种系统。

答案 3 :(得分:17)

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

答案 4 :(得分:15)

以下是需要注意的事项:目前(PHP 5.2),PDO库是 buggy 。它充满了奇怪的错误。例如:在变量中存储PDOStatement之前,变量应为unset()以避免大量错误。其中大部分已在PHP 5.3中修复,它们将于2009年初在PHP 5.3中发布,这可能还有许多其他错误。如果你想要一个稳定的版本并使用PDO for PHP 5.3,你应该专注于使用PDO for PHP 6.1,如果你想帮助社区。

答案 5 :(得分:10)

关于PDO的另一个值得注意的(好)差异在于它的PDO::quote()方法会自动添加封闭引号,而mysqli::real_escape_string()(和类似物)则不会:

  

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

答案 6 :(得分:8)

如果您的网站/网络应用程序确实存在,PDO将使其更容易扩展,因为您可以每天设置主连接和从属连接以在数据库中分配负载,此外PHP正朝着迁移到PDO的方向发展

PDO Info

Scaling a Web Application

答案 7 :(得分:6)

在执行速度方面,MySQLi获胜,但除非你有一个使用MySQLi的好包装器,否则它处理预准备语句的功能很糟糕。

我的遗体仍然存在,但如果有人想要,here it is

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

答案 8 :(得分:5)

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

PDO有一些功能可以帮助SQL注入(prepared statements),但如果你小心你的SQL,你也可以用mysqli来实现。

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

答案 9 :(得分:5)

编辑回答。

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

  1. Binding values to arbitrary number of placeholders
  2. Returning data as a mere array
  3. (两者也在this answer中提及)

    出于某种原因,mysqli都失败了。
    现在它对第二个(get_result)有了一些改进,但它仅适用于mysqlnd安装,意味着你不能在脚本中依赖这个功能。

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

    因此,只有一个选择: PDO

    所有其他原因,例如

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

    没有任何重要意义。

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

    • 标识符占位符
    • 复杂数据类型的占位符,使动态绑定更少
    • 更短的应用程序代码。

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

答案 10 :(得分:4)

在我的benchmark script中,每种方法都进行了10000次测试,并打印了每种方法的总时间差异。你应该在你自己的配置上,我相信结果会有所不同!

这些是我的结果:

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

注意:通过对mysqli使用 - &gt; fetch_row(),列名不会添加到数组中,我没有找到在PGO中执行此操作的方法。但即使我使用 - &gt; fetch_array(),mysqli稍慢但仍比PGO快(SELECT NULL除外)。

答案 11 :(得分:3)

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

答案 12 :(得分:-4)

要记住一件事。

Mysqli不支持fetch_assoc()函数,该函数将使用表示列名的键返回列。当然可以编写你自己的功能来做到这一点,它甚至不是很长,但我真的很难写它(对于非信徒:如果它看起来很容易,试试吧你自己的一些时间,不要作弊:))