С чем едят MySQL prepared statements
пост написан и отправлен в печать 2008-09-24 примерно в 18:50
Правду говорил Анонимус: век живи - век учись. Еще в версии 4.1 в mysql появилась такая вещь, как prepared statements, а узнал я это только вчера, перелистывая от нечего делать умирающий habrahabr - статьи стали занудными копипастами и любительскими переводами, но я не об этом. Что же это за словосочитание, переведенное Google Translate как "подготовленные заявления" =)? Наверняка, каждый, кто хоть раз задумывался о защите своего приложения от инъекций в базу данных, смотрел в сторону библиотек с с поддержкой placeholder-ов, а оказалось, что все это можно делать непосредственно синтаксисом mysql. Вот вам на заметку небольшой ликбез.Использование prepared statements дает неплохой прирост как к безопастности, так и к производительности. Что касается первого, то при подстановке переменных в готовый запрос сервер автоматически экранирует все символы, что в принципе сводит вероятность левого UNION-а, JOIN-а, либо другой пакости к нулю. Что касается скорости, то тут тоже есть свои интересности. Во-первых, при многократно повторяющихся однотипных запросах значительно минимизируется траффик между программой и сервером БД, ну а во-вторых mysql проверяет синтаксис запроса и парсит его всего 1 раз, при инициализации placeholder-а. Вы можете использовать данный функционал на INSERT, DELETE, UPDATE, SELECT и CREATE TABLE запросах. Работает, следуя мануалу, это следующим образом. Сначала подготавливаем запрос для дальнейшего использования PREPARE getgoodprice FROM "SELECT `price` FROM `goods` WHERE `id`=?". После этого можем подставлять значения в плейсхолдер, выполнив SET @goodid = 5. Эту переменную мы и подставляем в запрос EXECUTE getgoodprice USING @goodid, получая аналог запроса SELECT `price` FROM `goods` WHERE `id`=5. Вот так вот все просто. Разумеется, на единичных query намного лучше экранировать передаваемые значения посредством функции языка программирования, но для множества сложных запросов с несколькими параметрами выборки либо сортировки PREPARE подходит на ура. Ах да, из памяти сохраненный запрос удаляется посредством DEALLOCATE PREPARE getgoodpric.