PHP PDO 和 MySQLi

2022-08-30 12:55:55

我刚刚完成了PHP的入门课程,在整个stackoverflow论坛中,人们建议我切换到PDO,预准备语句或MYSQLi,我简要地检查了手册,但其中大部分都超出了我的脑海。

到目前为止,我一直在使用mysql_*函数,因此这些概念对我来说是新的。我认为它们用于访问和执行数据库特定的操作,但我不确定。

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

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

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

哪一个是快速和轻量级的 - mysqli或PDO

mysqli或PDO - 有哪些优点和缺点?


答案 1

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

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

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


*请注意,mysql扩展现在已被弃用,并将在将来的某个时候被删除。那是因为它很古老,充满了不良做法,缺乏一些现代特征。不要用它来编写新代码。


答案 2

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

  • 适用于更多的数据库,而不仅仅是MySQL(对你来说可能无关紧要)
  • 编译C,所以它更快(据说)
  • 预准备的语句(尽管其他人有这些)
  • SO似乎喜欢它,所以你至少可以在这里得到很多帮助
  • 您可以动态设置和更改的各种提取/错误处理模式

你问

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

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

你可以用 做基本上相同的事情,但我更喜欢 的语法。它可能也更快,但我可能正在弥补这一点。还有很少被提及的PEAR,我相信还有更多。由于是内置的,我会去的。MySQLiPDOMDB2PDO


推荐