这个问题在这里已有答案:
我刚刚完成了PHP的入门课程,并且在整个stackoverflow论坛中,人们建议我切换到PDO,准备好的语句或MYSQLi,我简要地检查了手册,但大部分都是我的头脑 .
到目前为止我一直在使用mysql_ *函数,所以这些概念对我来说都是新的 . 我认为他们习惯于访问和执行特定于数据库的操作,但我不确定 .
那么PDO,预处理语句和MySQLi之间的区别是,它们是完成相同任务的不同功能吗?它们是在脚本中兼容还是“选择其中一种”?最后哪个提供最佳性能?
更新:感谢您的回答,我将寻找更多的PDO教程 .
作为参考,我还发现以下帖子很有用:
6 回答
在基本级别,mysql,mysqli和PDO扩展都回答了如何与数据库通信的问题?它们都提供连接数据库并从中发送和检索数据的功能和功能 . 您可以同时使用它们,同时 Build 与数据库的多个连接,但这通常是无稽之谈 .
mysql *是一个非常简单的扩展,基本上允许你连接到数据库,发送它的SQL查询,而不是其他 .
mysqli通过添加参数化查询和其他一些东西来改进这个(顾名思义) .
PDO是一个扩展,它将几个数据库驱动程序抽象到一个包中,即它允许您使用相同的代码连接到MySQL,Oracle,MS SQL Server和许多其他数据库,而无需使用特定于数据库的扩展或重写代码时你切换数据库(理论上至少) . 它还支持参数化查询 .
如果你知道你将独家使用MySQL,那么mysqli是一个不错的选择 . 特别是因为你可以以程序的方式使用它,你已经习惯了mysql扩展 . 如果您不熟悉OOP,那会很有帮助 . 否则,PDO是一个很好的面向对象,灵活的数据库连接器 .
*注意mysql扩展名is now deprecated and will be removed sometime in the future . 那's because it is ancient, full of bad practices and lacks some modern features. Don't用它来编写新代码 .
PDO
是"PHP Data Object."我主要使用PDO,所以我只能说它的优点:适用于比MySQL更多的数据库(对您来说无关紧要)
编译C,所以它更快(据说)
准备好的陈述(其他人也有这些陈述)
SO似乎喜欢它,所以你至少可以在这里获得很多帮助
您可以动态设置和更改各种提取/错误处理模式
你问
PDO
和MySQLi
是数据库包装器 . "Prepared statements"完全是一个不同的概念 . 您可以准备一个可以多次执行的查询,并且正确参数化的语句是SQL-Injection安全的(尽管可能不是证明) . 后一个原因是您应该使用PDO(或MySQLi)的大部分原因,但是准备好的语句也为查询带来了一定程度的清晰度 .你可以用
MySQLi
做同样的事情,但我更喜欢PDO
's syntax. It may be faster too, but I could be making that up. There'也是很少被人提到的PEARMDB2
,我相信还有更多 . 自PDO
内置以来,我会选择它 .如果您已经习惯了
mysql_xxx
函数,那么我将首先转到MySQLi
扩展名 .如果您愿意,可以使用PDO,但如果您需要开始支持多个数据库,那么在第一个实例中这只是值得的 . 为了您的目的,我建议切换到MySQLi,因为它对您来说更容易,并且您无论如何都不会立即获得PDO的好处 .
MySQLi提供的函数非常类似于
mysql_xx
函数,您通常可以使用现有代码,在它们之间进行直接交换,代码应该继续正常工作 .所以这是一个很好的起点 - 使用
mysqli_xxx
而不是mysql_xxx`来获取代码 .如果可能的话,我建议使用面向对象的语法而不是程序语法 . MySQLi支持这两种,并且过程语法将更接近您习惯使用的内容,但从长远来看,OO语法更灵活,并且一旦您习惯它就没有那么多不同 .
一旦你的代码转换为使用MySQLi库,您对基础知识感到满意,您已准备好开始使用更高级的功能,如预处理语句 . 但首先要让自己熟悉基础知识 .
来自与你相同的观点 . 从我的角度来看,我不认为差异是真正明显的(取决于你使用它的是什么) . 看起来PDO只是一个数据库api,它将所有其他数据库api合并为一个 . 因此,如果您需要连接到MS Sql服务器和MySQL服务器,您可以简单地调用PDO api并指定特定数据库的驱动程序 . 我的猜测是MySQL中的任何未来特性和功能都只能在PDO中使用 . 因此,基本上只需使用PDO即可确保您可以访问所有最新功能 .
PDO的一大优势是平台独立性 . 这意味着您可以在某个时刻迁移到不同的DBMS,而无需重新编码所有函数调用 . 这通常是通过Java(通过JDBC),. Net(ADO)和大多数其他环境完成的 . 优点不仅在于您可以自行切换DBMS,而且您只需要学习一个API .
关于您的问题,PDO层提供了准备语句的工具 . 准备好的语句背后的想法是为SQL语句的部分创建占位符,这些部分在运行时才会知道 . 许多学习者从创建SQL作为字符串开始,通过调用mysqli :: query($ someQuery)来执行 . 出于多种原因,这是有问题的,其中最突出的是SQL注入的漏洞(有关类似的问题和答案,请参阅stackoverflow.com/questions/5315351) . 使用PDO,您可以避免SQL注入以及处理诸如引号,反斜杠等字符的所有问题 . 最终结果是您的代码更安全,可读和可预测 .
如果你已经知道如何使用mysqli,那么使用PDO并没有太大的不同 . 上面链接的问题和答案显示了使用PDO准备语句提交的查询示例,该语句应作为有用的指南 .
差异很简单 .
PDO is usable 与 prepared statements 和mysqli是 not .
只需使用本机预处理语句使用两个API运行一些常见查询,您就会清楚地看到差异 .