MySQL или PDO - каковы плюсы и минусы? [закрыто]

Вместо этого мы разделяем использование mysqli и PDO для таких вещей, как подготовленные операторы и поддержка транзакций. Некоторые проекты используют один, некоторые другой. Существует небольшая реалистическая вероятность того, что мы когда-либо перейдем на другую РСУБД.

Я предпочитаю PDO по той единственной причине, что он разрешает именованные параметры для подготовленных операторов, и, насколько мне известно, mysqli этого не делает.

Есть ли другие плюсы и минусы выбора одного стандарта другим, поскольку мы объединяем наши проекты, чтобы использовать только один подход?

17.08.2008 09:47:22
Эта статья поможет выбрать, какой использовать. Если вы считаете , производительность это может помочь вам выбрать.
ravi404 28.11.2012 11:48:28
Забавно, сколько людей проголосовало и сняло вопрос, который «не конструктивен». Дело в том, что полная тема очень конструктивна - может быть, модераторы должны учитывать это при оценке того, является ли вопрос конструктивным или нет?
marlar 27.06.2013 16:57:04
@ Marlar Я оооочень согласен с вами! Это действительно самая большая проблема в StackOverflow. Отличные вопросы / обсуждения всегда закрыты.
Sliq 11.07.2013 17:30:23
13 ОТВЕТОВ

Перемещение приложения из одной базы данных в другую не очень распространено, но рано или поздно вы можете обнаружить, что работаете над другим проектом с использованием другой СУБД. Если вы работаете дома с PDO, то, по крайней мере, вам будет чему поучиться меньше.

Кроме того, я нахожу, что PDO API немного более интуитивно понятен, и он более ориентирован на объект. mysqli чувствует, что это просто процедурный API, который был объективизирован, если вы понимаете, о чем я. Короче говоря, мне легче работать с PDO, но это, конечно, субъективно.

57
17.08.2008 09:55:03

Лично я использую PDO, но я думаю, что это в основном вопрос предпочтений.

PDO имеет некоторые функции, которые помогают против внедрения SQL ( подготовленные операторы ), но если вы осторожны с SQL, вы можете добиться этого и с помощью mysqli.

Переход на другую базу данных - это не столько повод для использования PDO. Пока вы не используете «специальные функции SQL», вы можете переключаться с одной БД на другую. Однако, как только вы используете, например, «SELECT ... LIMIT 1», вы не можете перейти к MS-SQL, где это «SELECT TOP 1 ...». Так что это все равно проблематично.

5
19.08.2008 18:55:06
MySQLi подготовил заявления.
Tower 7.07.2009 09:59:07

Я начал использовать PDO, потому что поддержка утверждений лучше, на мой взгляд. Я использую слой доступа к данным ActiveRecord-esque, и гораздо проще реализовать динамически генерируемые операторы. Привязка параметров MySQLi должна быть выполнена в одном вызове функции / метода, поэтому, если вы не знаете до времени выполнения, сколько параметров вы хотите связать, вы вынуждены использовать call_user_func_array()(я считаю, что это правильное имя функции) для выбора , И забудьте о простой динамической привязке результата.

Больше всего мне нравится PDO, потому что это очень разумный уровень абстракции. Его легко использовать в полностью абстрагированных системах, где вы не хотите писать SQL, но это также позволяет легко использовать более оптимизированный, чистый тип запросов или смешивать и сопоставлять их.

25
8.09.2008 14:17:40
Возможно связывание результатов с динамически генерируемыми запросами, мы делаем это в наших приложениях. Это, однако, огромная боль.
Pim Jager 21.04.2009 07:50:39

PDO - это стандарт, который ожидает большинство разработчиков. mysqli был, по сути, сделанным на заказ решением конкретной проблемы, но у него есть все проблемы других специфических для СУБД библиотек. PDO - это место, где пойдет вся тяжелая работа и умное мышление.

17
10.09.2008 21:56:31

Есть одна вещь, которую нужно иметь в виду.

Mysqli не поддерживает функцию fetch_assoc (), которая возвращает столбцы с ключами, представляющими имена столбцов. Конечно, можно написать свою собственную функцию, чтобы сделать это, это даже не очень долго, но мне было очень тяжело писать это (для неверующих: если вам кажется, что это легко, попробуйте это самостоятельно и не т обмануть :))

-4
24.09.2008 13:45:36
Вы пробовали руководство? php.net/manual/en/mysqli-result.fetch-assoc.php
Till 24.09.2008 13:49:18
Внедрял больше времени назад, но да, я проверил руководство. Работает ли это с подготовленными заявлениями? Я сомневаюсь ...
michal kralik 24.09.2008 13:56:53
На самом деле, он имеет любопытную частичную поддержку. Вы можете получить массивы в обычных запросах, но не в параметризованных запросах: -!
Álvaro González 30.04.2010 10:22:02
Почему бы не удалить ответ, который явно неверен?
Majid Fouladpour 19.04.2012 03:04:00
@MajidFouladpour - Ответ, очевидно, не неправильный . Просто отсутствует какой-то контекст. Mysqli не полностью поддерживает поиск ассоциативных массивов.
Álvaro González 24.04.2012 11:02:50

