PDO против MySQLi. Что выбрать?
Когда возникает вопрос о доступе к базе данных из кода PHP, есть два варианта: MySQLi и PDO. Что нужно знать, прежде чем сделать выбор? Различия, поддержка баз данных, стабильность, и производительность в общих чертах описываются в данном уроке.
Резюме
| PDO | MySQLi | |
| Поддержка баз данных | 12 различных драйверов | Только MySQL |
| API | ООП | ООП+процедурная часть |
| Соединение | Просто | Просто |
| Именованные параметры | Есть | Нет |
| Объектное отображение | Есть | Есть |
| Подготовленные выражения (сторона клиента) | Есть | Нет |
| Производительность | Хорошая | Хорошая |
| Хранимые процедуры | Есть | Есть |
СоединениеConnection
Оба варианта предоставляют очень простые инструменты для соединения с базой данных:
И PDO и MySQLi предлагают объектно-ориентированное API. Но MySQLi также имеет процедурную часть API, которая для новичков может показаться проще для освоения. Если вы знакомы с собственным драйвером PHP MySQL, то мигрирование на процедурную часть MySQLi будет для вас проще. Но достигнув вершин мастерства в использовании PDO, его можно будет использовать с любой базой данных без каких-либо изменений основного кода
Поддержка баз данных

Ключевым преимуществом PDO перед MySQLi является его могучая поддержка различных баз данных. На момент написания урока PDO может использовать 12 драйверов. А MySQLi — поддерживает только MySQL.
Чтобы распечатать список поддерживаемых драйверов PDO можно использовать следующий код:
Что означает разница в количестве поддерживаемых баз данных? Для ситуаций, когда в проекте надо перейти на использование другой базы данных, PDO позволит сделать процесс прозрачным. Все, что нужно будет сделать — изменить строку соединения и несколько запросов, если какие-либо методы не поддерживаются новой базой данных. В случае с MySQLi придется переписывать весь код, включая запросы.
Именованные параметры
Другой важной отличительной особенностью PDO являются именованные параметры, которые делают процедуру привязывания существенно проще:
Сравните с MySQLi:
Знак вопроса может показаться короче, чем символьные имена. Однако, теряется гибкость и устойчивость к ошибкам, так как разработчику нужно помнить о порядке следования параметров, что в большинстве случаев представляет собой зону с очень высокой вероятностью трудно распознаваемых ошибок.
К сожалению, MySQLi не поддерживает именованные параметры.
Объектное отображение
И PDO и MySQLi могут отображать результаты как объекты. Данная особенность может быть полезна в том случае, если вы не хотите использовать уровень абстракций базы данных и желаете реализовать модель объектно-реляционного отображения. Допустим, у нас есть класс User с некоторыми свойствами, которые соответствуют именам полей в базе данных:
Без объектного отображения нужно будет заполнять значениями каждое поле (либо вручную, либо с помощью конструктора) прежде, чем можно будет использовать метод info() корректно.
Но объектное отображение позволяет предопределять свойства даже до того, как объект будет построен. Например:
Безопасность
Обе библиотеки предоставляют средства для защиты от SQL инъекций, которые разработчики могут использовать по своему усмотрению.
Допустим, злодей пытается встроить вредный запрос SQL через параметр ‘username’ HTTP запроса (GET):
Если пропустить такое выражение, то оно будет включено в запрос в том виде, как есть – запрос удаляет все строки из таблицы users (и PDO и MySQLi поддерживают множественные запросы).
Метод PDO::quote() не только отбрасывает лишние символы в строке, но и заключает ее в кавычки. А функция mysqli_real_escape_string() только отбрасывает лишние символы в строке, а в кавычки ее надо будет помещать вручную.
Другой метод защиты:
Лучше использовать подготовленные выражения, чем метод PDO::quote() и функцию mysqli_real_escape_string() .
Производительность
И PDO и MySQLi достаточно быстро выполняются. MySQLi имеет небольшое преимущество по результатам тестов –
2.5% для обычных запросов и
6.5% для подготовленных выражений. Так что стоит принять информацию во внимание, если для вас будет важно даже минимальное различие в характеристиках.
Заключение
PDO одержал сравнительно легкую победу в данном поединке. С 12 различными драйверами для баз данных (доступны 18 разных баз данных!) и именованными параметрами можно игнорировать небольшое отставание в производительности. С точки зрения безопасности обе библиотеки предоставляют разработчику равные возможности и стойкость кода зависит только от программиста.
Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: net.tutsplus.com/tutorials/php/pdo-vs-mysqli-which-should-you-use/
Перевел: Сергей Фастунов
Урок создан: 25 Февраля 2012
Просмотров: 78345
Правила перепечатки
5 последних уроков рубрики «PHP»
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Mysqli vs PDO — что выбрать?
И после ее прочтения осталось двойственное чувство. Вроде как обращение к MySQL через PDO — это true, но вместе с тем автор рассказывает о некоторых проблемах и высказывает свое «фи» некоторой избыточности кода. При этом, рекомендуя использовать библиотеку для работы с API mysqli. Либо готовую, либо если не лень — написать свою.
Вопрос к знающим людям: насколько актуально переходить на PDO? Особенно если учитывать, что есть свое подобие библиотеки, где обращение через mysqli легко заменить на обращение через PDO.
- Вопрос задан более трёх лет назад
- 20913 просмотров
- Вконтакте
PDO и mysqli — это две сильно разные вещи. PDO является универсальным DBAL, позволяющим работать с любой поддерживаемой базой.
mysqli это узкоспециализированный драйвер, благодаря чему можно использовать все преимущества, он поддерживает мультизапросы, чеснее биндит данные, позволяет собирать статистику.
если вы собираетесь использовать другие базы, то имеет смысл использовать PDO, да ито. придётся дополнять его квери билдером, чтобы получить реальную переносимость. в иных случаях пользуйтесь mysqli, который предоставляет больше функциональности.
- Вконтакте

