首页 文章

PHP PDO和MySQLi [重复]

提问于
浏览
36

这个问题在这里已有答案:

我刚刚完成了PHP的入门课程,并且在整个stackoverflow论坛中,人们建议我切换到PDO,准备好的语句或MYSQLi,我简要地检查了手册,但大部分都是我的头脑 .

到目前为止我一直在使用mysql_ *函数,所以这些概念对我来说都是新的 . 我认为他们习惯于访问和执行特定于数据库的操作,但我不确定 .

那么PDO,预处理语句和MySQLi之间的区别是,它们是完成相同任务的不同功能吗?它们是在脚本中兼容还是“选择其中一种”?最后哪个提供最佳性能?

更新:感谢您的回答,我将寻找更多的PDO教程 .

作为参考,我还发现以下帖子很有用:

Which one is fast and light - mysqli or PDO

mysqli or PDO - what are the pros and cons?

6 回答

  • 1

    在基本级别,mysql,mysqli和PDO扩展都回答了如何与数据库通信的问题?它们都提供连接数据库并从中发送和检索数据的功能和功能 . 您可以同时使用它们,同时 Build 与数据库的多个连接,但这通常是无稽之谈 .

    mysql *是一个非常简单的扩展,基本上允许你连接到数据库,发送它的SQL查询,而不是其他 .
    mysqli通过添加参数化查询和其他一些东西来改进这个(顾名思义) .
    PDO是一个扩展,它将几个数据库驱动程序抽象到一个包中,即它允许您使用相同的代码连接到MySQL,Oracle,MS SQL Server和许多其他数据库,而无需使用特定于数据库的扩展或重写代码时你切换数据库(理论上至少) . 它还支持参数化查询 .

    如果你知道你将独家使用MySQL,那么mysqli是一个不错的选择 . 特别是因为你可以以程序的方式使用它,你已经习惯了mysql扩展 . 如果您不熟悉OOP,那会很有帮助 . 否则,PDO是一个很好的面向对象,灵活的数据库连接器 .


    *注意mysql扩展名is now deprecated and will be removed sometime in the future . 那's because it is ancient, full of bad practices and lacks some modern features. Don't用它来编写新代码 .

  • 4

    PDO 是"PHP Data Object."我主要使用PDO,所以我只能说它的优点:

    • 适用于比MySQL更多的数据库(对您来说无关紧要)

    • 编译C,所以它更快(据说)

    • 准备好的陈述(其他人也有这些陈述)

    • SO似乎喜欢它,所以你至少可以在这里获得很多帮助

    • 您可以动态设置和更改各种提取/错误处理模式

    你问

    那么PDO,预处理语句和MySQLi之间有什么区别......

    PDOMySQLi 是数据库包装器 . "Prepared statements"完全是一个不同的概念 . 您可以准备一个可以多次执行的查询,并且正确参数化的语句是SQL-Injection安全的(尽管可能不是证明) . 后一个原因是您应该使用PDO(或MySQLi)的大部分原因,但是准备好的语句也为查询带来了一定程度的清晰度 .

    /* mysql_* version */
    mysql_connect("host");
    $query = "SELECT column FROM db1.t1 WHERE id = ";
    foreach ($_GET['id'] as $id) {
       $id = mysql_real_escape_string($id);
       $result = mysql_query($query . "'$id'";
       while ($row = mysql_fetch_assoc($result)) {
          echo "$row[column]\n";
       }
    }
    //NOTE: it would probably be better to store the resource returned by
    //mysql_connect and use that consistently (in query/escape)
    
    /* PDO version */
    $pdo = new PDO('mysql:host=HOST', 'user', 'pass');
    $query = $pdo->prepare("SELECT column FROM db1.t1 WHERE id = ?";
    foreach ($_GET['id'] as $id) {
       $query->execute($id);
       echo $query->fetch(PDO::FETCH_COLUMN);
    }
    //Notice that you skip the escape step.
    

    你可以用 MySQLi 做同样的事情,但我更喜欢 PDO 's syntax. It may be faster too, but I could be making that up. There'也是很少被人提到的PEAR MDB2 ,我相信还有更多 . 自 PDO 内置以来,我会选择它 .

  • -2

    如果您已经习惯了 mysql_xxx 函数,那么我将首先转到 MySQLi 扩展名 .

    如果您愿意,可以使用PDO,但如果您需要开始支持多个数据库,那么在第一个实例中这只是值得的 . 为了您的目的,我建议切换到MySQLi,因为它对您来说更容易,并且您无论如何都不会立即获得PDO的好处 .

    MySQLi提供的函数非常类似于 mysql_xx 函数,您通常可以使用现有代码,在它们之间进行直接交换,代码应该继续正常工作 .

    所以这是一个很好的起点 - 使用 mysqli_xxx 而不是mysql_xxx`来获取代码 .

    如果可能的话,我建议使用面向对象的语法而不是程序语法 . MySQLi支持这两种,并且过程语法将更接近您习惯使用的内容,但从长远来看,OO语法更灵活,并且一旦您习惯它就没有那么多不同 .

    一旦你的代码转换为使用MySQLi库,您对基础知识感到满意,您已准备好开始使用更高级的功能,如预处理语句 . 但首先要让自己熟悉基础知识 .

  • 1

    来自与你相同的观点 . 从我的角度来看,我不认为差异是真正明显的(取决于你使用它的是什么) . 看起来PDO只是一个数据库api,它将所有其他数据库api合并为一个 . 因此,如果您需要连接到MS Sql服务器和MySQL服务器,您可以简单地调用PDO api并指定特定数据库的驱动程序 . 我的猜测是MySQL中的任何未来特性和功能都只能在PDO中使用 . 因此,基本上只需使用PDO即可确保您可以访问所有最新功能 .

  • 16

    PDO的一大优势是平台独立性 . 这意味着您可以在某个时刻迁移到不同的DBMS,而无需重新编码所有函数调用 . 这通常是通过Java(通过JDBC),. Net(ADO)和大多数其他环境完成的 . 优点不仅在于您可以自行切换DBMS,而且您只需要学习一个API .

    关于您的问题,PDO层提供了准备语句的工具 . 准备好的语句背后的想法是为SQL语句的部分创建占位符,这些部分在运行时才会知道 . 许多学习者从创建SQL作为字符串开始,通过调用mysqli :: query($ someQuery)来执行 . 出于多种原因,这是有问题的,其中最突出的是SQL注入的漏洞(有关类似的问题和答案,请参阅stackoverflow.com/questions/5315351) . 使用PDO,您可以避免SQL注入以及处理诸如引号,反斜杠等字符的所有问题 . 最终结果是您的代码更安全,可读和可预测 .

    如果你已经知道如何使用mysqli,那么使用PDO并没有太大的不同 . 上面链接的问题和答案显示了使用PDO准备语句提交的查询示例,该语句应作为有用的指南 .

  • 38

    那么PDO,预处理语句和MySQLi之间的区别是,它们是完成相同任务的不同功能吗?

    差异很简单 .
    PDO is usableprepared statements 和mysqli是 not .

    只需使用本机预处理语句使用两个API运行一些常见查询,您就会清楚地看到差异 .

相关问题