MySQL или PDO - каковы плюсы и минусы?

325

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

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

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

  • 5
    Эта статья поможет выбрать, какой использовать. Если вы считаете , производительность это может помочь вам выбрать.
  • 3
    Забавно, сколько людей проголосовало и сняло вопрос, который «не конструктивен». Дело в том, что полная тема очень конструктивна - может быть, модераторы должны учитывать это при оценке того, является ли вопрос конструктивным или нет?
Показать ещё 1 комментарий
Теги:
mysqli
pdo

13 ответов

231

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

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

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();
}
  • 1
    ORM: объектно-реляционное отображение en.wikipedia.org/wiki/Object-relational_mapping
  • 1
    Это хороший пост, но определенно может быть понятнее. Откуда животные попадают в отрывок с классом Person и таблицей Person?
Показать ещё 13 комментариев
55

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

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

25

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

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

  • 2
    Возможно связывание результатов с динамически генерируемыми запросами, мы делаем это в наших приложениях. Это, однако, огромная боль.
  • 1
    Это правильное имя.
17

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

15

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

  • 2
    Я думаю, что преимущества, которые предлагает PDO, заслуживают понимания и работы над ошибками. Сам по себе PHP полон очень обостряющих ошибок, некоторые из которых мы не можем даже эффективно обойти, и все же он предлагает много преимуществ, которые заставляют нас использовать его вместо других вариантов.
  • 11
    Хм, странно, я никогда не сталкивался с ошибками в PDO. И я этим часто пользуюсь.
Показать ещё 1 комментарий
10

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

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

8

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

Информация PDO

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

6

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

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

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

  • 2
    в смысле скорости, не могли бы вы дать ориентиры?
  • 8
    Джонатен Робсон провел приличное сравнение скорости на jonathanrobson.me/2010/06/mysqli-vs-pdo-benchmarks . Сводка: insert s - почти равно, select s - mysqli на ~ 2,5% быстрее для неподготовленных выписок / на 6,7% быстрее для подготовленных выписок. Учитывая малые потери производительности, возможности и гибкость использования PDO обычно перевешивают снижение производительности.
Показать ещё 4 комментария
5

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

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

(оба упомянуты в этом ответе)

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

Однако он не имеет привязки по значению даже по сей день.

Итак, есть только один выбор: PDO

Все другие причины, такие как

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

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

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

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

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

  • 0
    Наконец-то тот, кто знает и не отрицает факты жизни ...
5

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

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

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

  • 22
    MySQLi подготовил заявления.
  • 2
    Я вернулся rFactor ...
4

В тесте script каждый метод проверяется 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).

  • 17
    Что такое PGO? И быстрее на 33 секунды ?! Мне очень трудно в это поверить ...
3

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

  • 19
    На самом деле, вы можете указать класс вручную: «объект mysqli_result :: fetch_object ([string $ class_name [, array $ params]])». stdClass используется только если вы ничего не указали.
-4

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

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

  • 4
    Вы пробовали руководство? php.net/manual/en/mysqli-result.fetch-assoc.php
  • 2
    Внедрял больше времени назад, но да, я проверил руководство. Работает ли это с подготовленными заявлениями? Я сомневаюсь...
Показать ещё 4 комментария
Сообщество Overcoder
Наверх
Меню