OrmaJever пишет:Даже если вы знаете что значение полностью безопастно (сами его генерируете, а не берёте от пользователя), то всёравно лучше вынести его из запроса, такое разделение более правильное Выносят всегда вот почему.
Даже сама фраза "подготовленный запрос" уже намекает, что запрос подготавливается.
Что значит подготавливается?
Он валидируется синтаксически (только в контексте SQL без учета данных, которых еще и нет).
Так же, в некоторых БД текст запроса даже отправляется на сервер чтобы пройти валидацию там, причем не только синтаксическую, но и на наличие таблиц, полей и прочего.
База может (и скорее всего сделает это) заранее просчитать наилучший вариант обработки запроса.
Тут можно положиться на саму базу, а можно указать ей (и структурно и синтаксически) какие индексы конкретно использовать или в каком порядке выполнять вычисления.
На любом из этапов валидации (подготовки) запроса может что-то пойти не так, и мы сразу узнаем об этом, т.к. процесс будет прерван.
Действительно, зачем пытаться лопатить миллионную таблицу, если в запросе синтаксическая или иная ошибка?
Успешно подготовленный запрос, если это делалось прямо на клиенте (в драйвере), вместе с подставленными данными (эскейпинг которых проходит в драйвере(?)) отправляется наконец в базу для выполнения.
А если подготовка проходила уже в базе, то успешно подготовленный запрос лежит в памяти базы и ждет от нас данные для подстановки.
Т.е. мы отправляем только данные (эскейпинг которых проходит в драйвере(?)) для подстановки.
И тут наконец сам запрос и выполняется.
И во время выполнения уже точно никаких ошибок не возникнет.
И мы можем быть уверены что получим результат.
Даже если мы получим ноль строк -- это результат на основании условий запроса.
Ну да, для инсертов или апдейтов конечно может произойти ошибка во время выполнения.
Например попытка дублировать уникальный ключ. И все такое.
Но это уже мелочи.
З.Ы.: Хренасе я тут расписал ))
|