Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
phppdo和MySQLi_Php_Mysql_Pdo_Mysqli - Fatal编程技术网

phppdo和MySQLi

phppdo和MySQLi,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我刚刚完成了一门PHP入门课程,在stackoverflow论坛上,人们建议我改用PDO、prepared statements或MYSQLi,我简单地查看了一下手册,但大部分内容都超出了我的理解范围 到目前为止,我一直在使用mysql_*函数,所以这些概念对我来说都是新概念。我认为它们用于访问和执行特定于数据库的操作,但我不确定 那么PDO、prepared语句和MySQLi之间的区别是什么呢?它们是完成同一任务的不同功能吗?它们在脚本中是兼容的还是“选择一个或另一个”?最后,哪一个性能最好

我刚刚完成了一门PHP入门课程,在stackoverflow论坛上,人们建议我改用PDO、prepared statements或MYSQLi,我简单地查看了一下手册,但大部分内容都超出了我的理解范围

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

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

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

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


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

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

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

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


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

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

  • 适用于比MySQL更多的数据库(可能对您并不重要)
  • 编译C,因此速度更快(据推测)
  • 准备好的陈述(但其他人有这些)
  • 看来你很喜欢,所以你至少可以在这里得到很多帮助
  • 您可以动态设置和更改各种获取/错误处理模式
你问

那么PDO、prepared语句和MySQLi之间的区别是什么呢

PDO
MySQLi
是数据库包装器。“准备好的声明”是一个完全不同的概念。您可以准备一个可以多次执行的查询,并且正确参数化的语句是SQL注入安全的(尽管可能不是证据)。后一个原因是您应该使用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\u xxx
函数,那么我会先转到
MySQLi
扩展

如果愿意的话,可以使用PDO,但是只有在需要开始支持多个数据库的情况下,这才是真正值得的。出于您的目的,我建议您切换到MySQLi,因为这对您来说更容易,而且您也不会马上得到PDO的好处

MySQLi提供的函数与您习惯使用的
mysql\u xx
函数非常相似;通常可以使用现有代码,在它们之间进行直接交换,代码应该可以继续正常工作

因此,这是一个很好的开始——使用
mysqli\u xxx
而不是mysql\u xxx`获取代码

如果可能的话,我建议使用面向对象的语法而不是过程语法。MySQLi同时支持这两种语法,并且过程语法将更接近您所习惯的语法,但是从长远来看,OO语法更灵活,并且一旦您习惯了,就不会有太大的不同


一旦您将代码转换为使用MySQLi库,并且熟悉了基础知识,就可以开始使用更高级的功能,如prepared语句。但首先要熟悉基本知识。

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

关于你的问题,PDO层提供了做准备语句的工具。prepare背后的理念