Como posso obter a versão extrapolada de uma consulta parametrizada?
-
22-09-2019 - |
Pergunta
Estou tentando atualizar a biblioteca de banco de dados que usamos no trabalho para usar consultas parametrizadas, para que os colegas de trabalho que não tenham muito conhecimento sobre a injeção de SQL não precisem se lembrar de escapar da entrada e apenas passar em uma matriz de parâmetros (i ' m usando pg_query_params
).
No entanto, estou encontrando um problema. Um dos requisitos da biblioteca de banco de dados é que ele registra cada consulta que é executada e não consigo descobrir uma maneira de obter o texto de uma consulta parametrizada depois que os parâmetros foram preenchidos. Existe alguma maneira de fazer isso ( Além de lançar minha própria função para consultas parametrizadas, eu acho)?
Em outras palavras, ao executar uma consulta parametrizada como
pg_query_params('SELECT id FROM table WHERE foo = $1', array('bar'));
Eu quero conseguir algo como
SELECT id FROM table WHERE foo = 'bar'
Solução
PostgreSQL
protocolo estendido (que é usado por pg_query_params
) separa os parâmetros das consultas.
As consultas são finalmente construídas apenas no lado do servidor, não há como construí -las no lado do cliente usando apenas PostgreSQL
Capacidades.
Você pode substituir os valores dos parâmetros fornecidos e registrar a consulta antes de enviar os parâmetros usando preg_replace
.
Atualizar:
Você pode ativar PostgreSQL
exploração madeireira que registrará as consultas em um arquivo ou syslog
(incluindo parâmetros vinculados) no lado do servidor e depois carregue periodicamente esse arquivo em um PostgreSQL
tabela.
Outras dicas
A menos que você possa substituir todas as ocorrências de PG_QUERY_PARAMS () em seu código -fonte pela sua própria função de wrapper (se puder, convém usar a funcionalidade de prensa automática no PHP para incluir a declaração do invólucro), então você só pode realmente fazer Isso no nível do banco de dados.
C.