Сведения о вопросе

FromRussia

04:14, 25th August, 2020

Теги

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

Просмотров: 881   Ответов: 13

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

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

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



  Сведения об ответе

PHPH

07:06, 16th August, 2020

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

Действительно хорошая вещь с PDO - это то, что вы можете получить данные, автоматически вводя их в объект. Если вы не хотите использовать ORM (потому что это просто быстрый скрипт), но вам нравится отображение объектов, это REALLY круто :

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();
}


  Сведения об ответе

Chhiki

02:41, 5th August, 2020

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

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


  Сведения об ответе

COOL

18:36, 21st August, 2020

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

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


  Сведения об ответе

PHPH

11:43, 13th August, 2020

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


  Сведения об ответе

screen

21:06, 1st October, 2020

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


  Сведения об ответе

ЯЯ__4

06:47, 20th August, 2020

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

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


  Сведения об ответе

ASSembler

15:32, 29th August, 2020

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

PDO информация

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


  Сведения об ответе

dump

21:47, 19th August, 2020

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

В моем все еще есть жучки, но если кто-то хочет этого, вот он .

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


  Сведения об ответе

VERSUION

04:41, 23rd August, 2020

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

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

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


  Сведения об ответе

JUST___

21:47, 9th August, 2020

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

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

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

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

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

Тем не менее, он не имеет bind-by-value даже по сей день.

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

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

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

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

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

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

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


  Сведения об ответе

screen

04:28, 2nd August, 2020

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


  Сведения об ответе

#hash

05:30, 11th August, 2020

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


  Сведения об ответе

PHPH

20:50, 3rd August, 2020

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться