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