文本:“PDO 不允许您使用 MySQL 对多个语句的支持”已过时。
自 v5.3 以来,PHP 在 PDO 中引入了多个语句支持(通过 PDO_MYSQLND 驱动程序替换以前的 PDO_MYSQL)。
本节介绍开发需要与 MySQL 数据库交互的 PHP 应用程序时可用的选项。
什么是 API?
应用程序编程接口 (API) 定义了您的应用程序需要调用的类、方法、函数和变量,以执行其所需的任務。对于需要与数据库通信的 PHP 应用程序,必要的 API 通常通过 PHP 扩展公开。
API 可以是过程式的或面向对象的。使用过程式 API,您调用函数来执行任务,而使用面向对象 API,您实例化类,然后在结果对象上调用方法。在这两者中,后者通常是首选接口,因为它更现代,并且会导致更好的代码组织。
在编写需要连接到 MySQL 服务器的 PHP 应用程序时,可以使用多种 API 选项。本文档将讨论可用的选项以及如何为您的应用程序选择最佳解决方案。
什么是连接器?
在 MySQL 文档中,术语“连接器”指的是允许您的应用程序连接到 MySQL 数据库服务器的软件。MySQL 为各种语言提供连接器,包括 PHP。
如果您的 PHP 应用程序需要与数据库服务器通信,您将需要编写 PHP 代码来执行连接到数据库服务器、查询数据库和其他与数据库相关的函数等活动。需要软件来提供您的 PHP 应用程序将使用的 API,以及处理您的应用程序和数据库服务器之间的通信,可能使用其他必要的中间库。这种软件通常被称为连接器,因为它允许您的应用程序“连接”到数据库服务器。
什么是驱动程序?
驱动程序是专为与特定类型的数据库服务器通信而设计的软件。驱动程序还可以调用库,例如 MySQL 客户端库或 MySQL 本机驱动程序。这些库实现了用于与 MySQL 数据库服务器通信的低级协议。
例如,PHP 数据对象 (PDO) 数据库抽象层可以使用多种数据库特定驱动程序中的一个。它提供的一个驱动程序是 PDO MYSQL 驱动程序,它允许它与 MySQL 服务器进行交互。
有时人们互换使用连接器和驱动程序这两个术语,这可能会令人困惑。在与 MySQL 相关的文档中,术语“驱动程序”保留用于提供连接器包的数据库特定部分的软件。
什么是扩展?
在 PHP 文档中,您会遇到另一个术语 - “扩展”。PHP 代码包含一个核心,以及对核心功能的可选扩展。PHP 的与 MySQL 相关的扩展(如 mysqli 扩展)和 PDO MySQL 驱动程序扩展使用 PHP 扩展框架实现。
扩展通常为 PHP 程序员公开 API,以允许以编程方式使用其功能。但是,一些使用 PHP 扩展框架的扩展不会向 PHP 程序员公开 API。
例如,PDO MySQL 驱动程序扩展不会向 PHP 程序员公开 API,但它为其上方的 PDO 层提供了一个接口。
术语 API 和扩展不应该被视为同一个意思,因为扩展不一定向程序员公开 API。
使用 MySQL 的主要 PHP API 产品有哪些?
考虑连接到 MySQL 数据库服务器时,有两个主要的 API 选项
PHP 的 mysqli 扩展
PHP 数据对象 (PDO)
每个都有其自身的优点和缺点。以下讨论旨在简要介绍每个 API 的关键方面。
什么是 PHP 的 mysqli 扩展?
mysqli
扩展(有时也称为 MySQL “改进”扩展)是为利用 MySQL 系统版本 4.1.3 及更高版本中的新功能而开发的。mysqli
扩展包含在 PHP 版本 5 及更高版本中。
mysqli
扩展有很多优点,与 mysql
扩展相比,主要增强功能包括
面向对象接口
支持预处理语句
支持多个语句
支持事务
增强的调试功能
除了面向对象接口之外,该扩展还提供过程式接口。
mysqli
扩展使用 PHP 扩展框架构建,其源代码位于目录 ext/mysqli 中。
有关 mysqli
扩展的更多信息,请参见 MySQLi。
什么是 PDO?
PHP 数据对象 (PDO) 是专门针对 PHP 应用程序的数据库抽象层。PDO 为您的 PHP 应用程序提供了一个一致的 API,无论您的应用程序将连接到哪种类型的数据库服务器。理论上,如果您使用 PDO API,您可以切换您使用的数据库服务器,例如从 Firebird 切换到 MySQL,并且只需要对您的 PHP 代码进行少量更改。
其他数据库抽象层示例包括适用于 Java 应用程序的 JDBC 和适用于 Perl 的 DBI。
虽然 PDO 具有其优点,例如简洁、简单、可移植的 API,但其主要缺点是它不允许您使用最新版本的 MySQL 服务器中提供的所有高级功能。例如,PDO 不允许您使用 MySQL 对多个语句的支持。
PDO 使用 PHP 扩展框架实现,其源代码位于目录 ext/pdo 中。
有关 PDO 的更多信息,请参见 PDO。
什么是 PDO MYSQL 驱动程序?
PDO MYSQL 驱动程序本身不是 API,至少从 PHP 程序员的角度来看是这样。实际上,PDO MYSQL 驱动程序位于 PDO 本身下方的层中,并提供特定于 MySQL 的功能。程序员仍然调用 PDO API,但 PDO 使用 PDO MYSQL 驱动程序与 MySQL 服务器进行通信。
PDO MYSQL 驱动程序是几个可用的 PDO 驱动程序之一。其他可用的 PDO 驱动程序包括适用于 Firebird 和 PostgreSQL 数据库服务器的驱动程序。
PDO MYSQL 驱动程序使用 PHP 扩展框架实现。其源代码位于目录 ext/pdo_mysql 中。它不会向 PHP 程序员公开 API。
有关 PDO MYSQL 驱动程序的更多信息,请参见 MySQL (PDO)。
什么是 PHP 的 MySQL 本机驱动程序?
为了与 MySQL 数据库服务器通信,mysqli
和 PDO MYSQL 驱动程序都使用一个实现所需协议的低级库。过去,唯一可用的库是 MySQL 客户端库,也称为 libmysqlclient
。
但是,libmysqlclient
提供的接口并没有针对与 PHP 应用程序的通信进行优化,因为 libmysqlclient
最初是为 C 应用程序而设计的。因此,MySQL 本机驱动程序 mysqlnd
被开发为 PHP 应用程序中 libmysqlclient
的替代方案。
mysqli
扩展和 PDO MySQL 驱动程序都可以单独配置为使用 libmysqlclient
或 mysqlnd
。由于 mysqlnd
是专门为在 PHP 系统中使用而设计的,因此它在内存和速度方面比 libmysqlclient
具有许多增强功能。强烈建议您利用这些改进。
MySQL 本机驱动程序使用 PHP 扩展框架实现。源代码位于 ext/mysqlnd 中。它不会向 PHP 程序员公开 API。
功能比较
下表比较了从 PHP 连接到 MySQL 的主要方法的功能。
PHP 的 mysqli 扩展 | PDO(使用 PDO MySQL 驱动程序和 MySQL 本机驱动程序) | |
---|---|---|
PHP 版本引入 | 5.0 | 5.0 |
MySQL 开发状态 | 积极开发 | 积极开发 |
API 支持字符集 | 是 | 是 |
API 支持服务器端预处理语句 | 是 | 是 |
API 支持客户端端预处理语句 | 否 | 是 |
API 支持存储过程 | 是 | 是 |
API 支持多个语句 | 是 | 大多数 |
支持所有 MySQL 4.1+ 功能 | 是 | 大多数 |
文本:“PDO 不允许您使用 MySQL 对多个语句的支持”已过时。
自 v5.3 以来,PHP 在 PDO 中引入了多个语句支持(通过 PDO_MYSQLND 驱动程序替换以前的 PDO_MYSQL)。
在某些情况下,mysqli 非常有用,但 PHP 可移植数据对象 (PDO) 投入了大量精力,在选择使用 php 连接数据库的方式时也应考虑使用 PDO。例如,PDO 支持 MySQL,性能损失最小,您为它编写的代码可以支持许多其他数据库,几乎不需要进行任何更改。也就是说,即使您必须更改大量代码才能使用另一个数据库,数据库连接代码也比实际的数据库数据输入和报表应用程序的代码要少得多。几年前,当我开始创建 PHP/MySQL 应用程序时,我使用了 php 本地对 PHP 的支持,然后迁移到 PEAR:DB 和 MDB/MDB2,最后迁移到 wizzyweb,它基本上类似于“应用程序的 phpMyAdmin”,因为它会自动生成 PHP PDO 连接代码和应用程序代码。当然,我可以从头开始编写所有代码,但我节省了大约 90% 的时间。关键是查看使用本地代码与抽象层可以节省的总时间。大多数人发现程序员时间是方程式中最有价值的部分,因此任何可以节省程序员时间的措施都应该得到高度重视。