Переход от mysqli к PDO

Boris

Новичок
Добрый день!
Используя mysqli я подготавливал запрос используя mysqli_real_escape_string, ну и конечно проверяя валидность данных вводимых пользователем и т.д.
Сейчас хочу попробовать и перейти на PDO.
Скажите я правильно понял, что теперь мне надо использовать связку :
PDO::prepare()
и
PDOStatement::execute()
где первая подготавливает запрос, а вторая непосредственно запускает,
тем самым я выполню функцию экранирования и защиты от SQL инъекций, как в случае использования mysqli_real_escape_string в mysqli
Спасибо всем.
P.S.Пожалуйста не отправляйте ссылками на http://php.net/ , я там был читал , а сейчас просто хочу понять или я правильно понял.
 

Hello

Новичок
Добрый день!
Используя mysqli я подготавливал запрос используя mysqli_real_escape_string, ну и конечно проверяя валидность данных вводимых пользователем и т.д.
Сейчас хочу попробовать и перейти на PDO.
Скажите я правильно понял, что теперь мне надо использовать связку :
PDO::prepare()
и
PDOStatement::execute()
где первая подготавливает запрос, а вторая непосредственно запускает,
тем самым я выполню функцию экранирования и защиты от SQL инъекций, как в случае использования mysqli_real_escape_string в mysqli
Спасибо всем.
P.S.Пожалуйста не отправляйте ссылками на http://php.net/ , я там был читал , а сейчас просто хочу понять или я правильно понял.
Почти правильно.
Но экранироваться будет только то, что передано в PDOStatement::execute() или (PDOStatement::bindParam), сам по себе PDO::prepare() не будет безопасным, если в него будут передоваться стороннии данные
 

Boris

Новичок
Почти правильно.
Но экранироваться будет только то, что передано в PDOStatement::execute() или (PDOStatement::bindParam), сам по себе PDO::prepare() не будет безопасным, если в него будут передоваться стороннии данные
т.е чтобы он был полностью безопасным надо предавать данные через плейсхолдеры?
 

Boris

Новичок
И правильно указывать кодировку подключения.
а что значит правильно? у меня вот так, это правильно?
$dbh->query("SET NAMES 'utf8'");
$dbh->query("SET character_set_client 'utf8'");
$dbh->query("SET character_set_results 'utf8'");
$dbh->query("SET collation_connection 'utf8_general_ci'");

Скажите а как с помощью PDO делать сложные динамические запросы которые включают и IN и GROUP BY и JOIN и LIMIT ??? получается надо продумать подготовленные выражения, а потом передать массив переменных и не ошибиться в последовательности, правильно я понял? Это довольно сложно сделать, на мой взгляд, или есть что то , чего я не знаю?
 
Последнее редактирование:

Boris

Новичок
Может таки прочитаешь уже?
да прочитал, именно что прочитал и вижу что есть свои преимущества но становится намного сложнее. Поэтому и спрашиваю
Скажите а как с помощью PDO делать сложные динамические запросы которые включают и IN и GROUP BY и JOIN и LIMIT ??? получается надо продумать подготовленные выражения, а потом передать массив переменных и не ошибиться в последовательности, правильно я понял? Это довольно сложно сделать, на мой взгляд, или есть что то , чего я не знаю?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@Boris, еще раз скопируй свой вопрос, а то мы не поняли ;) Тебе придется взять обертку над PDO, которая позволяет делать то, что тебе надо, либо написать свою.

И, да, сложные динамические запросы тебе писать рано. Если такие вопросы возникают - не пиши. Лучше сделать два запроса, чем 1, но плохой.
 

Boris

Новичок
@Boris, еще раз скопируй свой вопрос, а то мы не поняли ;) Тебе придется взять обертку над PDO, которая позволяет делать то, что тебе надо, либо написать свою.

И, да, сложные динамические запросы тебе писать рано. Если такие вопросы возникают - не пиши. Лучше сделать два запроса, чем 1, но плохой.
Да причем тут это, у меня достаточно опыта для сложных вопросов, но в силу тех возможностей которые мне дает хостинг, мне надо как то выворачиваться. При использовании mysqli было все понятно, а с подстановкой возникают вопросы, которые я и пытаюсь выяснить тут, перед тем как спросить я почитал инфу в нете, но как всегда там примеры простых вещей, и среди них я не нашел ответ на мой вопрос. Спасибо конечно что Вы даете ссылки на интересные и полезные статьи, но иногда нужен ответ исходя из опыта разработки а не на основании букваря
 

Boris

