Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

PDO vs MySQLi: что выбрать?

by
Read Time:5 minsLanguages:

Russian (Pусский) translation by Sergey Zhuk (you can also view the original English article)

При работе с базами данных в PHP, у нас есть два варианта на выбор: MySQLi и PDO. И так, что вы должны знать, перед тем как сделаете свой выбор? В этой статье будут изложены различия, поддержка баз данных, стабильность и проблемы производительности.


Резюме

PDO MySQLi
Поддержка баз данных 12 различных драйверов Только MySQL
API OOP OOP и процедурный
Соединение Легкое Легкое
Именованные параметры Есть Нет
Отображение на объект Есть Нет
Подготовленные запросы
(на клиенте)
Есть Нет
Производительность Высокая Высокая
Хранимые процедруы Есть Есть

Соединение

Подключение к базе для обоих вариантов:

Обратите внимание, что эти объекты соединений/ресурсы далее будут рассматриваться как уже существующие.


Поддержка API

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


Поддержка баз данных

Основное преимущество PDO над MySQLi в поддержке различных драйверов. На момент написания этой статьи, PDO поддерживает 12 различных драйверов, в отличие от MySQLi, который поддерживает только MySQL.

Чтобы вывести все поддерживаемые PDO драйверы, воспользуйтесь следующим кодом:

Что это значит? В ситуациях, когда в вашем проекте вы решите поменять базу данных, с PDO этот процесс будет достаточно прозрачным. Итак, все что вам нужно будет сделать, это изменить строку подключения и несколько запросов, если в них используются методы, не поддерживаемые вашей новой базой данных. С MySQLi вам придется переписать каждую строчку кода - включая запросы.


Именованные параметры

Это еще одна важная возможность в PDO; привязка параметров гораздо удобнее, чем просто использовать нумерацию:

а теперь сравним с MySQLi подходом:

Привязка параметров по знакому вопроса может и выглядит короче, но является такой гибкой как именованные параметры, так как разработчик всегда должен держать в голове порядок параметров.

К сожалению MySQLi не поддерживает именованные параметры.


Отображение на объект

Оба PDO и MySQLi могут отображать результаты запросов на объекты. Это довольно приятно, если вы не хотите использовать дополнительный уровень абстракции базы, но выглядит как ORM-поведение. Представим, что у нас есть класс User с некоторыми свойствами, которые совпадают с именами полей в базе.

Без использования отображения на объект, нам бы пришлось заполнять каждое поле (либо вручную, либо через конструктор), до того как мы бы могли корректно использовать метод info().

Это позволяет нам определить свойства еще до того, как объект будет создан! Например:


Безопасность

Обе библиотеки предоставляют защиту от SQL инъекции, до тех пор пока разработчики правильно их используют (экранируют, применяют привязку параметров и подготовленные запросы)

Допустим взломщик пытается вставить некоторый SQL через GET параметр 'username' в запросе.

Если мы не будет экранировать, то это будет вставлено в запрос как есть, удаляя таблицу users, так как и PDO и mysqli поддерживают множественные запросы.

Как видите, PDO::quote() не только экранирует строку, но и добавляет кавычки. С другой стороны mysqli_real_escape_string() только экранирует строку, вам самим нужно будет добавлять кавычки.

Я советую всегда использовать подготовленные выражения вместо PDO::quote() и mysqli_real_escape_string().


Производительность

И PDO и MySQLi достаточно быстро работают, MySQLi в показателях незначительно выше, примерно 2.5% для неподготовленных запросов, и примерно 6.5% для подготовленных. Хотя родное расширение MySQL еще быстрее, чем эти оба. Так что если вам нужно получить максимальную производительность, то можете рассмотреть и его.


Заключение

В конечном счете PDO выиграл с легкостью этот бой. С поддержкой двенадцати разных драйверов баз данных (18 различных баз данных!) и именованными параметрами, мы можем спокойной игнорировать небольшую потерю в производительности. С точки зрения безопасности, оба расширения безопасны, если разработчик их корректно использует.

Так что, если вы до сих пор работаете с MySQLi, может быть пришло время это изменить!

Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.