尝试学习新的东西 - 特别是在使用MySQL时选择使用MySQLi或PDO作为未来的项目 - 我偶然发现了this page,其中显示了可用选项的概述对我来说。
本页底部是一个表格,比较了与mysql通信的三种主要方法的功能。在行" API支持客户端准备语句",它表示PDO支持这一点而MySQLi不支持。
我知道准备好的陈述是什么。 this question的答案是我认为是服务器端预处理语句的简单示例。 PHP是一种服务器端语言,反过来应该意味着如果客户端准备好的语句可用,那么它并不重要。但这让我想知道为什么甚至会在PHP手册中列出。
那么什么是客户端准备好的陈述?
答案 0 :(得分:28)
显然,客户端准备好的语句是由客户端而不是服务器准备的语句。
PDO是一个数据访问抽象层,支持多个DBMS接口(驱动程序),其中一些支持服务器端预处理语句(例如:MySQL 4.1+),其中一些不支持(例如:MySQL 3)。
如果PDO驱动程序不支持服务器端预处理语句,PDO将在客户端模拟它们并使用通用查询接口来执行它们。
MySQLi不支持它们的原因很简单:MySQLi是一个特定于MySQL的扩展,一个确实支持服务器端预处理语句的RDBMS,因此没有理由模仿它们。
答案 1 :(得分:13)
就像评论中所说,在这种情况下"客户"是指PHP和"服务器"到MySQL。 PDO支持MySQL以外的数据库。并非所有这些数据库/ db驱动程序本身都支持预处理语句,在这些情况下,PDO将自己模拟这些语句。 MySQLi不会(我不确定何时必须这样做 - 也许当它处理旧的MySQL驱动程序时?)。
您可能需要考虑的另一个因素 - 某些PHP框架需要PDO并且不支持mysqli。
答案 2 :(得分:2)
使用PDO,您可以使用预准备语句(在代码中),无论您使用PDO连接的数据库是否支持它们。
如果服务器处理预准备语句,则PDO将让服务器处理它们(服务器端)。如果没有,那么PDO只是在PDO(客户端)内模拟准备好的语句,但最终必须将每个查询发送到服务器。