Как я могу получить экстраполированную версию параметризованного запроса?


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

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

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

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

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

SELECT id FROM table WHERE foo = 'bar'
Author: Daniel Vandersluis, 2010-01-25

2 answers

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

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

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

Обновление:

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

 2
Author: Quassnoi, 2010-01-25 15:15:35

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

C.

 0
Author: symcbean, 2010-01-25 19:17:18