phppdo和MySQLi
我刚刚完成了一门PHP入门课程,在stackoverflow论坛上,人们建议我改用PDO、prepared statements或MYSQLi,我简单地查看了一下手册,但大部分内容都超出了我的理解范围 到目前为止,我一直在使用mysql_*函数,所以这些概念对我来说都是新概念。我认为它们用于访问和执行特定于数据库的操作,但我不确定 那么PDO、prepared语句和MySQLi之间的区别是什么呢?它们是完成同一任务的不同功能吗?它们在脚本中是兼容的还是“选择一个或另一个”?最后,哪一个性能最好 更新:谢谢你的回答,我将寻找更多的PDO教程 作为参考,我还发现以下帖子很有用:phppdo和MySQLi,php,mysql,pdo,mysqli,Php,Mysql,Pdo,Mysqli,我刚刚完成了一门PHP入门课程,在stackoverflow论坛上,人们建议我改用PDO、prepared statements或MYSQLi,我简单地查看了一下手册,但大部分内容都超出了我的理解范围 到目前为止,我一直在使用mysql_*函数,所以这些概念对我来说都是新概念。我认为它们用于访问和执行特定于数据库的操作,但我不确定 那么PDO、prepared语句和MySQLi之间的区别是什么呢?它们是完成同一任务的不同功能吗?它们在脚本中是兼容的还是“选择一个或另一个”?最后,哪一个性能最好
与您的观点相同。从我的角度来看,我不认为这种差异是真正明显的(取决于你使用它的目的)。看起来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
和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
的语法。它可能更快,但我可以弥补这一点。还有PEARMDB2
很少被提及,我相信还有更多。由于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背后的理念