Страницы

Поиск по вопросам

вторник, 16 октября 2018 г.

Для чего нужен prepare в PDO PHP?

Для чего нужен prepare в PDO PHP? Объясните простым языком новичку.


Ответ

Очень хороший вопрос.
Во-первых, для корректного форматирования данных.
Вот здесь есть хорошее объяснение, но оно по-английски.
Если коротко, то любые данные, которые попадают в запрос, должны быть корректно отформатированы. Иначе они смогут вызвать ошибку или того хуже - уязвимость.
Причем форматировать данные надо надо обязательно перед самым исполнением запроса - не раньше. Поэтому форматированием должен заниматься сам драйвер для работы с БД, в данном случае - ПДО.
Когда мы передаем запрос в prepare(), на место подставляемых данных мы подставляем специальные маркеры. А сами данные передаем после, в execute().
Выполняя запрос, PDO подставляет данные на место маркеров, корректно форматируя их. И таким образом в запросе никогда не будет ни ошибки синтаксиса, вызванной данными, ни - тем более - инъекции.
Поэтому prepare()/execute() необходимо использовать всегда, если в запросе используется хотя бы одна переменная.
Примечание. Способы корректного форматирования данных могут быть разными. В частности, в зависимости от настроек, ПДО может не подставлять отформатированные данные сразу в запрос, а отправлять их отдельно. В этом случае при вызове prepare() запрос вместе с маркерами отправляется в БД, а данные едут отдельно от него, после вызова execute(). В этом варианте данные вообще вообще никак не пересекаются с запросом, а попадают прямиком в БД. Принцип другой, но суть одна - отсутствие ошибок синтаксиса.
Во-вторых, для экономии ресурсов при выполнении одинаковых запросов.
Также при раздельной отправке можно немного сэкономить ресурсы сервера. В этом режиме можно вызвать prepare() всего один раз, а затем только отправлять данные через execute(). Таким образом серверу придется парсить запрос только один раз, что немного сократит общее время выполнения запросов. Но особых чудес повышения производительности от этого способа ждать не стоит.
Подставлять ли данные в запрос сразу или отправлять по отдельности, ПДО решает в зависимости от значения настройки PDO::ATTR_EMULATE_PREPARES

Комментариев нет:

Отправить комментарий