Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Obtendo a string de consulta SQL bruta de instruções preparadas pelo PDO


Suponho que você queira dizer que deseja a consulta SQL final, com valores de parâmetro interpolados nela. Entendo que isso seria útil para depuração, mas não é assim que as instruções preparadas funcionam. Os parâmetros não são combinados com uma instrução preparada no lado do cliente, portanto, o PDO nunca deve ter acesso à string de consulta combinada com seus parâmetros.

A instrução SQL é enviada ao servidor de banco de dados quando você prepara(), e os parâmetros são enviados separadamente quando você executa(). O log geral de consultas do MySQL mostra o SQL final com valores interpolados após você executar(). Abaixo está um trecho do meu log de consulta geral. Executei as consultas do mysql CLI, não do PDO, mas o princípio é o mesmo.
081016 16:51:28 2 Query       prepare s1 from 'select * from foo where i = ?'
                2 Prepare     [2] select * from foo where i = ?
081016 16:51:39 2 Query       set @a =1
081016 16:51:47 2 Query       execute s1 using @a
                2 Execute     [2] select * from foo where i = 1

Você também pode obter o que deseja se definir o atributo PDO PDO::ATTR_EMULATE_PREPARES. Nesse modo, o PDO interpola parâmetros na consulta SQL e envia a consulta inteira quando você executa(). Esta não é uma consulta preparada de verdade. Você contornará os benefícios das consultas preparadas interpolando variáveis ​​na string SQL antes de executar().

Comentário de @afilina:

Não, a consulta SQL textual não combinado com os parâmetros durante a execução. Portanto, não há nada para o PDO mostrar.

Internamente, se você usa PDO::ATTR_EMULATE_PREPARES, o PDO faz uma cópia da consulta SQL e interpola os valores dos parâmetros nela antes de preparar e executar. Mas o PDO não expõe essa consulta SQL modificada.

O objeto PDOStatement tem uma propriedade $queryString, mas isso é definido apenas no construtor do PDOStatement e não é atualizado quando a consulta é reescrita com parâmetros.

Seria uma solicitação de recurso razoável para o PDO pedir-lhes para expor a consulta reescrita. Mas mesmo isso não lhe daria a consulta "completa", a menos que você use PDO::ATTR_EMULATE_PREPARES.

É por isso que mostro a solução alternativa acima de usar o log de consulta geral do servidor MySQL, porque nesse caso até mesmo uma consulta preparada com espaços reservados de parâmetro é reescrita no servidor, com valores de parâmetro preenchidos na string de consulta. Mas isso é feito apenas durante o registro, não durante a execução da consulta.