В нашем месте мы разделились между использованием mysqli и PDO для таких вещей, как подготовленные заявления и поддержка транзакций. Некоторые проекты используют один, другой – другой. Существует мало реальной вероятности того, что мы когда-нибудь перейдем на другую СУБД.
Я предпочитаю PDO по той единственной причине, что он позволяет именованным параметрам для подготовленных операторов, и насколько я знаю, mysqli этого не делает.
Существуют ли какие-либо другие плюсы и минусы для выбора одного из них в качестве стандарта, поскольку мы консолидируем наши проекты, чтобы использовать только один подход?
Ну, вы можете спорить с объектно-ориентированным аспектом, подготовленными утверждениями, тем, что он становится стандартом и т. Д. Но я знаю, что большую часть времени убеждал, что кто-то лучше работает с функцией убийцы. Итак, вот оно:
Действительно хорошая вещь с 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 непригодным для использования с собственными подготовленными операторами.
Они уже упоминались в двух замечательных (но недооцененных) ответах:
(оба упомянутые в этом ответе )
По какой-то причине 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 чит :))