Mysqli vs PDO — что выбрать?
И после ее прочтения осталось двойственное чувство. Вроде как обращение к MySQL через PDO — это true, но вместе с тем автор рассказывает о некоторых проблемах и высказывает свое «фи» некоторой избыточности кода. При этом, рекомендуя использовать библиотеку для работы с API mysqli. Либо готовую, либо если не лень — написать свою.
Вопрос к знающим людям: насколько актуально переходить на PDO? Особенно если учитывать, что есть свое подобие библиотеки, где обращение через mysqli легко заменить на обращение через PDO.
- Вопрос задан более трёх лет назад
- 21601 просмотр
Комментировать
Решения вопроса 1
PHP и прочие вебштучки
PDO и mysqli — это две сильно разные вещи. PDO является универсальным DBAL, позволяющим работать с любой поддерживаемой базой.
mysqli это узкоспециализированный драйвер, благодаря чему можно использовать все преимущества, он поддерживает мультизапросы, чеснее биндит данные, позволяет собирать статистику.
если вы собираетесь использовать другие базы, то имеет смысл использовать PDO, да ито. придётся дополнять его квери билдером, чтобы получить реальную переносимость. в иных случаях пользуйтесь mysqli, который предоставляет больше функциональности.
Ответ написан более трёх лет назад
Нравится 9 2 комментария
Руслан Хорошкевич @Zezst Автор вопроса
Спасибо большое.
Вот именно это меня и интересовало. Отсутствие этого понимания и мешало мне спать. Оно где-то витало в воздухе, но все время ускользало. Теперь почти все встало на свои места.

