The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).
Раздел описывает инструменты, которые помогают программистам разрабатывать PHP-приложения, которые взаимодействуют с базой данных MySQL.
Об API-интерфейсе
Программный интерфейс приложения (англ. Application Programming Interface, API) определяет набор классов, методов, функций и переменных, к которым приложению потребуется обращаться, чтобы выполнить поставленные задачи. PHP-приложения взаимодействуют с базами данных через API-интерфейсы, которые приложениям обычно открывают PHP-модули.
Программисты взаимодействуют с модулями через процедурный или объектно-ориентированный API-интерфейс. При работе через процедурный API задачи выполняют путём вызова функций, при взаимодействии через объектно-ориентированный API-интерфейс создают экземпляры классов, а затем вызывают методы этих объектов. Из этих двух интерфейсов часто выбирают последний, поскольку код в объектно-ориентированном стиле лучше организован, что снижает сложность восприятия кода и упрощает тестирование и поддержку.
Язык программирования PHP предлагает разработчикам несколько API-интерфейсов, через которые PHP-приложения взаимодействуют с базами данных MySQL. Документ описывает эти интерфейсы и даёт рекомендации по выбору конкретного способа подключения к базе данных из приложения.
О коннекторе
В MySQL-документации термин коннектор (англ. connector) относится к части программного обеспечения, которая разрешает приложению подключаться к серверу баз данных MySQL. БД MySQL предоставляет коннекторы для разных языков программирования, включая язык PHP.
Разработчику потребуется написать PHP-код, чтобы PHP-приложение научилось взаимодействовать с сервером баз данных: подключаться, отправлять запросы и выполнять другие операции, которые связаны с базой данных. Серверу баз данных потребуется ПО, чтобы предоставить API-интерфейс, через который PHP-приложение будет взаимодействовать с сервером, и чтобы управлять обменом информацией между приложением и сервером баз данных, для чего иногда также требуются промежуточные библиотеки. Это программное обеспечение называется коннектором, поскольку разрешает приложению подключаться (англ. to connect) к серверу баз данных.
О драйвере
Драйвер — часть программного обеспечения, которую разработали для взаимодействия приложения с конкретным типом сервера баз данных. Приложение вызывает методы коннектора, тот обращается к своему драйверу конкретной СУБД, а драйвер со своей стороны обращается к нижележащим библиотекам — клиентской библиотеке MySQL Client Library или встроенному драйверу MySQL Native Driver. Эти библиотеки реализуют низкоуровневый протокол взаимодействия с MySQL-сервером баз данных.
Например, PHP-модуль PDO, который поддерживает доступ к базам данных на уровне абстракции, содержит набор драйверов для доступа к конкретным базам данных. В список доступных модулю драйверов входит драйвер PDO_MYSQL, который разрешает модулю PDO взаимодействовать с сервером MySQL.
Термины «коннектор» и «драйвер» иногда употребляют как синонимы,
это сбивает с толку. В MySQL-документации термин драйвер
зарезервировали за программным обеспечением, которое предоставляет
часть пакета коннектора для конкретной базы данных.
О модуле
В PHP-документации встречается ещё один термин — модуль.
Код самого PHP состоит из ядра и дополнительных модулей, которые расширяют
функциональность ядра. Для работы с СУБД MySQL ядро PHP расширили модулем
mysqli
и модулем PDO с MySQL-драйвером. Оба модуля включили
в инфраструктуру модулей языка PHP.
Обычно модули предоставляют PHP-программисту API-интерфейс, через который разработчик получает доступ к функциям модуля программно. При этом отдельные модули в инфраструктуре PHP-модулей не раскрывают для программиста никаких интерфейсов.
MySQL-драйвер модуля PDO, например, не раскрывает API-интерфейс для программиста, но предоставляет интерфейс вышележащему абстрактному слою, который представляет модуль PDO.
Термины «API-интерфейс» и «модуль» нельзя воспринимать как одно и то же, поскольку модуль не обязан раскрывать API-интерфейс для программиста.
О главных API-интерфейсах языка PHP для работы с БД MySQL
PHP предлагает два API-интерфейса для подключения к серверу баз данных MySQL:
PHP-модуль mysqli
PHP-модуль PDO
Каждый модуль содержит достоинства, но встречаются и недостатки. Цель следующей части обзора состоит в кратком описании характеристик каждого API-интерфейса.
О PHP-модуле mysqli
Модуль mysqli
, или улучшенный модуль MySQL (англ. improved MySQL),
разработали, чтобы PHP-программисты получили выгоду, которую дают новые функции MySQL-систем версии 4.1.3 и выше.
Модуль mysqli
включается в пакет PHP версии 5 и выше.
Модуль mysqli
содержит преимущества,
главные из которых по сравнению с модулем mysql
состоят в следующем:
Объектно-ориентированный интерфейс
Поддержка подготовленных запросов
Поддержка мультизапросов
Поддержка транзакций
Расширенные инструменты отладки
Наравне с объектно-ориентированным интерфейсом модуль предоставляет и процедурный интерфейс.
Модуль mysqli
встраивается в инфраструктуру модулей языка PHP,
исходный код модуля лежит в каталоге ext/mysqli.
Подробнее о модуле mysqli
рассказывает раздел MySQLi.
О модуле PDO
Модуль PDO — абстракция коннектора, которая определяет интерфейс доступа к базам данных для PHP-приложений. Модуль PDO раскрывает для PHP-приложений согласованный API-интерфейс, при взаимодействии с которым приложение не зависит от типа конкретного сервера баз данных, к которому подключается. Теоретически, при работе через API-интерфейс модуля PDO один сервер баз данных легко заменить другим, например поменять Firebird на MySQL, и для этого потребуются внести в PHP-код только незначительные изменения.
К другим примерам абстракций коннекторов баз данных относятся пакет JDBC для Java-приложений и пакет DBI для приложений на языке программирования Perl.
Преимущества модуля PDO состоят в чистоте, простоте и переносимости API-интерфейса, а главный недостаток модуля — недоступность продвинутых функций, которые поддерживаются последними версиями MySQL-сервера. К таким функциям, например, относятся множественные запросы, которые модуль PDO не поддерживает.
Модуль PDO встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в директории ext/pdo.
Подробнее о модуле рассказывает раздел PDO.
О драйвере модуля PDO для работы с СУБД MySQL
MySQL-драйвер модуля PDO не относится к API-интерфейсу, который модуль раскрывает для программиста. MySQL-драйвер модуля PDO лежит на уровне ниже самого модуля PDO и взаимодействует с MySQL-сервером. Программист вызывает функции API-интерфейса модуля PDO, а модуль взаимодействует с драйвером для отправки данных и команд на MySQL-сервер.
MySQL-драйвер модуля PDO взаимодействует с MySQL-серверами, но модуль также включает драйверы для взаимодействия с серверами баз данных Firebird, PostgreSQL и другими СУБД.
MySQL-драйвер модуля PDO встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в каталоге ext/pdo_mysql. Модуль не раскрывает API-интерфейс PHP-программисту.
Дополнительно о MySQL-драйвере модуля PDO рассказывает раздел MySQL.
О родном драйвере PHP для работы с СУБД MySQL
Модуль mysqli
и MySQL-драйвер модуля PDO взаимодействуют с MySQL-сервером
путём обращения к низкоуровневой библиотеке, которая реализует
протокол взаимодействия с СУБД. Раньше единственной доступной библиотекой была
клиентская библиотека MySQL Client Library, которая распространяется как пакет
libmysqlclient
.
Однако интерфейс, который предоставляла библиотека libmysqlclient
,
не был оптимизирован для взаимодействия с PHP-приложениями, поскольку библиотека
libmysqlclient
разрабатывалась для работы с приложениями на языке C.
Поэтому как альтернативу MySQL-библиотеке libmysqlclient
разработали
родной PHP-драйвер для взаимодействия с СУБД MySQL — MySQL Native Driver,
который распространяется как PHP-модуль и называется mysqlnd
.
Модуль mysqli
и PDO-драйвер для СУБД MySQL
настраиваются отдельно — либо для работы с внешней библиотекой libmysqlclient
,
либо для работы с родным PHP-драйвером mysqlnd
.
Внутренний драйвер работает быстрее и расходует меньше памяти
по сравнению с внешней библиотекой libmysqlclient
,
поскольку драйвер mysqlnd
разработали непосредственно для работы в PHP-системах.
Поэтому лучше предпочесть родной PHP-драйвер.
Родной PHP-драйвер для взаимодействия с СУБД MySQL встраивается в инфраструктуру модулей языка PHP, исходный код модуля лежит в каталоге ext/mysqlnd. Модуль не раскрывает API-интерфейс для PHP-программиста.
Сравнение функций модулей
Следующая таблица сравнивает функциональность основных методов подключения к СУБД MySQL из PHP-приложения:
PHP-модуль mysqli | PHP-модуль PDO через драйвер PDO_MySQL и родной PHP-драйвер для СУБД MySQL | |
---|---|---|
Версия PHP, в которой представили модуль | 5.0 | 5.0 |
Статус разработки MySQL | Разработка продолжается | Разработка продолжается |
API поддерживает наборы символов | Да | Да |
API поддерживает подготовленные запросы на стороне сервера | Да | Да |
API поддерживает подготавливаемые запросы на стороне клиента | Нет | Да |
API поддерживает хранимые процедуры | Да | Да |
API поддерживает множественные запросы | Да | По большей части |
Поддержка всего функционала MySQL 4.1+ | Да | По большей части |
The text: "PDO does not allow you to use MySQL's support for Multiple Statements" is outdated.
Since v5.3, PHP intoduced multiple statement support into PDO (by PDO_MYSQLND driver replacing the previous PDO_MYSQL).