php中的Mysqlnd、PDO和PDO_Mysql扩展有啥区别?
Posted
技术标签:
【中文标题】php中的Mysqlnd、PDO和PDO_Mysql扩展有啥区别?【英文标题】:What is the difference between Mysqlnd, PDO and PDO_Mysql extensions in php?php中的Mysqlnd、PDO和PDO_Mysql扩展有什么区别? 【发布时间】:2017-06-08 08:02:08 【问题描述】:它们看起来是一样的,但又是不同的。我不知道哪个是哪个:我知道我们可以使用 PDO 作为new PDO()
并使用prepare()
和query()
方法从数据库中获取数据。那么,如果这是扩展列表中提到的PDO
,那么 pdo_mysql 和 mysqlnd 究竟是什么(通俗地说)是什么?
【问题讨论】:
另见:php.net/manual/en/mysqlinfo.api.choosing.php 和 php.net/manual/en/mysqlinfo.library.choosing.php 其实我已经看过了,只是我还是无法在他们三个之间建立联系(不是双关语) 我认为(如果我错了,我相信有人会纠正我)mysqlnd 是将PHP 连接到mysql 的实际驱动程序。 PDO和mysqli是通过mysqlnd向mysql服务器发送数据的API。 在 PHP 中使用 PDO 需要 PDO 驱动程序,这就是pdo_mysql
。由于我们要使用 PDO 连接到一个 mysql db,我们还需要 mysql 驱动程序,这就是 mysqlnd
是什么。
听起来您可能不知道 PDO 可以用于许多不同的数据库,而不仅仅是 MySQL。您必须为要与 PDO 一起使用的每种数据库类型启用特定扩展(例如,用于 MySQL 的 pdo_mysql)。
【参考方案1】:
PDO 本身是 PHP 提供的database abstraction layer。这可能并不完全符合您的想法,但 PHP 在 the PDO documentation 中澄清了这一点:
PDO 提供了一个数据访问抽象层,这意味着,无论您使用哪个数据库,您都可以使用相同的函数来发出查询和获取数据。 PDO 不提供数据库抽象;它不会重写 SQL 或模拟缺失的功能。如果您需要该功能,您应该使用成熟的抽象层。
根据您的系统,you might need to enable its driver 才能使用它。 (但可能不会。)
您可以将 PDO 与各种不同的数据库(MySQL、Oracle、PostgreSQL 等)一起使用,但您需要enable the specific driver 来选择您想要使用的数据库类型。从我之前链接的同一个 PDO 介绍文档中:
请注意,您不能单独使用 PDO 扩展执行任何数据库功能;您必须使用特定于数据库的 PDO 驱动程序来访问数据库服务器。
pdo_mysql 就是其中之一。这些驱动程序实现 PDO 接口,这意味着它们允许您使用 prepare()
、query()
等。与您的特定数据库。
mysqlnd
处理 PHP 和 MySQL 之间的通信。自 PHP 5.4 以来,它一直是所有 MySQL 扩展(如 pdo_mysql
)的默认驱动程序,因此,如果您使用的是受支持的 PHP 版本,那么您可能正在使用它。但它在幕后工作,只是处理通信。您不会使用任何mysqlnd
函数。来自the mysqlnd
documentation 的“它不是什么”部分:
虽然 MySQL Native Driver 是作为 PHP 扩展编写的,但需要注意的是,它并没有为 PHP 程序员提供新的 API。 MySQL 数据库连接的程序员 API 由 MySQL 扩展、mysqli 和 PDO MYSQL 提供。这些扩展现在可以使用 MySQL Native Driver 的服务与 MySQL 服务器进行通信。因此,您不应将 MySQL Native Driver 视为 API。
【讨论】:
【参考方案2】:您需要 PDO_Mysql 才能使用带有 PDO 的 mysql 数据库。是司机。
Mysqld 是 Mysql 服务器,您可以使用 PDO 或 mysqli 访问它。
Mysqlnd 是与 Mysql 服务器通信的库/驱动程序,PDO 和 mysqli 都使用它。
【讨论】:
如果你要回答这个问题,那就做对吧。显示来自官方文档的引用。此外,OP 询问mysqlnd
- 而不是 mysqld
。到目前为止,您所说的充其量只是微不足道的,可能只是评论。以上是关于php中的Mysqlnd、PDO和PDO_Mysql扩展有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章