PHP PDO和MySQLi

我刚刚在PHP中完成了一个介绍课程,并且在整个stackoverflow论坛上,人们都build议我切换到PDO,准备好语句或MYSQLi,我简要地检查了一下手册,但是大部分内容都在我的头上。

我一直在使用mysql_ *函数,所以这些概念对我来说是新的。 我认为他们是用来访问和执行数据库的具体行动,但我不知道。

那么PDO,准备好的语句和MySQLi之间有什么区别,它们是完成相同任务的不同function呢? 它们在脚本中是兼容的还是“select其中一个”? 最后哪个提供了最好的性能?

更新:感谢您的答案,我会寻找更多的PDO教程。

作为参考,我还发现以下职位有用:

哪一个是快速和轻 – mysqli或PDO

mysqli或PDO – 有什么优点和缺点?

在基本层面上,mysql,mysqli和PDO扩展都回答了我如何与数据库交谈的问题 它们都提供了连接到数据库并从中发送和检索数据的function和function。 您可以同时使用它们,同时build立与数据库的多个连接,但这通常是无稽之谈。

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

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


*请注意,mysql扩展现在弃用 ,将来会被删除 。 那是因为它是古老的,充满了坏习惯,缺乏一些现代特征。 不要用它来编写新的代码。

PDO是“PHP数据对象”。 我主要使用PDO,所以我只能谈论它的优点:

  • 适用于更多的数据库而不仅仅是MySQL(可能对你无关紧要)
  • 编译C,所以它更快(据说)
  • 准备好的陈述(其他人有这些,虽然)
  • SO似乎喜欢它,所以你至less可以在这里得到很多的帮助
  • 您可以随时设置和更改各种读取/error handling模式

你问

那么PDO,准备好的语句和MySQLi之间有什么区别?

PDOMySQLi是DB包装器。 “准备好的陈述”是完全不同的概念。 您可以准备一个可以多次执行的查询,并且正确的参数化语句是SQL注入安全的(虽然也许不能certificate)。 后一个原因是你应该使用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的语法。 这可能会更快,但我可以做到这一点。 PEAR MDB2也很罕见,我相信还有更多。 由于PDO是内置的,我会去用它。

如果您习惯了mysql_xxx函数,那么我将首先转向MySQLi扩展。

如果你愿意的话,可以使用PDO,但是如果你需要开始支持多个数据库的话,这只会在第一个例子中真正值得。 出于您的目的,我build议切换到MySQLi,因为它会更容易,你不会立即得到PDO的好处。

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

所以这是一个很好的开始 – 使用mysqli_xxx而不是mysqli_xxx来获取你的代码。

如果可能的话,我build议使用面向对象的语法而不是程序语法。 MySQLi支持这两种语法,程序语法将更接近您习惯的语法,但是从长远来看,OO语法更加灵活,而且一旦习惯了它,情况就没有那么大了。

一旦将代码转换为使用MySQLi库,并且熟悉基本知识,就可以开始使用更高级的function,例如预准备语句。 但先让自己感觉舒适。

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

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

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

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

那么PDO,准备好的语句和MySQLi之间有什么区别,它们是完成相同任务的不同function?

差异很简单。
PDO可用于 预处理语句,而mysqli 则不 可用

只需使用本地准备的语句,使用这两个API运行一些常见的查询,您将清楚地看到差异。