Estamos usando Doctrine, un PHP ORM. Estoy creando una consulta como esta:
$q = Doctrine_Query::create()->select('id')->from('MyTable');
y luego en la función estoy agregando varias cláusulas where y cosas según corresponda, como esta
$q->where('normalisedname = ? OR name = ?', array($string, $originalString));
Más adelante, antes de execute()
poner ese objeto de consulta, quiero imprimir el SQL sin procesar para examinarlo y hacer esto:
$q->getSQLQuery();
Sin embargo, eso solo imprime la declaración preparada, no la consulta completa. Quiero ver qué está enviando a MySQL, pero en su lugar está imprimiendo una declaración preparada, incluida ?
la de. ¿Hay alguna forma de ver la consulta 'completa'?
Respuestas:
Doctrine no está enviando una "consulta SQL real" al servidor de la base de datos: en realidad está usando declaraciones preparadas, lo que significa:
$query->getSql()
)$query->getParameters()
)Esto significa que nunca hay una consulta SQL "real" en el lado de PHP, por lo que Doctrine no puede mostrarla.
fuente
$query->getParameters();
NO devolverá los parámetros en el orden correcto, ya que deberían aparecer en la declaración de consulta preparadaUn ejemplo de trabajo:
fuente
Puede verificar la consulta ejecutada por su aplicación si registra todas las consultas en mysql:
http://dev.mysql.com/doc/refman/5.1/en/query-log.html
Habrá más consultas, no solo la que está buscando, sino que puede obtenerla.
pero generalmente
->getSql();
funcionaEditar:
para ver todas las consultas mysql que uso
y agrega esas 2 líneas:
y reiniciar mysql
fuente
He creado un registrador Doctrine2 que hace exactamente esto. "Hidrata" la consulta sql parametrizada con los valores utilizando los propios conversores de datos de Doctrine 2.
Ejemplo de uso :; La siguiente paz de código se hará eco en la salida estándar de cualquier instrucción INSERT, UPDATE, DELETE SQL generada con $ em Entity Manager,
fuente
getSqlQuery()
técnicamente muestra todo el comando SQL, pero es mucho más útil cuando también puedes ver los parámetros.Para hacer que este patrón sea más reutilizable, hay un buen enfoque descrito en los comentarios en Raw SQL de Doctrine Query Object .
fuente
$q
. No parece ser la consulta ni el generador de consultas.$q
en este caso es una consulta de Doctrine 1. Es posible que estés usando Doctrine 2, en cuyo caso querrás algo como ¡$qb = $this->createQueryBuilder('a'); $q = $qb->getQuery(); $sql = $q->getSQL(); $params = $q->getParameters();
Espero que eso ayude!No hay otra consulta real, así es como funcionan las declaraciones preparadas. Los valores están vinculados en el servidor de la base de datos, no en la capa de aplicación.
Vea mi respuesta a esta pregunta: en PHP con PDO, ¿cómo verificar la consulta parametrizada final de SQL?
(Repetido aquí por conveniencia :)
fuente
Mi solución:
Ejemplo de uso:
fuente
Puede acceder fácilmente a los parámetros SQL utilizando el siguiente enfoque.
Entonces, si imprimió el
$param_values
y$col_names
, puede obtener los valores de los parámetros que pasan a través del sql y los nombres de columna respectivos.Nota: Si
$param
devuelve una matriz, debe repetirla, ya que los parámetros que se encuentran en el interiorIN (:?)
generalmente son una matriz anidada.Mientras tanto, si encontró otro enfoque, tenga la amabilidad de compartir con nosotros :)
¡Gracias!
fuente
Solución más clara:
fuente
fuente
Puedes usar :
Si está utilizando MySQL, puede usar Workbench para ver las instrucciones SQL en ejecución. También puede usar ver la consulta en ejecución desde mysql usando lo siguiente:
fuente
Tal vez pueda ser útil para alguien:
fuente
TL; DR
en sus archivos de ramita, use los filtros de ayuda de ramita de Doctrine:
Explicación:
Las otras respuestas que mencionan que la declaración preparada son en realidad "consultas reales" son correctas, pero no responden a la expectativa obvia del autor de la pregunta ... Todo desarrollador quiere mostrar una "consulta ejecutable" para la depuración (o para mostrarla al usuario) .
Entonces, busqué en la fuente del perfilador de Symfony para ver cómo lo hacen. La parte de Doctrine es responsabilidad de Doctrine, por lo que hicieron un paquete de doctrina para integrarse con Symfony. Echar un vistazo a la
doctrine-bundle/Resources/views/Collector/db.html.twig
archivo, descubrirá cómo lo hacen (esto puede cambiar según las versiones). Curiosamente, crearon filtros de ramitas que podemos reutilizar (ver arriba).Para que todo funcione, debemos habilitar el registro para nuestra consulta. Hay varias formas de hacer esto y aquí utilizo DebugStack que permite registrar consultas sin realmente imprimirlas. Esto también asegura que esto funcionará en modo de producción si esto es lo que necesita ...
Si necesita más formatos, verá que incluyen algunos CSS en una etiqueta de estilo, así que simplemente "robe" ^^:
Espero que esto ayude ;-)
fuente
Escribí un registrador simple, que puede registrar consultas con parámetros insertados. Instalación:
Uso:
fuente
fuente
Se modificó la función @dsamblas para que funcione cuando los parámetros son cadenas de fecha como esta '2019-01-01' y cuando se pasa una matriz usando IN como
. Entonces, haga todo lo que dsamblas escribió, pero reemplace startQuery con este o vea las diferencias y agregue mi código. (en caso de que haya modificado algo en su función y mi versión no tiene modificaciones).
No probé mucho.
fuente
Investigué un poco sobre este tema, porque quería depurar una consulta SQL generada y ejecutarla en el editor SQL. Como se ve en todas las respuestas, es un tema altamente técnico.
Cuando supongo que la pregunta inicial se basa en dev-env, falta una respuesta muy simple en este momento. Simplemente puede usar la compilación en Symfony Profiler. Simplemente haga clic en la pestaña Doctrina, desplácese hasta la consulta que desea inspeccionar. Luego haga clic en "ver consulta ejecutable" y puede pegar su consulta directamente en su editor SQL
Más enfoque de base de UI pero muy rápido y sin depuración de sobrecarga de código.
fuente
fuente
Para imprimir una consulta SQL en Doctrine, use:
fuente