За последние 24 часа нас посетили 17589 программистов и 1718 роботов. Сейчас ищут 875 программистов ...

PDO vs MySQLi

Тема в разделе "PHP и базы данных", создана пользователем Ostic, 13 янв 2017.

  1. Ostic

    Ostic Активный пользователь

    С нами с:
    21 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте.
    Сравниваю два API: MySQLi и PDO.
    Заинтересовали два момента
    1. API поддерживает асинхронные, неблокирующие запросы mysqlnd
    2. API поддерживает подготовленные запросы на стороне клиента
    Что за асинхронные запросы и запросы подготовленные на стороне клиента?
    В каких случаях они применяются. Данные понятия знакомы, но непонятно как это к PHP привязать...
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Теоретик из меня никудышный, поэтому постараюсь объяснить, как могу.
    1. Вы знакомы с Ajax? Помните, что запросы можно отправлять синхронно и асинхронно? В первом случае, работа сценария будет блокироваться, браузер зависнет на время выполнения запроса. А во втором случае, можно отправлять несколько запросов параллельно и при этом остальной код будет выполняться не дожидаясь ответа от сервера.
    2. Некоторые драйверы не поддерживают подготавливаемые запросы. В таком случае, их можно эмулировать средствами PDO. Я думаю, что именно это имелось в виду под фразой "на стороне клиента". Грубо говоря, если у вас PHP5.3, а до боли нужна функция, например, array_column, то что делаете вы? А вы пишите полифилл, который эмулирует работу этой функции.
    --- Добавлено ---
    И да... Не правильная постановка вопроса. И то, и другое - это скорее приимущество, чем средство. Хотя, эмуляцию можно указать на постоянной основе, а можно отдать на усмотрение PDO. Если драйвер не будет поддерживать, то подготовка запроса сбросится автоматом на плечи PDO
     
  3. Ostic

    Ostic Активный пользователь

    С нами с:
    21 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    1. Да, с ES знаком. Не понимаю как это применяется в PHP при работе с MySQL(например)
    2. С подготавливаемыми запросами тоже познакомился, но это доступно как в PDO, так и MySQLi. Что значит подготавливаемые на стороне клиента?
     
  4. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    в mysqli очень неудобная реализация подготовленных запросов. но если хотите исследовать именно асинхронные вещи, то это возможно только в рамках mysqli. вот нужно ли — хз. ни разу не видел практического применения этих штук, одни только учебные примеры.
    --- Добавлено ---
    про "подготовленные запросы на стороне клиента": в этом контексте клиентом называем сторону PHP, а не браузер конечно :) а сервер это сервер БД. он физически мождет быть на том же хосте, а может и на другом, не принципиально.

    настоящие подготовленные запросы всегда серверные. однако PDO по умолчанию эмулирует подготовленные запросы. т.е. реально на сервер отправляется только полностью сформированный текст запроса с уже вкоряченными параметрами. можно это дело изменить, читай официальные доки.
     
  5. Ostic

    Ostic Активный пользователь

    С нами с:
    21 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    я пока даже и примеров не видел. пока пропущу.
    о, теперь дошло.
    в мануале вот как описано:
    API поддерживает подготовленные запросы на стороне клиента
    MySQLi - нет
    PDO - да

    Вы сами что используете при работе с MySQL?
    Еще вопрос, кстати: MariaDB полностью совместима с данными API или есть баги?
     
  6. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    на стороне клиента это и есть эмуляция подготовленных запросов. по умолчанию PDO эмулирует п.з.. по форме это выглядит как подготовленные запросы, реально же это типа mysqli_real_escape_string, который обернут в более удобную оболочку.

    настоящие (серверные) подготовленные запросы отличаются тем, что сервер готовит их один раз — "строит план запроса" — а выполняет сколько угодно раз. этим на простых запросах достигается заметный выигрыш в производительности.

    использую PDO.

    MySQL/MariaDB — для апи нет разницы. расширения php это всего-лишь транспорт доставки запросов. а разница в дополнительных возможностях самого языка SQL. мария развивается быстрее. на текущий момент у меня нет проектов, где бы я мог позволить себе отказаться от обратной совместмости :(
     
    Ostic нравится это.
  7. Ostic

    Ostic Активный пользователь

    С нами с:
    21 апр 2015
    Сообщения:
    9
    Симпатии:
    0
    какие параметры Вы используете для конструктора?
    у меня после прочтения документации получилось так
    PHP:
    1. $options = array(
    2.     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
    3.     PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    4.     PDO::ATTR_TIMEOUT => 3
    5. );
    6. try {
    7. $dbh = new PDO($dsn, $username, $password, $options);
    8. } catch (PDOException $e) {
    9.     die("Не удалось подключиться: " . $e->getMessage());
    10. }
    какие опции может еще следует учесть? (в мануале их много. я только эти выделил)
    Вы как подключение устанавливаете? Также?
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Я не верю в асинхронный пхп