На самом деле, этот ответ не совсем верный. Акцент должен быть немного другой.
Всех всегда сбивает с толку двусмысленность понятия «abstraction» в DBAL:
— это может быть абстракция наружу, позволяющая одними и теми же методами работать с разными БД
— но в то же время мы можем абстрагироваться и внутри нашего приложения, от конкретного API, работая с унифицированными методами доступа к БД.
И вот в контексте этого вопроса нам совершенно неважно первое, но принципиально важно второе.
Являясь недообстракцией, PDO реализует тучу полезных и необходимых вещей, отсутствующих в mysqli из коробки
Таких как
— гарантированное получение в массив строки из БД без плясок с бубном
— биндинг по значению, а не по ссылке
— именованные плейсхолдеры
— методы для получения нужного результата
— функции-хелперы, такие как execute() сразу с данными
и многое другое.
Именно поэтому PDO является предпочтительным выбором, если сравнивать обращение к этим API напрямую из кода. А не потому что поддерживает много баз — ведь вопрос-то все равно про использование с mysql.
В качестве же базы для DBAL, предназначенного для работы с mysql, mysqli предпочтительнее, поскольку предоставляет гораздо более низкоуровневый доступ к API.
Why should you switch to PDO from MySQL or MySQLi?
MySQL, as you know was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used.
MySQLi The i stands for Improved. The MySQLi is an extension to work with MySQL version 4.1.13 or newer. MySQLi is introduced with PHP Version 5.0 and is a replacement for the mysql functions, with object-oriented and procedural versions. It has support for prepared statements.
PDO (PHP Data Objects) is a general database abstraction layer with support for MySQL among many other databases. It provides prepared statements, and significant flexibility in how data is returned.
Connection
It’s a cinch to connect to a database with both of these:
Error Handling
API Support
Both PDO and MySQLi offer an object-oriented API, but MySQLi also offers a procedural API — which makes it easier for newcomers to understand. If you are familiar with the native PHP MySQL driver, you will find migration to the procedural MySQLi interface much easier. On the other hand, once you master PDO, you can use it with any database you desire!
Database Support
The core advantage of PDO over MySQLi is in its database driver support. At the time of this writing, PDO supports 12 different drivers, opposed to MySQLi, which supports MySQL only.
Security
Both libraries provide SQL injection security, as long as the developer uses them the way they were intended (read: escaping / parameter binding with prepared statements).
Lets say a hacker is trying to inject some malicious SQL through the ‘username’ HTTP query parameter (GET):
If we fail to escape this, it will be included in the query «as is» — deleting all rows from the users table (both PDO and mysqli support multiple queries).
As you can see, PDO::quote() not only escapes the string, but it also quotes it. On the other side, mysqli_real_escape_string() will only escape the string; you will need to apply the quotes manually.
I recommend that you always use prepared statements with bound queries instead of PDO::quote() and mysqli_real_escape_string().
Summary
There are only two possibilities to use extension because MySQL is deprecated as of PHP 5.5.0 and removed as of PHP 7.0.0.
- MySQLi
- PDO
Ultimately, PDO wins this battle with ease. With support for twelve different database drivers (eighteen different databases!) and named parameters, we can ignore the small performance loss, and get used to its API. From a security standpoint, both of them are safe as long as the developer uses them the way they are supposed to be used (read: prepared statements).
PDO vs MySQLi: что выбрать.
При работе с базами данных в 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, может быть пришло время это изменить!