На самом деле, этот ответ не совсем верный. Акцент должен быть немного другой.
Всех всегда сбивает с толку двусмысленность понятия «abstraction» в DBAL:
— это может быть абстракция наружу, позволяющая одними и теми же методами работать с разными БД
— но в то же время мы можем абстрагироваться и внутри нашего приложения, от конкретного API, работая с унифицированными методами доступа к БД.
И вот в контексте этого вопроса нам совершенно неважно первое, но принципиально важно второе.
Являясь недообстракцией, PDO реализует тучу полезных и необходимых вещей, отсутствующих в mysqli из коробки
Таких как
— гарантированное получение в массив строки из БД без плясок с бубном
— биндинг по значению, а не по ссылке
— именованные плейсхолдеры
— методы для получения нужного результата
— функции-хелперы, такие как execute() сразу с данными
и многое другое.
Именно поэтому PDO является предпочтительным выбором, если сравнивать обращение к этим API напрямую из кода. А не потому что поддерживает много баз — ведь вопрос-то все равно про использование с mysql.
В качестве же базы для DBAL, предназначенного для работы с mysql, mysqli предпочтительнее, поскольку предоставляет гораздо более низкоуровневый доступ к API.
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
- Полезные режимы выборки
- Разрешено передавать переменные и значения непосредственно в execute
- Возможность автоматического обнаружения типов переменных (на самом деле происходит так, что все обрабатывается как строка при отправке на сервер, но преобразуется в правильный тип. Это работает 100% времени с нативными подготовленными инструкциями, но не работает с определенными примерами, такими как режим эмуляции.)
- Предоставляет возможность автоматической буферизации результатов с помощью подготовленных операторов
- Именованные параметры (хотя и бесполезно с режимом эмуляции, так как вы можете использовать одно и то же имя только один раз)
Преимущества MySQLi
- Асинхронные запросы Возможность получить больше информации о затронутых строках, как обновление строки с теми же значениями (можно сделать в 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, базы данных
Чем отличается безопасность PDO от безопасности Mysqli?
Привет! Я понимаю, может быть это туповатый вопрос, но все же хочется спросить: есть пока на 15% написаный PHP движок с использованием mysqli . Все было норм, но потом мне все начали говорить про PDO , что он якобы безопаснее, предотвращает инъекции и прочее. Так вот вопрос: стоит ли учить PDO и переписывать движок под него и почему в PDO безопасность якобы выше? Чем это обусловлено? Про то, что у PDO чуть урезанный функционал, вообще не парит, так как я и 30% функций mysqli попросту не юзаю.
Отслеживать
задан 9 апр 2017 в 7:41
Eugen Eray Eugen Eray
1,196 2 2 золотых знака 14 14 серебряных знаков 31 31 бронзовый знак
Ни тот, ни другой не защитят вас от самих себя..
9 апр 2017 в 7:57
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
В документации есть достаточно подробные разделы про это дело
Расширения PDO и mysqli — это не более, чем API доступа к выбранной библиотеке БД.
Что PDO, что mysqli предоставляют практически идентичный функционал и, с точки зрения «безопасности и предотвращения инъекций» разницы нет никакой.
Причины, почему имеет смысл использовать PDO:
1) Вам нужны подготовленные запросы на стороне клиента
2) У вас в проекте будут использоваться коннекты к отличным от MySQL базам (postgres например). В таком случае PDO даст единообразность кода для работы с разными БД.
unixforum.org
Я так думаю что вопрос наболевший и распространённый, но тем не менее решил спросить. В свои 37 решил освоить пиху и попробовать написать сначала сайт и плавно переработать его в свою CRM. Ну хочу типа изобрести велосипед. Применил на практике какие-то начальные знания HTML и CSS, вроде -> что-то получилось
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20642 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: PDO vs Mysqli
Сообщение Bizdelnick » 21.08.2021 01:40
Какой смысл сейчас осваивать PHP? Умер он, для новых проектов его брать не стоит. Только для легаси всякого. Если что-то толковое на нём и напишете, оно никому не будет интересно просто из-за языка.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
SwapON Сообщения: 142 ОС: Arch linux => Gentoo
Re: PDO vs Mysqli
Сообщение SwapON » 21.08.2021 02:13
21.08.2021 01:40
Какой смысл сейчас осваивать PHP? Умер он.
- Он не плохо держит позицию на TIOBE
- На рынке труда разрабам PHP всяко больше платят, чем обычным сисадминам (кем я и являюсь)
- А как же крупные проекты на пихе?
Спасибо сказали:
ormorph Сообщения: 2576 ОС: Gentoo
Re: PDO vs Mysqli
Сообщение ormorph » 21.08.2021 04:37
21.08.2021 01:40
Умер он, для новых проектов его брать не стоит
Хм, а что нынче в моде для новых проектов?
Спасибо сказали:
olecya Сообщения: 894 ОС: debian, fedora (i3-wm)
Re: PDO vs Mysqli
Сообщение olecya » 21.08.2021 10:14
21.08.2021 01:40
оно никому не будет интересно просто из-за языка.
21.08.2021 01:27
Ну хочу типа изобрести велосипед.
Не хочу подпасть под категорию понторезов, но думаю релевантным выбором был бы mysqli. Зачем велосипеду избыточность?
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20642 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: PDO vs Mysqli
Сообщение Bizdelnick » 21.08.2021 10:53
21.08.2021 02:13
Ну почему у подавляющего большинства ненависть к нему.
Не то чтобы я его любил, но то же самое мог бы сказать, например, и о Perl, с которым у меня гораздо лучшие отношения. Так что в моих словах нет ненависти. Просто такова объективная реальность.
21.08.2021 02:13
Он не плохо держит позицию на TIOBE
Когда-то он уверенно держал 3-4 строчку, теперь скатился до 8. Хотя есть большие сомнения, что это о чём-то говорит.
21.08.2021 02:13
На рынке труда разрабам PHP всяко больше платят, чем обычным сисадминам (кем я и являюсь)
На рынке труда сейчас наиболее востребованы разработчики, в дополнение к PHP знающие ещё по крайней мере один язык. Чтобы переписывать некогда написанное на PHP. ☺
21.08.2021 02:13
А как же крупные проекты на пихе?
Много ли таких проектов появилось за последние 10 лет? Я сходу ни одного вспомнить не могу. Все, какие приходят в голову, старее.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
IMB Сообщения: 2556 ОС: Debian
Re: PDO vs Mysqli
Сообщение IMB » 21.08.2021 10:59
Если использование другой базы не предполагается то специализированная библиотека должна быть, как минимум, не хуже, если же в обозримом будущем может быть изменение базы, то более общая библиотека упростит это, но потенциально она не поддерживает какие-либо возможности/расширения.
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20642 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: PDO vs Mysqli
Сообщение Bizdelnick » 21.08.2021 11:03
21.08.2021 04:37
Хм, а что нынче в моде для новых проектов?
Ну вот, например, натыкал языков, используемых для бекенда. Уверенно ползут вверх только Python и Go. И эту тенденцию не просадил даже хайп вокруг Node.js.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |
Спасибо сказали:
ormorph Сообщения: 2576 ОС: Gentoo
Re: PDO vs Mysqli
Сообщение ormorph » 21.08.2021 11:59
21.08.2021 11:03
Ну вот, например, натыкал языков,
А, эти, конечно развитие идёт не плохо, но пока php ещё актуальный, ну и востребован пока ещё. Просто требования к программистам с этими языками довольно не маленькие. Но в принципе ни что не стоит на месте.
Спасибо сказали:
UnixNoob Сообщения: 1342 ОС: Slackware
Re: PDO vs Mysqli
Сообщение UnixNoob » 21.08.2021 12:35
21.08.2021 02:13
ПО для мракобесной винды, отсюда выпадают сразу C#, Java и т.п.
А как Java связана с Windows?
PDO это, я так понял ORM(объектно-реляционное отображение), знать SQL вам все-равно потребуется.
«Однажды один очень мудрый человек… ничего не сказал. Времена были опасные, да и собеседники ненадёжные»
Спасибо сказали:
Bizdelnick Модератор Сообщения: 20642 Статус: nulla salus bello ОС: Debian GNU/Linux
Re: PDO vs Mysqli
Сообщение Bizdelnick » 21.08.2021 13:02
По сабжу. Если рассматривать проект как сугубо учебный, то выбирайте mysqli, если не очень знакомы с SQL и планируете прокачиваться в нём. Если же SQL уже неплохо знаете, берите PDO: поможет понять, как можно строить абстракции над разными СУБД.
Добавлено (13:07):
21.08.2021 11:59
пока php ещё актуальный, ну и востребован пока ещё
Ключевое слово — «ещё». Программисту, уже сейчас хорошо знающему PHP, на его век работы хватит (хотя всё равно может на другой основной язык перейти, конечно). Но начинать учить PHP сейчас — довольно недальновидно. Джуниор с PHP уже мало кому нужен, а в более отдалённой перспективе и востребованность опытных разработчиков уменьшится.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще |
в течение (часа) новичок нюанс по умолчанию |
приемлемо проблема пробовать трафик |