Новичок
скажите а как при работе с PDO посмотреть запрос перед выполнением, ну если вдруг опечатка или еще что то?
 

Sufir

Я не волшебник, я только учусь
скажите а как при работе с PDO посмотреть запрос перед выполнением, ну если вдруг опечатка или еще что то?
Тебе придется взять обертку над PDO, которая позволяет делать то, что тебе надо, либо написать свою.
 

Boris

Новичок
ок подскажите какую обертку взять, что посоветуете @Sufir,
и вообще, опытные пользователи, скажите если для PDO нужно куча приблуд, то чем он лучше mysqli который позволяет так же работать и с ооп и при этом есть функция mysqli_real_escape_string, которая в связке с проверками и валидациями, противостоит инъекциям, да у нее нет возможности перехода на различные базы данных и нет подготовленных выражений и множественных выполнений ну и что, зато нет столько проблем с работой IN LIKE и т.д.
Объясните, мне кажется многие начинающие посмотрят эту тему и перед тем как столкнуться с проблемами выберут правельный способ подключения и работы с бд.
Заранее спасибо
 
Последнее редактирование:

Sufir

Я не волшебник, я только учусь
@Boris, лично я для построения и выполнения запросов к БД использую инструменты предоставляемые тем фреймворком, который применяю для разработки проекта и мне без разницы, в общем, PDO-ли вообще за ними или что-то ещё (т.к. PDO "делает много того, что должна делать библиотека для работы с SQL, но ещё больше она не делает", о чем речь идет здесь), но это уже несколько другая тема. Например:
https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/db-dao.md
https://github.com/yiisoft/yii2/blob/master/docs/guide-ru/db-query-builder.md
http://doctrine-orm.readthedocs.org/projects/doctrine-orm/en/latest/reference/query-builder.html
http://framework.zend.com/manual/current/en/modules/zend.db.sql.html
Так-же, пакагист, к твоим услугам https://packagist.org/search/?q=pdo wrapper
 

Boris

Новичок
@Sufir, спасибо Вам большое

кстати нашел как быстро посмотреть ошибку в запросе $arr = $stmt->errorInfo();
во всяком случае раньше с mysqli я копировал созданный запрос и запускал его в MySQL
да да сам знаю глупо

подскажите еще, везде написано что связка PDO::prepare() и PDOStatement::execute() обеспечивает 100% защиту от SQL инъекций, а за счет чего это происходит, какой механизм защиты? будьте добры дайте ссылку где про это прочитать. Спасибо
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Никаких проблем у пдо с LIKE нет и не может быть в принципе.
Проблемы есть только в головах у пользователей похапе, которые пишут код не приходя в сознание.
Если хотя бы раз в жизни задуматься над тем, как работает оператор LIKE, то все "проблемы" исчезнут навсегда.

Какие себе можно придумать проблемы с джойном или группировкой - и вовсе загадка.

Смотреть "готовый" запрос в пдо не нужно. Поскольеу никаких ошибок, вызванных данными, в нем в принципе не бывает.
Если тебя интересует SQL с плейсхолдерами, то найди в учебнике главу про оператор echo.
Если ты в принципе не знаешь, что за запрос ты пишешь, то его надо отрабатывать к консоли ДО выполнения в пхп, а не после.

errorInfo тебе не нужно. Правильно сконфигурированный пдо сам сообщит об ошибке
 
Последнее редактирование:

AnrDaemon

Продвинутый новичок
подскажите еще, везде написано что связка PDO::prepare() и PDOStatement::execute() обеспечивает 100% защиту от SQL инъекций, а за счет чего это происходит, какой механизм защиты? будьте добры дайте ссылку где про это прочитать. Спасибо
Третий раз за топик: http://phpfaq.ru/pdo
 

Boris

Новичок
подскажите еще, везде написано что связка PDO::prepare() и PDOStatement::execute() обеспечивает 100% защиту от SQL инъекций, а за счет чего это происходит, какой механизм защиты? будьте добры дайте ссылку где про это прочитать. Спасибо
Нет. Идите читать документацию ещё раз. Там ЭТО написано. Если вы ЭТО пропустили, это только ваша проблема.
@AnrDaemon, тыкни меня носом где именно , в какой документации?
 

Boris

Новичок
кроме этого : ВАЖНО: Подготовленные выражения - основная причина использовать PDO, поскольку этоединственный безопасный способ выполнения SQL запросов, в которых участвуют переменные.
Не увидел ясного разъяснения . @AnrDaemon, ни тыкни пальцем,многословный Вы наш, где в статье описан процесс безопасности
 
Сверху