PDO и MySQLi: битва API баз данных PHP


Введение

Давно прошли дни использования расширения «mysql_», так как его методы объявлены устаревшими с появлением PHP 5.5 и удалены из PHP 7. Увы, интернет все еще страдает от тонн старых учебников, которые новички будут просто копировать/вставлять и использовать на хостингах с более старыми версиями PHP, тем самым продолжая поддерживать этот «вымирающий вид».

Если вы используете MySQL или MariaDB в PHP, то у вас есть возможность выбрать MySQLi или PDO. Первый - это просто улучшенная версия с процедурной поддержкой и поддержкой ООП и добавленными подготовленными инструкциями, в то время как второй - это уровень абстракции, который позволяет использовать унифицированный API для всех 12 поддерживаемых драйверов баз данных. Хотя следует отметить, что MySQL, несомненно, является самой популярной базой данных для использования в мире PHP.



Теоретически можно предположить, что обсуждение должно быть окончено. Если есть возможность использовать универсальный API для всех, то проще его и применять. Однако, PDO_MYSQL просто не имеет всех новейших и наиболее продвинутых функций MySQLi. Я честно не понимаю, почему это так, так как это полностью устранит любую причину использования API, зависящего от поставщика. Тем не менее, я бы предположил, что большинство людей не нуждаются в этих дополнительных функциях, но определенно есть и те, кто это делает.

Преимущества PDO

В PDO имеются такие функции, как:
  • Полезные режимы выборки
  • Разрешено передавать переменные и значения непосредственно в execute
  • Возможность автоматического обнаружения типов переменных (на самом деле происходит так, что все обрабатывается как строка при отправке на сервер, но преобразуется в правильный тип. Это работает 100% времени с нативными подготовленными инструкциями, но не работает с определенными примерами, такими как режим эмуляции.)
  • Предоставляет возможность автоматической буферизации результатов с помощью подготовленных операторов
  • Именованные параметры (хотя и бесполезно с режимом эмуляции, так как вы можете использовать одно и то же имя только один раз)
Как вы можете видеть, есть довольно много вещей, которые MySQLi должен перенять от PDO, если он хочет оставаться актуальным.

Преимущества MySQLi

PDO также не хватает некоторых функций, хотя и гораздо менее важных для большинства пользователей, таких как:
  • Асинхронные запросы
  • Возможность получить больше информации о затронутых строках, как обновление строки с теми же значениями (можно сделать в PDO как параметр конструктора, но вы не можете изменить его позже)
  • Правильный метод закрытия базы данных
  • Несколько запросов одновременно (хотя это возможно, если режим эмуляции включен в PDO)
  • Автоматическая очистка с помощью постоянных соединений
Так что я должен использовать?

Мое мнение, что PDO должен использоваться по умолчанию, особенно для начинающих, из-за его универсальности, общей предсказуемости и полезных режимов выборки. Тем не менее, MySQLi был бы лучшим выбором для продвинутых пользователей, которые хотят новейшую, специфичную для MySQL функциональность.

Это несколько иронично, что более опытные разработчики PHP, как правило, думают, что PDO является единственным приемлемым вариантом, в то время как новички, как правило, используют MySQLi. Конечно, большинство разработчиков действительно не нуждаются в дополнительных расширенных возможностях mysqli, но это, безусловно, может быть очень полезно для некоторых, как уже упоминалось ранее.

Особенно любопытно, что новички боятся попробовать что-то" новое "и переключиться на PDO, в то время как многие продвинутые пользователи считают хорошим аргументом "простоту переключения с драйвера базы данных" как преимущество PDO. Любой, кто верит в миф о том, что вы можете легко переключаться между базами данных в PDO, очевидно, никогда не пытался это сделать. Каждый драйвер отличается, и переход от Microsoft SQL Server к MySQL, конечно, не будет автоматизирован. Во-первых, давайте проясним одно, синтаксис очень похож — почти идентичен, и я приведу это в примерах. PDO - это также не какой-то слой абстракции над MySQLi, а скорее над PDO_MYSQL.

Если PDO действительно в конечном итоге идет в ногу со всеми последними или различными функциональными возможностями MySQL, то я мог видеть, почему MySQLi должен уйти. Хотя PDO имеет несколько специфичных для драйвера функций, он не имеет всех, ни идет в ногу со временем.

Именно поэтому я не думаю, что MySQLi и PDO не обязательно являются конкурентами, а скорее две мощные библиотеки с совершенно разными фокусами на данный момент. Однако, очевидно, что PDO следует использовать более широко. Но, как было сказано ранее, разница в значительной степени незначительна, как и в любом случае. Как уже упоминалось несколько раз ранее, выживание MySQLi полагается на то, что он догоняет PDO, наряду с PDO, главным образом, прилипает к функциям, которые используются среди большинства драйверов БД, которые он поддерживает.

Различия в коде

Как было сказано ранее, и PDO, и MySQLi чрезвычайно похожи, но есть небольшие различия в синтаксисе. MySQLi следует старой школе PHP змеиный регистр, в то время как PDO использует верблюжий регистр. Кроме того, методы MySQLi используются в качестве свойств объекта, в то время как PDO использует традиционный синтаксис для функций.

Я никогда не пойму, почему и PDO, и MySQLi усложнили вещи, заставив вас использовать два отдельных метода для использования подготовленного оператора. К счастью, PDO удалил необходимость использовать специальную функцию привязки - хотя я не уверен, почему то же самое не сделано execute(). Не подготовленные MySQLi и PDO действительно не так уж и плохи, и это только неудачная реализация подготовленных заявлений, которые заставили их казаться многословными. Например, в API PostgreSQL для конкретного поставщика вы можете сделать это вот так. Вот пример того, как вы сделали бы "не подготовленный" запрос, чтобы получить ассоциативный массив с MySQLi и PDO.

$arr = $mysqli->query("SELECT * FROM myTable")->fetch_all(MYSQLI_ASSOC);
$arr = $pdo->query("SELECT * FROM myTable")->fetchAll(PDO::FETCH_ASSOC);
На самом деле, лучший путь - это использование оболочки, построителя запросов или ORM Хорошей отправной точкой является обертывание PDO в простой API, и если вам нужны дополнительные функции, переопределите тот же API с помощью MySQLi и добавьте функцию.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, php, MySQLi, PDO, базы данных




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.



Схема организации простого сервера с помощью потоковых сокетов на C#
Протокол HTTP
Начало работы с RuVDS: установка и настройка сервера, быстрый запуск (перенос) сайта