PDO имеет то, что MySQLi не нравится мне, это способность PDO возвращать результат в виде объекта определенного класса (например $pdo->fetchObject('MyClass')). MySQLi fetch_object()будет только возвращать stdClassобъект.

3
30.10.2012 02:39:49
На самом деле, вы можете указать класс вручную: «объект mysqli_result :: fetch_object ([string $ class_name [, array $ params]])». stdClass используется только если вы ничего не указали.
Andrioid 4.09.2010 08:12:13

Вот еще кое-что, что нужно иметь в виду: на данный момент (PHP 5.2) библиотека PDO содержит ошибки . Он полон странных ошибок. Например: перед сохранением PDOStatementпеременной в переменной следует unset()избегать множества ошибок. Большинство из них были исправлены в PHP 5.3, и они будут выпущены в начале 2009 года в PHP 5.3, что, вероятно, будет иметь много других ошибок. Вам следует сосредоточиться на использовании PDO для PHP 6.1, если вы хотите стабильную версию, и на использовании PDO для PHP 5.3, если вы хотите помочь сообществу.

15
15.12.2008 15:45:02
Я думаю, что преимущества, которые предлагает PDO, заслуживают понимания и работы над ошибками. Сам по себе PHP полон очень обостряющих ошибок, некоторые из которых мы не можем даже эффективно обойти, и все же он предлагает много преимуществ, которые заставляют нас использовать его вместо других вариантов.
Brian Warshaw 10.11.2009 16:55:12
Хм, странно, я никогда не сталкивался с ошибками в PDO. И я этим часто пользуюсь.
NikiC 23.01.2011 10:49:28
Mysqli также имеет ошибки. Все программное обеспечение имеет ошибки.
Bill Karwin 6.05.2013 19:02:44

Ну, вы могли бы поспорить с объектно-ориентированным аспектом, подготовленными утверждениями, фактом, что он становится стандартом, и т. Д. Но я знаю, что большую часть времени, когда кто-то убеждает, лучше работает с функцией убийцы. Итак, вот оно:

Отличная вещь с PDO - вы можете извлекать данные, автоматически вставляя их в объект. Если вы не хотите использовать ORM (потому что это всего лишь быстрый скрипт), но вам нравится сопоставление объектов, это ДЕЙСТВИТЕЛЬНО круто:

class Student {

    public $id;
    public $first_name;
    public $last_name

    public function getFullName() {
        return $this->first_name.' '.$this->last_name
    }
}

try 
{
    $dbh = new PDO("mysql:host=$hostname;dbname=school", $username, $password)

    $stmt = $dbh->query("SELECT * FROM students");

    /* MAGIC HAPPENS HERE */

    $stmt->setFetchMode(PDO::FETCH_INTO, new Student);


    foreach($stmt as $student)
    {
        echo $student->getFullName().'<br />';
    } 

    $dbh = null;
}
catch(PDOException $e)
{
    echo $e->getMessage();
}
243
29.04.2010 09:17:55
есть ли разница между выше и $mysqliResult->fetch_object("student");?
Andy Fleming 15.04.2011 07:18:09
@ E-удовлетворительно нет, я использую PHP. Открытые поля нарушают инкапсуляцию, поэтому AS A BEST PRACTICEэто просто ... lol :) Google не использует открытые поля, только средства доступа: google-styleguide.googlecode.com/svn/trunk/… .
OZ_ 24.05.2011 21:08:12
@ e-sat: Извините, что прыгнул, но геттеры и сеттеры необходимы, если вы хотите контролировать, что происходит при изменении переменных. В противном случае вы просто не можете гарантировать внутреннее состояние вашего объекта (это особенно важно, если у вас есть другой объект внутри). Это полностью не зависит от языка. @ OZ_: успокойся. Личная критика только защитит кого-то другого.
James P. 4.06.2011 17:08:59
@monadic: Согласен. Инкапсуляция, конечно, является действительным аргументом при работе с основными компонентами или сложными объектами и т. Д., Однако как представления записей, которые в противном случае были бы ассоциированными для чтения-записи. массивы, это приемлемо. Кроме того, он позволяет более легкую проверку типов, поскольку записи перемещаются по системе.
Dan Lugg 16.07.2011 00:50:47
@outis Я надеюсь, что я не в меньшинстве, но я не думаю, что нужно судить об их безопасности по отношению к новым разработчикам. Звучит грубо, но это правда. Цель ответа на SO - не просто предоставить код для копирования и вставки, но и для понимания. Задача отвечающего не состоит в том, чтобы гарантировать, что каждая дыра в безопасности или недостаток шаблона рассмотрена в примере, потому что давайте посмотрим правде в глаза, приложение, в которое копируется код, по своей сути отличается от любого другого приложения, использующего тот же код.
Mattygabe 1.09.2011 14:11:50

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

