Что лучше pdo или mysqli
PDO vs. MySQLi: что стоит использовать?
Для соединения с базой данных можно использовать MySQLi и/или PDO
Что следует знать при выборе?
В этой статье будут показаны различия, затронуты темы поддержки баз данных, стабильности и производительности.
Общая информация — сравнение
PDO | MySQLi | |
---|---|---|
Поддержка баз данных | 12 различных баз данных | только MySQL |
API | ООП | ООП и процедурное обращение |
Соединение | всё просто | всё просто |
Именованные параметры |
(client side)
Соединение
Ниже приведены примеры подключения с использованием PDO и MySQLi
Прошу заметить, что эти объекты/ресурсы соединения будут использоваться на протяжении всей статьи.
Поддержка API
PDO и MySQLi предлагают объектно-ориентированный API, но при этом MySQLi так же предлагает процедурный доступ к функционалу, который более понятный для новичков.
Если Вы знакомы с нативным от PHP доступом к MySQL, переход на MySQLi с использованием функций будет более лёгким. С другой стороны, если Вы освоите PDO, вы сможете использовать любую СУБД, для которой имеется драйвер PDO.
Поддержка баз данных
Основной преимущество PDO перед MySQLi — это поддержка множества баз данных. На данных момент PDO поддерживает 12 различных СУБД, тогда как MySQLi только MySQL.
Для просмотра списка драйверов СУБД в PDO можно исполнить следующий код
PDO vs MySQLi: что выбрать?
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 в поддержке различных драйверов. На момент написания этой статьи, PDO поддерживает 12 различных драйверов, в отличие от MySQLi, который поддерживает только MySQL.
Чтобы вывести все поддерживаемые PDO драйверы, воспользуйтесь следующим кодом:
Именованные параметры
Это еще одна важная возможность в PDO; привязка параметров гораздо удобнее, чем просто использовать нумерацию:
а теперь сравним с MySQLi подходом:
Привязка параметров по знакому вопроса может и выглядит короче, но является такой гибкой как именованные параметры, так как разработчик всегда должен держать в голове порядок параметров.
К сожалению MySQLi не поддерживает именованные параметры.
Отображение на объект
Оба PDO и MySQLi могут отображать результаты запросов на объекты. Это довольно приятно, если вы не хотите использовать дополнительный уровень абстракции базы, но выглядит как ORM-поведение. Представим, что у нас есть класс User с некоторыми свойствами, которые совпадают с именами полей в базе.
Это позволяет нам определить свойства еще до того, как объект будет создан! Например:
Безопасность
Обе библиотеки предоставляют защиту от SQL инъекции, до тех пор пока разработчики правильно их используют (экранируют, применяют привязку параметров и подготовленные запросы)
Допустим взломщик пытается вставить некоторый SQL через GET параметр ‘username’ в запросе.
Как видите, PDO::quote() не только экранирует строку, но и добавляет кавычки. С другой стороны mysqli_real_escape_string() только экранирует строку, вам самим нужно будет добавлять кавычки.
Производительность
И PDO и MySQLi достаточно быстро работают, MySQLi в показателях незначительно выше, примерно 2.5% для неподготовленных запросов, и примерно 6.5% для подготовленных. Хотя родное расширение MySQL еще быстрее, чем эти оба. Так что если вам нужно получить максимальную производительность, то можете рассмотреть и его.
Заключение
В конечном счете PDO выиграл с легкостью этот бой. С поддержкой двенадцати разных драйверов баз данных (18 различных баз данных!) и именованными параметрами, мы можем спокойной игнорировать небольшую потерю в производительности. С точки зрения безопасности, оба расширения безопасны, если разработчик их корректно использует.
Так что, если вы до сих пор работаете с MySQLi, может быть пришло время это изменить!
PDO против MySQLi. Что выбрать?
Когда возникает вопрос о доступе к базе данных из кода PHP, есть два варианта: MySQLi и PDO. Что нужно знать, прежде чем сделать выбор? Различия, поддержка баз данных, стабильность, и производительность в общих чертах описываются в данном уроке.
Резюме
PDO | MySQLi | |
Поддержка баз данных | 12 различных драйверов | Только MySQL |
API | ООП | ООП+процедурная часть |
Соединение | Просто | Просто |
Именованные параметры | Есть | Нет |
Объектное отображение | Есть | Есть |
Подготовленные выражения (сторона клиента) | Есть | Нет |
Производительность | Хорошая | Хорошая |
Хранимые процедуры | Есть | Есть |
СоединениеConnection
Оба варианта предоставляют очень простые инструменты для соединения с базой данных:
И PDO и MySQLi предлагают объектно-ориентированное API. Но MySQLi также имеет процедурную часть API, которая для новичков может показаться проще для освоения. Если вы знакомы с собственным драйвером PHP MySQL, то мигрирование на процедурную часть MySQLi будет для вас проще. Но достигнув вершин мастерства в использовании PDO, его можно будет использовать с любой базой данных без каких-либо изменений основного кода
Поддержка баз данных
Чтобы распечатать список поддерживаемых драйверов PDO можно использовать следующий код:
Именованные параметры
Другой важной отличительной особенностью PDO являются именованные параметры, которые делают процедуру привязывания существенно проще:
Знак вопроса может показаться короче, чем символьные имена. Однако, теряется гибкость и устойчивость к ошибкам, так как разработчику нужно помнить о порядке следования параметров, что в большинстве случаев представляет собой зону с очень высокой вероятностью трудно распознаваемых ошибок.
К сожалению, MySQLi не поддерживает именованные параметры.
Объектное отображение
И PDO и MySQLi могут отображать результаты как объекты. Данная особенность может быть полезна в том случае, если вы не хотите использовать уровень абстракций базы данных и желаете реализовать модель объектно-реляционного отображения. Допустим, у нас есть класс User с некоторыми свойствами, которые соответствуют именам полей в базе данных:
Без объектного отображения нужно будет заполнять значениями каждое поле (либо вручную, либо с помощью конструктора) прежде, чем можно будет использовать метод info() корректно.
Но объектное отображение позволяет предопределять свойства даже до того, как объект будет построен. Например:
Безопасность
Обе библиотеки предоставляют средства для защиты от SQL инъекций, которые разработчики могут использовать по своему усмотрению.
Допустим, злодей пытается встроить вредный запрос SQL через параметр ‘username’ HTTP запроса (GET):
Если пропустить такое выражение, то оно будет включено в запрос в том виде, как есть – запрос удаляет все строки из таблицы users (и PDO и MySQLi поддерживают множественные запросы).
Метод 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
Просмотров: 74355
Правила перепечатки
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.
PDO и mysqli — это две сильно разные вещи. PDO является универсальным DBAL, позволяющим работать с любой поддерживаемой базой.
mysqli это узкоспециализированный драйвер, благодаря чему можно использовать все преимущества, он поддерживает мультизапросы, чеснее биндит данные, позволяет собирать статистику.
если вы собираетесь использовать другие базы, то имеет смысл использовать PDO, да ито. придётся дополнять его квери билдером, чтобы получить реальную переносимость. в иных случаях пользуйтесь mysqli, который предоставляет больше функциональности.
На самом деле, этот ответ не совсем верный. Акцент должен быть немного другой.
Всех всегда сбивает с толку двусмысленность понятия «abstraction» в DBAL:
— это может быть абстракция наружу, позволяющая одними и теми же методами работать с разными БД
— но в то же время мы можем абстрагироваться и внутри нашего приложения, от конкретного API, работая с унифицированными методами доступа к БД.
И вот в контексте этого вопроса нам совершенно неважно первое, но принципиально важно второе.
Являясь недообстракцией, PDO реализует тучу полезных и необходимых вещей, отсутствующих в mysqli из коробки
Таких как
— гарантированное получение в массив строки из БД без плясок с бубном
— биндинг по значению, а не по ссылке
— именованные плейсхолдеры
— методы для получения нужного результата
— функции-хелперы, такие как execute() сразу с данными
и многое другое.
Именно поэтому PDO является предпочтительным выбором, если сравнивать обращение к этим API напрямую из кода. А не потому что поддерживает много баз — ведь вопрос-то все равно про использование с mysql.
В качестве же базы для DBAL, предназначенного для работы с mysql, mysqli предпочтительнее, поскольку предоставляет гораздо более низкоуровневый доступ к API.
Что лучше pdo или mysqli
Давно прошли дни использования расширения «mysql_», так как его методы объявлены устаревшими с появлением PHP 5.5 и удалены из PHP 7. Увы, интернет все еще страдает от тонн старых учебников, которые новички будут просто копировать/вставлять и использовать на хостингах с более старыми версиями PHP, тем самым продолжая поддерживать этот «вымирающий вид».
Теоретически можно предположить, что обсуждение должно быть окончено. Если есть возможность использовать универсальный API для всех, то проще его и применять. Однако, PDO_MYSQL просто не имеет всех новейших и наиболее продвинутых функций MySQLi. Я честно не понимаю, почему это так, так как это полностью устранит любую причину использования API, зависящего от поставщика. Тем не менее, я бы предположил, что большинство людей не нуждаются в этих дополнительных функциях, но определенно есть и те, кто это делает.
Мое мнение, что PDO должен использоваться по умолчанию, особенно для начинающих, из-за его универсальности, общей предсказуемости и полезных режимов выборки. Тем не менее, MySQLi был бы лучшим выбором для продвинутых пользователей, которые хотят новейшую, специфичную для MySQL функциональность.
Это несколько иронично, что более опытные разработчики PHP, как правило, думают, что PDO является единственным приемлемым вариантом, в то время как новички, как правило, используют MySQLi. Конечно, большинство разработчиков действительно не нуждаются в дополнительных расширенных возможностях mysqli, но это, безусловно, может быть очень полезно для некоторых, как уже упоминалось ранее.
Если PDO действительно в конечном итоге идет в ногу со всеми последними или различными функциональными возможностями MySQL, то я мог видеть, почему MySQLi должен уйти. Хотя PDO имеет несколько специфичных для драйвера функций, он не имеет всех, ни идет в ногу со временем.
Именно поэтому я не думаю, что MySQLi и PDO не обязательно являются конкурентами, а скорее две мощные библиотеки с совершенно разными фокусами на данный момент. Однако, очевидно, что PDO следует использовать более широко. Но, как было сказано ранее, разница в значительной степени незначительна, как и в любом случае. Как уже упоминалось несколько раз ранее, выживание MySQLi полагается на то, что он догоняет PDO, наряду с PDO, главным образом, прилипает к функциям, которые используются среди большинства драйверов БД, которые он поддерживает.
Как было сказано ранее, и PDO, и MySQLi чрезвычайно похожи, но есть небольшие различия в синтаксисе. MySQLi следует старой школе PHP змеиный регистр, в то время как PDO использует верблюжий регистр. Кроме того, методы MySQLi используются в качестве свойств объекта, в то время как PDO использует традиционный синтаксис для функций.
статьи IT, php, MySQLi, PDO, базы данных
- Что лучше pci wifi или usb wifi адаптер
- Что лучше pdp или pony express