Php MySQL、MySQLi、MySQL准备语句还是PDO?

Php MySQL、MySQLi、MySQL准备语句还是PDO?,php,mysql,database,pdo,mysqli,Php,Mysql,Database,Pdo,Mysqli,在过去的几天里,我一直在学习很多关于与数据库交互的不同方法的教程。像旧的MySQL方式一样,MySQLi、MySQL准备语句、PHP的PDO等 我仍然是编程的新手,因为我学习并开始编程还不到一年。我不时地在改进代码和遵守web开发人员定义的标准方面做出很多努力。现在,我感觉我改变了使用旧的MySQL方式与数据库交互的方式,比如MySQL\u connect()和MySQL\u query() 我的生产机器上有以下配置 安装了MAMP的Mac OSX 10.6 PHP版本:5.2.13 MySQ

在过去的几天里,我一直在学习很多关于与数据库交互的不同方法的教程。像旧的MySQL方式一样,MySQLi、MySQL准备语句、PHP的PDO等

我仍然是编程的新手,因为我学习并开始编程还不到一年。我不时地在改进代码和遵守web开发人员定义的标准方面做出很多努力。现在,我感觉我改变了使用旧的MySQL方式与数据库交互的方式,比如MySQL\u connect()和MySQL\u query()

我的生产机器上有以下配置

  • 安装了MAMP的Mac OSX 10.6
  • PHP版本:5.2.13
  • MySQL客户端版本:5.1.44
你认为我应该用什么来访问数据库?为什么

  • MySQL
  • MySQLi
  • MySQL准备的声明
  • PDO
      • Mysql ext已经不存在了
      • 假设MySQL Prepared语句是一个函数,我发现它在PHP中几乎不可用
      我们只有两种可能的选择

      • PDO。如果您计划按原样使用数据库API,那么PDO显然是胜利者,它比mysqli更加用户友好。此外,如果您正在编写一个开源库,那么PDO是唯一的选择,因为它将允许用户连接任何受支持的数据库。总而言之,PDO是一个很好的经验法则:如果你不知道该使用哪种驱动程序,直接去PDO。
      • mysqli。如果您打算编写一个数据库包装器来封装原始API函数,并且您的数据库后端将始终保持mysql,并且命名参数对您来说不是游戏规则的改变者,那么mysqli也可能是一个不错的选择,它提供了一些方便的mysql特定函数,例如mysqli_info()

        • 这取决于你在做什么


          如果您正在执行大量都使用准备好的语句的大容量查询,那么准备好的语句(通过mysqli或PDO)可能非常有用。准备好的报表速度更快,此外,您不必担心使用准备好的语句转义数据之类的事情,但它们会占用一些代码开销,因此对于一个简单的应用程序来说,有时不值得使用准备好的语句,并且使用旧的mysql函数更容易达到预期目的。

          PDO for mysql与直接使用MySQLi

        • PDO支持多个数据库后端。这有助于您的一个客户端请求将应用程序的端口连接到其他数据库
        • PDO中的准备语句除了MySQLi支持的位置(
          )占位符外,还支持命名占位符
        • PDO支持一次绑定一个参数,而不是一次绑定所有参数。这允许单步遍历参数数组并绑定每个参数,而不必构造类型字符串,然后使用
          call\u user\u func\u array()
          black magic
        • PDO通过向
          $stmt->execute()
          传递一个数组来支持一个方便的快捷方式,其中每个键的值都作为键绑定到占位符。(注意:它将每个值强制转换为一个字符串,因此您必须这样做。这是,并且有一个。)
        • 第2项到第4项的组合使得在中以可证明的注入安全方式更容易表达操作员的右侧。使用PDO,您可以使用顺序名称构建关联数组(例如
          [':likeval0'=>$val0':likeval1'=>$val1':likeval2'=>$val2])
          ,然后在该数组的右侧安全地构建占位符列表。代码可能如下所示:

          $args = [];
          foreach ($usernames as $n=>$value) {
              $args[":likeval$n"] = $value;
          }
          $list = implode(',', array_keys($args));
          // result is like ':likeval0,:likeval1,:likeval2'
          $stmt = "SELECT * FROM app_users WHERE `username` IN ($list)";
          $stmt = $dbh->prepare($stmt);
          $c = $stmt->execute($args);
          

          MySQLi只支持
          占位符和通过变量参数函数调用一次绑定。在MySQLi中,通过对列表中的每个元素使用
          $dbh->escape_string()
          ,在
          中构造操作符
          的右侧实际上要容易得多。如果经过良好测试,这种方法对SQL注入是安全的,但会引起一些问题。

          “PDO比mysqli好得多。”PDO在可用时使用mysqli扩展。接口可能更好,但这也是一个品味问题。PDO没有以任何方式使用mysqli。两者都是Mysql C API的包装器