首页 文章

mysqli或PDO - 有什么优缺点? [关闭]

提问于
浏览
342

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

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

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

13 回答

  • 17

    从执行速度来看,MySQLi获胜,但除非你有一个使用MySQLi的好包装器,否则它处理预处理语句的功能很糟糕 .

    我的仍然存在漏洞,但如果有人想要它,here it is .

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

  • 6

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

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

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

  • 5

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

    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().'
    '; } $dbh = null; } catch(PDOException $e) { echo $e->getMessage(); }
  • 57

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

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

  • 8

    我've started using PDO because the statement support is better, in my opinion. I'm使用ActiveRecord-esque数据访问层,它必须在单个函数/方法调用中完成's much easier to implement dynamically generated statements. MySQLi'参数绑定,所以如果你不想绑定,你就不得不使用 call_user_func_array() (我相信对于选择,这是正确的函数名称 . 忘记简单的动态结果绑定 .

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

  • 25

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

  • 4

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

  • -4

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

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

  • 15

    如果您的站点/ Web应用程序真正存在,PDO将使其更容易扩展,因为您可以每天设置主从连接以在数据库中分配负载,而且PHP正朝着转向PDO作为标准 .

    PDO Info

    Scaling a Web Application

  • 3

    编辑回答 .

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

    (两者也在this answer中提到)

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

    然而,直到今天它还没有按 Value 绑定 .

    所以,只有一个选择: PDO

    所有其他原因,如

    • 命名占位符(此语法糖被高估)

    • 不同的数据库支持(没有人真正使用它)

    • 获取对象(只是无用的语法糖)

    • 速度差(没有)

    没有任何重要意义 .

    与此同时,这两个API都缺少一些 real important features

    • 标识符占位符
      复杂数据类型的

    • 占位符使动态绑定更少

    • 更短的应用程序代码 .

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

  • 10

    在我的benchmark script中,每种方法都进行了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除外) .

  • 243

    PDO有一点认为MySQLi不能将结果作为指定类类型的对象返回(例如 $pdo->fetchObject('MyClass') ) . MySQLi的 fetch_object() 只返回一个 stdClass 对象 .

  • 5

    要记住一件事 .

    Mysqli不支持fetch_assoc()函数,该函数将使用表示列名的键返回列 . 当然它甚至不是很长,但是我很难写它(对于非信徒来说:如果你觉得这很容易,可以自己尝试一下,不要作弊:))

相关问题