Как я могу получить экстраполированную версию параметризованного запроса? - PullRequest
2 голосов
/ 25 января 2010

Я пытаюсь обновить библиотеку базы данных, которую мы используем на работе, чтобы использовать параметризованные запросы, чтобы коллегам, которые не очень хорошо разбираются в SQL-инъекции, не пришлось бы забывать избегать ввода и просто вместо этого передавать массив параметров (Я использую pg_query_params).

Однако я столкнулся с проблемой. Одним из требований библиотеки базы данных является то, что она регистрирует каждый выполняемый запрос, и я не могу найти способ получить текст параметризованного запроса после того, как параметры были заполнены. Есть ли способ сделать это ( я полагаю, кроме собственной функции для параметризованных запросов)?

Другими словами, при выполнении параметризованного запроса, например

pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar'));

Я хочу получить что-то вроде

SELECT id FROM table WHERE foo = 'bar'

Ответы [ 2 ]

2 голосов
/ 25 января 2010

PostgreSQL расширенный протокол (который используется pg_query_params) отделяет параметры от запросов.

В конечном итоге запросы строятся только на стороне сервера, и на стороне клиента их невозможно создать, используя только возможности PostgreSQL.

Вы можете подставить значения предоставленных параметров и зарегистрировать запрос перед отправкой параметров, используя preg_replace.

Обновление:

Вы можете включить PostgreSQL logging , который будет регистрировать запросы в файл или syslog (включая связанные параметры) на стороне сервера, а затем периодически загружать этот файл в таблицу PostgreSQL.

0 голосов
/ 25 января 2010

Если вы не можете заменить каждое вхождение pg_query_params () в вашем исходном коде своей собственной функцией-оболочкой (если вы можете, тогда вы можете использовать функцию автоматического предопределения в PHP, чтобы включить объявление оболочки), тогда вы можете только реально делать это на уровне базы данных.

С

...