Приветствую всех. Вопрос так сказать, к бывалым. Сам начинающий программист и до сих пор нужды мои удовлетворялись Denwer, PHP My Admin, скриптами из интернет, что-то оставлял, что-то правил под себя... Вот сейчас хочу пойти дальше, попробовать написать свой небольшой движок блога. Посоветовали использовать PDO (так как со временем я хотел бы расширять функционал и сделать удобную админ панель), я немного прочитал о нём, но так и не понял для чего он нужен и как к нему подойти... Так в чём же отличия? Например у меня есть наработки для работы с MySql, ну то есть, проверки разные, выборка данных, актуально ли это останется для PDO?
Если кратко то pdo поддерживает различные бд а mysqli только mysql. Может Laravel попробуешь? Там на доках и научишься.
При том, что сам я давно "подсел" на PDO, думаю, что вам привычней будет использовать MySQLi. В плане самих запросов, ничего не изменилось: как вы составляли его в MySQL, так и продолжаете в дальнейшем. Изменился подход, а если точнее, то разделение между строкой запроса и данными извне, которые подставляются в этот запрос (подготавливаемые запросы: в MySQLi и PDO), что добавляет защиту от SQL-инъекций. Кстати, заметил, что многие новички, почему-то игнорируют эту возможность. Переходить на то или иное расширение придётся, т.к. в версиях PHP7+, старое MySQL уже удалено и работать с ним не получиться при всём желании. --- Добавлено --- P.S. Если всё-таки решите использовать PDO, то для быстрого ознакомления, пробегитесь по этой статье.
когда только лерму писал, тестировал выходные результаты каждых производителей. Один из нюансов в чем пропалился он В ПДО возвращаемый результат биндился с типом данных only string, в mysqli все шикарно выходило
По умолчанию - да. Если под "FETCH_BIND" имелась в виду константа "PDO::FETCH_BOUND", тo во время привязки у методов bindColumn и bindParam, есть третий параметр - тип. PHP: <?php $sth->bindColumn(1, $int_id, \PDO::PARAM_INT); // по-любому integer $sth->bindColumn(1, $int_id, \PDO::PARAM_STR); // по-любому string $sth->bindColumn(1, $int_id, \PDO::PARAM_BOOL ); // boolean // и т.д.
Кстати, пользуясь случаем спрошу - а как они работают под "капотом"? эти так называемые подготовленные запросы. Ведь получается PHP также просто тупо готовит строку запроса и отправляет целиком? Единственное в чем отличие что он экранирует данные? Ведь я правильно понимаю что PHP когда установил соединение с базой использует такой же SQL как и пользователь в "ручном" режиме? В чем фишка и соль этих подготовленных запросов? Т.е. будет ли как то отличаться запрос который будет послан PHP в MYSQL на 3 разных драйверах - MYSQL,MYSQLI,PDO "UPDATE MyGuests SET lastname='Doe' WHERE id=2" Или PDO и MYSQLI физически отделяет сам запрос и данные и шлет их отдельно? Как тогда MYSQL понимает очередность данных(ведь должен быть тогда какой то разделитель?) --- Добавлено --- И получается mysqli сам определяет нужный тип данных? Т.е. как в таблице написанно он так и возвращает? А в PDO нужно в ручную приводить типы или биндить?
Нет. Главное отличие подготавливаемых запросов в том, что идёт чёткое разделение между строкой запроса и внешними данными, которые принимают участие в запросе. Любые такие данные, воспринимаются исключительно как значение (напр., в условиях), но никогда, как продолжение или часть самого запроса. Т.е. это нам даёт дополнительную защиту от SQL-инъекций. Да, я согласен, что совсем не обязательно всегда и везде использовать подготавливаемые запросы, но когда данные получены от клиента и, если ожидается не простое числовое значение, которое легко "обезвредить" приведя к соответствующему типу, то преимущества становятся очевидны. По умолчанию, в PDO данные считаются строковыми. Биндить не обязательно, можно использовать неименованные плейсхолдеры. ... если вы об этом. Лично я ими чаще всего и пользуюсь, а обрабатываю полученные данные с помощью фильтрующих функций: filter_input/filter_input_array и т.д..
Не это я понимаю) Вопрос в другом - как тоже PDO или mysqli отправляет запрос на сервер? Ведь в SQL каждый запрос заканчивается ; четко. Как можно например отдельно отправить на сервер СУБД Код (Text): select * from users where id=?; а потом вторым запросом Код (Text): ; drop table users; (Экранированные я так понимаю) Или там типа постоянного соединения устанавливается? Или типа такой структуры в ОДНОМ запросе? Код (Text): select * from users where id=? values(';drop table users;'); Т.е. PDO просто добавляется VALUES (или какую то другую структуру, и какую мне вот и интересно☻) И может они еще какие магические свойства имеют? Ну типа кэшируются лучше на MYSQL --- Добавлено --- Или это вообще другой инструмен и PDO кодирует комманды SQL в какие то хитрые символы (не буквы) и запрос приходит отдельно Не на языке SQL, после чего висит соединение и ждет Данных. Т.е. транслируя SQL на нечто другое..
Ведь я правильно понимаю что это драйвер? Т.е. это нечто больше чем просто оболочка над sql? А как тогда реализован odbc ?
@glorsh66, каждый запрос не обязательно заканчивается терминатором (; по-умолчанию). Особенно если он один. PDO "определяет простой и согласованный интерфейс для доступа к базам данных в PHP", как написано во введении к PDO. На странице "краткого обзора" описан ряд терминов и их взаимоотношения.
Ну там очень заумно написано. Тут даже не "абстрактно" а не рассказывая сути) У них даже в статье написанно что термины иногда путаются.