sql >> Base de Datos >  >> RDS >> Mysql

Obtención de una cadena de consulta SQL sin formato a partir de declaraciones preparadas por PDO

Supongo que quiere decir que desea la consulta SQL final, con valores de parámetros interpolados en ella. Entiendo que esto sería útil para la depuración, pero no es la forma en que funcionan las declaraciones preparadas. Los parámetros no se combinan con una declaración preparada en el lado del cliente, por lo que PDO nunca debería tener acceso a la cadena de consulta combinada con sus parámetros.

La instrucción SQL se envía al servidor de la base de datos cuando prepara(), y los parámetros se envían por separado cuando ejecuta(). El registro de consultas general de MySQL muestra el SQL final con valores interpolados después de ejecutar(). A continuación se muestra un extracto de mi registro general de consultas. Ejecuté las consultas desde mysql CLI, no desde PDO, pero el principio es el mismo.

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

También puede obtener lo que desea si configura el atributo PDO PDO::ATTR_EMULATE_PREPARES. En este modo, PDO interpola parámetros en la consulta SQL y envía la consulta completa cuando ejecuta(). Esta no es una consulta realmente preparada. Eludirá los beneficios de las consultas preparadas interpolando variables en la cadena SQL antes de ejecutar().

Re comentario de @afilina:

No, la consulta SQL textual es no combinado con los parámetros durante la ejecución. Así que no hay nada que PDO pueda mostrarte.

Internamente, si usa PDO::ATTR_EMULATE_PREPARES, PDO hace una copia de la consulta SQL e interpola los valores de los parámetros antes de preparar y ejecutar. Pero PDO no expone esta consulta SQL modificada.

El objeto PDOStatement tiene una propiedad $queryString, pero esto se establece solo en el constructor de PDOStatement y no se actualiza cuando la consulta se reescribe con parámetros.

Sería una solicitud de función razonable para que PDO les pida que expongan la consulta reescrita. Pero incluso eso no le daría la consulta "completa" a menos que use PDO::ATTR_EMULATE_PREPARES.

Esta es la razón por la que muestro la solución anterior de usar el registro de consulta general del servidor MySQL, porque en este caso, incluso una consulta preparada con marcadores de posición de parámetros se reescribe en el servidor, con valores de parámetros rellenados en la cadena de consulta. Pero esto solo se hace durante el registro, no durante la ejecución de la consulta.