tutorial sentencias preparadas insertar ejemplos datos con php mysql pdo sql-parametrized-query

insertar - sentencias preparadas php mysqli



En PHP con PDO, ¿cómo verificar la consulta final parametrizada de SQL? (9)

Así que creo que finalmente responderé mi propia pregunta para tener una solución completa para el registro. Pero tengo que agradecer a Ben James y Kailash Badu que proporcionaron las pistas para esto.

Respuesta corta
Como lo mencionó Ben James: NO .
La consulta SQL completa no existe en el lado de PHP, porque la consulta con tokens y los parámetros se envían por separado a la base de datos. Solo en el lado de la base de datos existe la consulta completa.

Incluso intentar crear una función para reemplazar tokens en el lado PHP no garantizaría que el proceso de reemplazo sea el mismo que el SQL (cosas complicadas como token-type, bindValue vs bindParam, ...)

Solución
Aquí es donde explico la respuesta de Kailash Badu. Al registrar todas las consultas SQL, podemos ver lo que realmente se ejecuta en el servidor. Con mySQL, esto se puede hacer actualizando my.cnf (o my.ini en mi caso con el servidor de Wamp) y agregando una línea como:

log=[REPLACE_BY_PATH]/[REPLACE_BY_FILE_NAME]

¡Simplemente no ejecute esto en producción!

Esta pregunta ya tiene una respuesta aquí:

En PHP, al acceder a la base de datos MySQL con PDO con consulta parametrizada, ¿cómo se puede verificar la consulta final (después de haber reemplazado todos los tokens)?

¿Hay alguna manera de verificar qué se ejecuta realmente en la base de datos?


Creo que la manera más fácil de ver el texto final de la consulta cuando usas pdo es hacer un error especial y buscar un mensaje de error. No sé cómo hacer eso, pero cuando cometo el error sql en yii framework que usa pdo, puedo ver el texto de la consulta


El uso de declaraciones preparadas con valores parametrizados no es simplemente otra forma de crear dinámicamente una cadena de SQL. Crea una declaración preparada en la base de datos y luego envía los valores de los parámetros solo.

Entonces lo que probablemente se envíe a la base de datos será un PREPARE ... , luego SET ... y finalmente EXECUTE ...

No podrá obtener ninguna cadena SQL como SELECT * FROM ... , incluso si produzca resultados equivalentes, porque nunca se envió dicha consulta a la base de datos.



Inicialmente evité encender el registro para monitorear PDO porque pensé que sería una molestia pero no es difícil en absoluto. No necesita reiniciar MySQL (después de 5.1.9):

Ejecute este SQL en phpMyAdmin o en cualquier otro entorno donde pueda tener privilegios de db altos:

SET GLOBAL general_log = ''ON'';

En una terminal, alinee su archivo de registro. El mío estaba aquí:

>sudo tail -f /usr/local/mysql/data/myMacComputerName.log

Puede buscar sus archivos mysql con este comando de terminal:

>ps auxww|grep [m]ysqld

Descubrí que PDO se escapa de todo, por lo que no puedes escribir

$dynamicField = ''userName''; $sql = "SELECT * FROM `example` WHERE `:field` = :value"; $this->statement = $this->db->prepare($sql); $this->statement->bindValue('':field'', $dynamicField); $this->statement->bindValue('':value'', ''mick''); $this->statement->execute();

Porque crea:

SELECT * FROM `example` WHERE `''userName''` = ''mick'' ;

Lo cual no creó un error, solo un resultado vacío. En cambio, necesitaba usar

$sql = "SELECT * FROM `example` WHERE `$dynamicField` = :value";

Llegar

SELECT * FROM `example` WHERE `userName` = ''mick'' ;

Cuando termines de ejecutar:

SET GLOBAL general_log = ''OFF'';

de lo contrario, tus registros serán enormes.



Lo que hice para imprimir esa consulta real es un poco complicado pero funciona :)

En el método que asigna variables a mi declaración, tengo otra variable que se parece un poco a esto:

$this->fullStmt = str_replace($column, ''/''' . str_replace(''/''', ''///''', $param) . ''/''', $this->fullStmt);

Dónde:
$column es mi token
$param es el valor real asignado a token
$this->fullStmt es mi declaración de solo impresión con tokens reemplazados

Lo que hace es simplemente reemplazar tokens con valores cuando ocurre la asignación PDO real.

Espero no haberlo confundido y al menos haberlo apuntado en la dirección correcta.


No creo que puedas, aunque espero que alguien me demuestre que estoy equivocado.

Sé que puede imprimir la consulta y su método toString le mostrará el sql sin los reemplazos. Esto puede ser útil si está creando cadenas de consulta complejas, pero no le proporciona la consulta completa con valores.


Verifico el registro de consultas para ver la consulta exacta que se ejecutó como una declaración preparada.