Как я могу получить экстраполированную версию параметризованного запроса?
-
22-09-2019 - |
Вопрос
Я пытаюсь обновить библиотеку базы данных, которую мы используем на работе, для использования параметризованных запросов, чтобы коллегам, которые не очень разбираются в SQL-инъекциях, не приходилось забывать избегать ввода и вместо этого просто передавать массив параметров (я использую pg_query_params
).
Однако я сталкиваюсь с проблемой.Одним из требований библиотеки базы данных является то, что она регистрирует каждый выполняемый запрос, и я не могу придумать способ получить текст параметризованного запроса после заполнения параметров.Есть ли какой-нибудь способ сделать это (я полагаю, помимо развертывания моей собственной функции для параметризованных запросов)?
Другими словами, при выполнении параметризованного запроса типа
pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar'));
Я хочу получить что-то вроде
SELECT id FROM table WHERE foo = 'bar'
Решение
PostgreSQL
расширенный протокол (который используется pg_query_params
) отделяет параметры от запросов.
Запросы в конечном счете создаются только на стороне сервера, нет способа создать их на стороне клиента, используя только PostgreSQL
возможности пользователя.
Вы можете подставить значения предоставленных параметров и протоколировать запрос перед отправкой параметров, используя preg_replace
.
Обновить:
Вы можете включить PostgreSQL
ведение журнала который будет записывать запросы в файл или syslog
(включая связанные параметры) на стороне сервера, затем периодически загружайте этот файл в PostgreSQL
таблица.
Другие советы
Если вы не можете заменить каждое вхождение pg_query_params() в вашем исходном коде своей собственной функцией-оболочкой (если вы можете, то, возможно, захотите использовать функцию автоматического добавления в PHP для включения объявления оболочки), то вы действительно можете сделать это только на уровне базы данных.
C.