PHP PDO和MySQLi

gra*_*per 37 php mysql mysqli pdo

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

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

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

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

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

哪一个快速而轻巧 - mysqli或PDO

mysqli或PDO - 有什么优缺点?

dec*_*eze 39

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

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

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


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

  • @YourCommonSense我认为你已经失去了你的.特别是因为您在图书馆中使用mysqli,所以到处都是广告. (3认同)
  • @YourCommonSense - 你能解释一下你必须调用`call_user_func()`的情况吗?你为什么不使用`$ stmt-> bind_param()`,这离PDO` $ sth-> bindParam()`不是很远?当然,这并不是在任何地方进行投票的理由. (3认同)
  • 不,不。如果数组中有值,则必须先引用每个变量,然后才能使用bind_param。因此,不能将循环与bind_params一起使用。请参阅此示例,例如http://stackoverflow.com/q/16120822/285587。如果没有get_result()可用,您同样会获得取回值(!)的乐趣。当然这仍然可行。但是我宁愿称其为“痛苦”而不是“可用性” (2认同)

Exp*_*lls 16

PDO是"PHP数据对象".我主要使用PDO,所以我只能说它的优点:

  • 适用于比MySQL更多的数据库(对您来说无关紧要)
  • 编译C,所以它更快(据说)
  • 准备好的陈述(其他人也有这些陈述)
  • 所以似乎喜欢它,所以你至少可以在这里获得很多帮助
  • 您可以动态设置和更改各种提取/错误处理模式

你问

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

PDO并且MySQLi是DB包装器."准备好的陈述"完全是一个不同的概念.您可以准备一个可以多次执行的查询,并且正确参数化的语句是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.
Run Code Online (Sandbox Code Playgroud)

你可以用基本相同的MySQLi,但我更喜欢PDO的语法.它也可能更快,但我可以做到这一点.PEAR MDB2也很少被人提及,我相信还有更多.既然PDO是内置的,我会配合它.

  • 该消息来源表明MySQL和MySQLi的速度要快一些:http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 (2认同)