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

Что такое PDO и его отличия от Mysql?

Тема в разделе "PHP и базы данных", создана пользователем web_chainik, 2 апр 2018.

  1. web_chainik

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

    С нами с:
    1 ноя 2016
    Сообщения:
    36
    Симпатии:
    1
    Приветствую всех. Вопрос так сказать, к бывалым. Сам начинающий программист и до сих пор нужды мои удовлетворялись Denwer, PHP My Admin, скриптами из интернет, что-то оставлял, что-то правил под себя... Вот сейчас хочу пойти дальше, попробовать написать свой небольшой движок блога. Посоветовали использовать PDO (так как со временем я хотел бы расширять функционал и сделать удобную админ панель), я немного прочитал о нём, но так и не понял для чего он нужен и как к нему подойти... Так в чём же отличия? Например у меня есть наработки для работы с MySql, ну то есть, проверки разные, выборка данных, актуально ли это останется для PDO?
     
    glorsh66 нравится это.
  2. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Если кратко то pdo поддерживает различные бд а mysqli только mysql. Может Laravel попробуешь? Там на доках и научишься.
     
  3. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    При том, что сам я давно "подсел" на PDO, думаю, что вам привычней будет использовать MySQLi. В плане самих запросов, ничего не изменилось: как вы составляли его в MySQL, так и продолжаете в дальнейшем. Изменился подход, а если точнее, то разделение между строкой запроса и данными извне, которые подставляются в этот запрос (подготавливаемые запросы: в MySQLi и PDO), что добавляет защиту от SQL-инъекций. Кстати, заметил, что многие новички, почему-то игнорируют эту возможность. Переходить на то или иное расширение придётся, т.к. в версиях PHP7+, старое MySQL уже удалено и работать с ним не получиться при всём желании.
    --- Добавлено ---
    P.S. Если всё-таки решите использовать PDO, то для быстрого ознакомления, пробегитесь по этой статье.
     
  4. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    FETCH_BIND в PDO говно
     
  5. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Куда ж без него :D
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.794
    Симпатии:
    1.330
    Адрес:
    Лень
    когда только лерму писал, тестировал выходные результаты каждых производителей.
    Один из нюансов в чем пропалился он
    В ПДО возвращаемый результат биндился с типом данных only string,
    в mysqli все шикарно выходило
     
  7. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    По умолчанию - да.
    Если под "FETCH_BIND" имелась в виду константа "PDO::FETCH_BOUND", тo во время привязки у методов bindColumn и bindParam, есть третий параметр - тип.

    PHP:
    1. <?php
    2. $sth->bindColumn(1, $int_id, \PDO::PARAM_INT); // по-любому integer
    3. $sth->bindColumn(1, $int_id, \PDO::PARAM_STR); // по-любому string
    4. $sth->bindColumn(1, $int_id, \PDO::PARAM_BOOL ); // boolean
    5. // и т.д.
     
  8. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Кстати, пользуясь случаем спрошу - а как они работают под "капотом"? эти так называемые подготовленные запросы.

    Ведь получается PHP также просто тупо готовит строку запроса и отправляет целиком? Единственное в чем отличие что он экранирует данные?

    Ведь я правильно понимаю что PHP когда установил соединение с базой использует такой же SQL как и пользователь в "ручном" режиме?
    В чем фишка и соль этих подготовленных запросов?

    Т.е. будет ли как то отличаться запрос который будет послан PHP в MYSQL
    на 3 разных драйверах - MYSQL,MYSQLI,PDO
    "UPDATE MyGuests SET lastname='Doe' WHERE id=2"


    Или PDO и MYSQLI физически отделяет сам запрос и данные и шлет их отдельно?
    Как тогда MYSQL понимает очередность данных(ведь должен быть тогда какой то разделитель?)
    --- Добавлено ---
    И получается mysqli сам определяет нужный тип данных?
    Т.е. как в таблице написанно он так и возвращает? А в PDO нужно в ручную приводить типы или биндить?
     
  9. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Нет. Главное отличие подготавливаемых запросов в том, что идёт чёткое разделение между строкой запроса и внешними данными, которые принимают участие в запросе.
    Любые такие данные, воспринимаются исключительно как значение (напр., в условиях), но никогда, как продолжение или часть самого запроса. Т.е. это нам даёт дополнительную защиту от SQL-инъекций.
    Да, я согласен, что совсем не обязательно всегда и везде использовать подготавливаемые запросы, но когда данные получены от клиента и, если ожидается не простое числовое значение, которое легко "обезвредить" приведя к соответствующему типу, то преимущества становятся очевидны.
    По умолчанию, в PDO данные считаются строковыми. Биндить не обязательно, можно использовать неименованные плейсхолдеры. ... если вы об этом. Лично я ими чаще всего и пользуюсь, а обрабатываю полученные данные с помощью фильтрующих функций: filter_input/filter_input_array и т.д..
     
  10. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    PHP:
    1. $id = $_GET['id']; // '; drop table users;
    2. select * from users where id='id'
     
  11. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Не это я понимаю)

    Вопрос в другом - как тоже PDO или mysqli отправляет запрос на сервер?

    Ведь в SQL каждый запрос заканчивается ;
    четко.


    Как можно например отдельно отправить на сервер СУБД
    Код (Text):
    1. select * from users where id=?;
    а потом вторым запросом
    Код (Text):
    1. ; drop table users;
    (Экранированные я так понимаю)

    Или там типа постоянного соединения устанавливается?

    Или типа такой структуры в ОДНОМ запросе?
    Код (Text):
    1. select * from users where id=? values(';drop table users;');
    Т.е. PDO просто добавляется VALUES (или какую то другую структуру, и какую мне вот и интересно☻)


    И может они еще какие магические свойства имеют? Ну типа кэшируются лучше на MYSQL
    --- Добавлено ---
    Или это вообще другой инструмен и PDO кодирует комманды SQL в какие то хитрые символы (не буквы) и запрос приходит отдельно Не на языке SQL, после чего висит соединение и ждет Данных.
    Т.е. транслируя SQL на нечто другое..
     
  12. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Ведь я правильно понимаю что это драйвер? Т.е. это нечто больше чем просто оболочка над sql?
    А как тогда реализован odbc ?
     
  13. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    @glorsh66, каждый запрос не обязательно заканчивается терминатором (; по-умолчанию). Особенно если он один.
    PDO "определяет простой и согласованный интерфейс для доступа к базам данных в PHP", как написано во введении к PDO.
    На странице "краткого обзора" описан ряд терминов и их взаимоотношения.
     
    glorsh66 нравится это.
  14. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    Ну там очень заумно написано.
    Тут даже не "абстрактно" а не рассказывая сути)

    У них даже в статье написанно что термины иногда путаются.