Intereting Posts
Symfony 2 Forward Request, проходящий по параметрам GET / POST Предупреждение: mysqli_fetch_assoc () ожидает, что параметр 1 будет mysqli_result, boolean задан в .. Тогда моя строка AJAX + jQuery … Переменные, не переходящие на PHP Количество эхо-записей MySQL, которое имеет одинаковый идентификатор сеанса Агенты для тестирования модулей (геттеры и сеттеры) CodeIgniter все страницы перенаправляются на главную страницу? Есть ли у кого-нибудь рекомендации для хорошей (и легкой!) Библиотеки почтовых программ PHP? Почему, если я зарегистрировался на своем веб-сайте как зарегистрированный пользователь, я не могу получить доступ к другим страницам после установки правил сеанса? jQuery .load PHP в Div -not work- Автоматическая аутентификация htaccess (401) имя пользователя логин пароль SQL Server 2008 возвращает «Предел памяти, превышающий 10240 КБ для буферизованного запроса» Как str_replace раздел PHP Code Что делает функция getName в symfony 2 form Ошибка PHP: нельзя использовать объект типа stdClass как массив (проблемы с массивом и объектом) Вызов функции-члена bind_param () для объекта, не являющегося объектом

mysqli или PDO – каковы плюсы и минусы?

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

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

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

Related of "mysqli или PDO – каковы плюсы и минусы?"

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

Действительно хорошая вещь с 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(); } 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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