У меня все еще есть ошибки, но если кто-то хочет, вот оно .

Короче говоря, если вы ищете увеличение скорости, то MySQLi; если вы хотите простоту использования, то PDO.

6
30.10.2012 02:41:17
в смысле скорости, не могли бы вы дать ориентиры?
Julius F 28.11.2009 14:44:26
Джонатен Робсон провел приличное сравнение скорости на jonathanrobson.me/2010/06/mysqli-vs-pdo-benchmarks . Резюме: inserts - почти равно, selects - mysqli на ~ 2,5% быстрее для неподготовленных выписок / на 6,7% быстрее для готовых выписок. Учитывая, насколько малы потери производительности, возможности и гибкость использования PDOобычно перевешивают снижение производительности.
Adam 8.03.2011 12:09:25
@ Adam Спасибо за ссылку на мой блог!
jnrbsn 23.03.2012 19:33:54
@ daemonfire300 Это правда, тесты не нужны. PDO оборачивает библиотеку mysqli. Я бы, наверное, поразил поклонника, если бы кто-то мог доказать, что PDO быстрее, чем mysqli. :-D
Dyin 13.01.2013 10:05:53
@jnrbsn ты согласен с Адамом в том, что он сказал?
Basit 2.02.2013 14:47:43

В моем тестовом сценарии каждый метод тестируется 10000 раз, и выводится разница общего времени для каждого метода. Вы должны сделать это в своей собственной конфигурации, я уверен, что результаты будут отличаться!

Вот мои результаты:

  • « SELECT NULL" -> PGO()быстрее на ~ 0,35 секунды
  • « SHOW TABLE STATUS" -> mysqli()быстрее на ~ 2,3 секунды
  • « SELECT * FROM users" -> mysqli()быстрее на ~ 33 секунды

Примечание: используя -> fetch_row () для mysqli, имена столбцов не добавляются в массив, я не нашел способа сделать это в PGO. Но даже если я использую -> fetch_array (), mysqli немного медленнее, но все же быстрее, чем PGO (за исключением SELECT NULL).

4
13.01.2013 11:28:44
Что такое PGO? И быстрее на 33 секунды ?! Мне очень трудно в это поверить ...
Alix Axel 26.07.2011 04:15:48

Еще одно заметное (хорошее) отличие от PDO заключается в том, что его PDO::quote()метод автоматически добавляет заключающие в кавычки, тогда как mysqli::real_escape_string()(и аналогичные) этого не делают:

PDO :: quote () помещает кавычки вокруг входной строки (если требуется) и экранирует специальные символы во входной строке, используя стиль цитирования, соответствующий базовому драйверу.

10
26.07.2011 04:20:45

PDO значительно облегчит масштабирование, если ваш сайт / веб-приложение действительно будет работать, поскольку вы можете ежедневно устанавливать соединения Master и Slave для распределения нагрузки по базе данных, плюс PHP в качестве стандарта движется к переходу на PDO.

Информация о PDO

Масштабирование веб-приложения

8
20.04.2012 22:58:40

Отредактированный ответ.

Имея некоторый опыт работы с обоими этими API, я бы сказал, что есть 2 функции уровня блокировки, которые делают mysqli непригодным для использования с собственно подготовленными операторами.
Они уже упоминались в 2 превосходных (но недооцененных) ответах:

  1. Привязка значений к произвольному количеству заполнителей
  2. Возврат данных в виде простого массива

(оба также упоминаются в этом ответе )

По некоторым причинам mysqli потерпел неудачу с обоими.
В настоящее время он получил некоторое улучшение для второго ( get_result ), но он работает только на установках mysqlnd, что означает, что вы не можете полагаться на эту функцию в своих скриптах.

Тем не менее, он не имеет привязки по стоимости даже по сей день.

Итак, выбор один: PDO

Все остальные причины, такие как

  • именованные заполнители (этот синтаксис сахар слишком переоценен)
  • поддержка различных баз данных (на самом деле никто никогда не использовал ее)
  • извлечь в объект (просто бесполезный синтаксис сахара)
  • разница в скорости (нет)

не имеют никакого существенного значения.

В то же время у обоих этих API отсутствуют некоторые действительно важные функции , такие как

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

Таким образом, для удовлетворения реальных потребностей необходимо создать собственную библиотеку абстракций, основанную на одном из этих API-интерфейсов, реализующую обработанные вручную заполнители. В этом случае я бы предпочел mysqli, поскольку он имеет меньший уровень абстракции.

5
23.05.2017 12:26:35
Наконец, кто-то, кто знает и не отрицает факты жизни ...
Ihsan 2.05.2013 07:15:55