MySQL или PDO - каковы плюсы и минусы?
133740 просмотра
13 ответа
Вместо этого мы разделяем использование mysqli и PDO для таких вещей, как подготовленные операторы и поддержка транзакций. Некоторые проекты используют один, некоторые другой. Существует небольшая реалистическая вероятность того, что мы когда-либо перейдем на другую РСУБД.
Я предпочитаю PDO по той единственной причине, что он разрешает именованные параметры для подготовленных операторов, и, насколько я знаю, mysqli этого не делает.
Есть ли другие плюсы и минусы выбора одного стандарта другим, поскольку мы объединяем наши проекты, чтобы использовать только один подход?
Автор: Polsonby Источник Размещён: 11.11.2019 02:07Ответы (13)
243 плюса
Ну, вы могли бы поспорить с объектно-ориентированным аспектом, подготовленными утверждениями, фактом, что он становится стандартом, и т. Д. Но я знаю, что большую часть времени, когда кто-то убеждает, лучше работает с функцией убийцы. Итак, вот оно:
Отличная вещь с 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();
}
Автор: e-satis
Размещён: 15.12.2008 04:49
57 плюса
Перемещение приложения из одной базы данных в другую не очень распространено, но рано или поздно вы можете обнаружить, что работаете над другим проектом с использованием другой СУБД. Если вы работаете дома с PDO, то, по крайней мере, вам будет чему поучиться меньше.
Кроме того, я считаю, что PDO API немного более интуитивно понятен, и он кажется более по-настоящему объектно-ориентированным. mysqli чувствует, что это просто процедурный API, который был объективизирован, если вы понимаете, о чем я. Короче говоря, мне легче работать с PDO, но это, конечно, субъективно.
Автор: Theo Размещён: 17.08.2008 09:5525 плюса
Я начал использовать PDO, потому что поддержка утверждений лучше, на мой взгляд. Я использую слой доступа к данным ActiveRecord-esque, и гораздо проще реализовать динамически генерируемые операторы. Привязка параметров MySQLi должна быть выполнена в одном вызове функции / метода, поэтому, если вы не знаете до времени выполнения, сколько параметров вы хотите связать, вы вынуждены использовать call_user_func_array()
(я считаю, что это правильное имя функции) для выбора , И забудьте о простой динамической привязке результата.
Больше всего мне нравится PDO, потому что это очень разумный уровень абстракции. Его легко использовать в полностью абстрагированных системах, где вы не хотите писать SQL, но это также позволяет легко использовать более оптимизированный, чистый тип запросов или смешивать и сопоставлять их.
Автор: Brian Warshaw Размещён: 08.09.2008 02:1717 плюса
PDO - это стандарт, который ожидает большинство разработчиков. По сути, mysqli был индивидуальным решением конкретной проблемы, но у него есть все проблемы других библиотек, специфичных для СУБД. PDO - это место, где пойдет вся тяжелая работа и умное мышление.
Автор: Dave Gregory Размещён: 10.09.2008 09:5615 плюса
Вот еще кое-что, что нужно иметь в виду: на данный момент (PHP 5.2) библиотека PDO содержит ошибки . Он полон странных ошибок. Например: перед сохранением PDOStatement
переменной в переменной следует unset()
избегать множества ошибок. Большинство из них были исправлены в PHP 5.3, и они будут выпущены в начале 2009 года в PHP 5.3, что, вероятно, будет иметь много других ошибок. Вам следует сосредоточиться на использовании PDO для PHP 6.1, если вы хотите стабильную версию, и на использовании PDO для PHP 5.3, если вы хотите помочь сообществу.
10 плюса
Еще одно заметное (хорошее) отличие от PDO заключается в том, что его PDO::quote()
метод автоматически добавляет заключающие в кавычки, тогда как mysqli::real_escape_string()
(и аналогичные) этого не делают:
Автор: Alix Axel Размещён: 26.07.2011 04:20PDO :: quote () помещает кавычки вокруг входной строки (если требуется) и экранирует специальные символы во входной строке, используя стиль кавычек, соответствующий базовому драйверу.
8 плюса
PDO значительно облегчит масштабирование, если ваш сайт / веб-приложение действительно будет работать, поскольку вы можете ежедневно настраивать соединения Master и Slave для распределения нагрузки по базе данных, плюс PHP в качестве стандарта движется к переходу на PDO.
Масштабирование веб-приложения
Автор: Dfranc3373 Размещён: 20.04.2012 10:586 плюса
В смысле скорости выполнения MySQLi выигрывает, но если у вас нет хорошей оболочки, использующей MySQLi, его функции, связанные с подготовленными операторами, ужасны.
У меня все еще есть ошибки, но если кто-то хочет, вот оно .
Короче говоря, если вы ищете увеличение скорости, то MySQLi; если вы хотите простоту использования, то PDO.
Автор: Joseph Montanez Размещён: 10.04.2009 06:045 плюса
Лично я использую PDO, но я думаю, что это в основном вопрос предпочтений.
PDO имеет некоторые функции, которые помогают против внедрения SQL ( подготовленные операторы ), но если вы осторожны с SQL, вы можете добиться этого и с помощью mysqli.
Переход на другую базу данных - это не столько повод для использования PDO. Пока вы не используете «специальные функции SQL», вы можете переключаться с одной БД на другую. Однако, как только вы используете, например, «SELECT ... LIMIT 1», вы не можете перейти к MS-SQL, где это «SELECT TOP 1 ...». Так что это все равно проблематично.
Автор: BlaM Размещён: 19.08.2008 06:555 плюса
Отредактированный ответ.
Имея некоторый опыт работы с обоими этими API, я бы сказал, что есть 2 функции уровня блокировки, которые делают mysqli непригодным для использования с собственно подготовленными операторами.
Они уже упоминались в 2 превосходных (но недооцененных) ответах:
(оба также упоминаются в этом ответе )
По некоторым причинам mysqli потерпел неудачу с обоими.
В настоящее время он получил некоторое улучшение для второго ( get_result ), но он работает только на установках mysqlnd, что означает, что вы не можете полагаться на эту функцию в своих скриптах.
Тем не менее, он не имеет привязки по стоимости даже по сей день.
Итак, выбор один: PDO
Все остальные причины, такие как
- именованные заполнители (этот синтаксис сахар слишком переоценен)
- поддержка различных баз данных (на самом деле никто никогда не использовал ее)
- извлечь в объект (просто бесполезный синтаксис сахара)
- разница в скорости (нет)
не имеют никакого существенного значения.
В то же время в обоих этих API отсутствуют некоторые действительно важные функции , такие как
- идентификатор заполнителя
- заполнитель для сложных типов данных, чтобы сделать динамическое связывание менее трудоемким
- более короткий код приложения.
Таким образом, для удовлетворения реальных потребностей необходимо создать собственную библиотеку абстракций, основанную на одном из этих API-интерфейсов, реализующую обработанные вручную заполнители. В этом случае я бы предпочел mysqli, поскольку он имеет меньший уровень абстракции.
Автор: Your Common Sense Размещён: 13.01.2013 01:064 плюса
В моем тестовом сценарии каждый метод тестируется 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).
Автор: Dobb Размещён: 14.10.2010 08:433 плюса
PDO имеет то, что MySQLi не нравится мне, это способность PDO возвращать результат как объект определенного класса (например $pdo->fetchObject('MyClass')
). MySQLi fetch_object()
будет только возвращать stdClass
объект.
-4 плюса
Есть одна вещь, которую нужно иметь в виду.
Mysqli не поддерживает функцию fetch_assoc (), которая возвращает столбцы с ключами, представляющими имена столбцов. Конечно, можно написать свою собственную функцию, чтобы сделать это, это даже не очень долго, но мне было очень трудно писать это (для неверующих: если вам кажется, что это легко, попробуйте это самостоятельно и не т обмануть :))
Автор: michal kralik Размещён: 24.09.2008 01:45Вопросы из категории :
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- mysql Двоичные данные в MySQL
- mysql Насколько большой может быть база данных MySQL до того, как производительность начнет снижаться
- mysql Выбрать все столбцы, кроме одного в MySQL?
- mysql MySQL или PDO - каковы плюсы и минусы?
- pdo Are PDO prepared statements sufficient to prevent SQL injection?
- pdo Могут ли операторы PHP PDO принимать имя таблицы или столбца в качестве параметра?
- pdo Как создать параметризованный запрос PDO с помощью оператора LIKE?
- mysqli использование нулей в подготовленном MySQL
- mysqli Commands out of sync; you can't run this command now
- mysqli Неустранимая ошибка: класс «MySQLi» не найден
- database-abstraction PHP PDO - оператор подготовки динамического SQL не работает как жестко запрограммированный
- database-abstraction Использование интерфейсов с golang и абстракцией базы данных
- database-abstraction How do I query for an object with an object array property in MySQL?