Antes de pasar a PDO, creé consultas SQL en PHP concatenando cadenas. Si recibí un error de sintaxis de la base de datos, podría hacerme eco de la cadena de consulta SQL final, probarlo yo mismo en la base de datos y ajustarlo hasta que solucione el error, luego volver a colocarlo en el código.
Las declaraciones PDO preparadas son más rápidas, mejores y más seguras, pero una cosa me molesta: nunca veo la consulta final, ya que se envía a la base de datos. Cuando recibo errores sobre la sintaxis en mi registro de Apache o en mi archivo de registro personalizado (registro errores dentro de un catch
bloque), no puedo ver la consulta que los causó.
¿Hay alguna forma de capturar la consulta SQL completa enviada por PDO a la base de datos y registrarla en un archivo?
/var/log/mysql/*
. Los parámetros vinculados a PDO no pueden causar errores de sintaxis, por lo que todo lo que necesita es la consulta SQL preparada.var_dump($pdo_instance->debugDumpParams())
Respuestas:
Tú dices esto :
Bueno, en realidad, cuando se usan declaraciones preparadas, no existe una " consulta final " :
Entonces, para responder a su pregunta:
No: como no hay una " consulta SQL completa " en ninguna parte, no hay forma de capturarla.
Lo mejor que puede hacer, para propósitos de depuración, es "reconstruir" una consulta SQL "real", inyectando los valores en la cadena SQL de la declaración.
Lo que suelo hacer, en este tipo de situaciones, es:
var_dump
(o un equivalente) justo después, para mostrar los valores de los parámetrosEsto no es bueno cuando se trata de depuración, pero ese es el precio de las declaraciones preparadas y las ventajas que aportan.
fuente
Buscando en el registro de la base de datos
Aunque Pascal MARTIN tiene razón en que PDO no envía la consulta completa a la base de datos de una vez, la sugerencia de ryeguy de usar la función de registro de la base de datos realmente me permitió ver la consulta completa tal como fue ensamblada y ejecutada por la base de datos.
Aquí se explica cómo: (Estas instrucciones son para MySQL en una máquina con Windows; su kilometraje puede variar)
my.ini
, en la[mysqld]
sección, agregue unlog
comando, comolog="C:\Program Files\MySQL\MySQL Server 5.1\data\mysql.log"
Ese archivo crecerá rápidamente, así que asegúrese de eliminarlo y desactivar el registro cuando haya terminado la prueba.
fuente
PDO::ATTR_EMULATE_PREPARES
. Consulte esta respuesta para obtener más información: stackoverflow.com/questions/10658865/#answer-10658929general_log
lugar delog
. Ver dev.mysql.com/doc/refman/5.5/en/query-log.htmlSeguro que puede depurar usando este modo
{{ PDO::ATTR_ERRMODE }}
Simplemente agregue una nueva línea antes de su consulta y luego mostrará las líneas de depuración.fuente
->query
al usar declaraciones preparadas?Probablemente lo que desea hacer es usar debugDumpParams () en el identificador de la instrucción. Puede ejecutarlo en cualquier momento después de vincular valores a la consulta preparada (no es necesario para
execute()
la instrucción).No crea la declaración preparada para usted, pero mostrará sus parámetros.
fuente
Una publicación antigua, pero tal vez alguien lo encuentre útil;
fuente
Aquí hay una función para ver cuál será el SQL efectivo, adaptado de un comentario de "Mark" en php.net :
fuente
str_replace(":$k" ....
? Los índices asociativos ya lo tienen en la matriz $ params.:name_long
con:name
. Al menos si:name
viene antes:name_long
. Las declaraciones preparadas de MySQL pueden manejar esto correctamente, así que no dejes que eso te confunda.No. Las consultas PDO no están preparadas en el lado del cliente. PDO simplemente envía la consulta SQL y los parámetros al servidor de la base de datos. La base de datos es lo que hace la sustitución (de los
?
's). Tienes dos opciones:fuente
casi no se dijo nada sobre la visualización de errores, excepto verificar los registros de errores, pero hay una funcionalidad bastante útil:
( enlace fuente )
Está claro que este código puede modificarse para usarse como mensaje de excepción o cualquier otro tipo de manejo de errores.
fuente
por ejemplo tienes esta declaración pdo:
ahora puede obtener la consulta ejecutada definiendo una matriz como esta:
fuente
));
debe ser);
(solo un paréntesis).Buscando en internet encontré esto como una solución aceptable. Se utiliza una clase diferente en lugar de PDO y las funciones de PDO se invocan mediante llamadas a funciones mágicas. No estoy seguro de que esto cree serios problemas de rendimiento. Pero se puede usar hasta que se agregue una función de registro sensible a PDO.
Entonces, según este hilo , puede escribir un contenedor para su conexión PDO que puede iniciar sesión y arroja una excepción cuando obtiene un error.
Aquí hay un ejemplo simple:
para que pueda usar esa clase en lugar de PDOStatement:
Aquí una implementación de decorador PDO mencionada:
fuente
Para registrar MySQL en WAMP , deberá editar my.ini (por ejemplo, en wamp \ bin \ mysql \ mysql5.6.17 \ my.ini)
y agregar a
[mysqld]
:fuente
Aquí hay una función que hice para devolver una consulta SQL con parámetros "resueltos".
Asumiendo que ejecutas así
Esta función NO agrega comillas a las consultas, pero hace el trabajo por mí.
fuente
El problema que tuve con la solución para capturar exenciones de PDO para propósitos de depuración es que solo capturó exenciones de PDO (duh), pero no detectó errores de sintaxis que se registraron como errores de php (no estoy seguro de por qué esto es así, pero " por qué "es irrelevante para la solución). Todas mis llamadas PDO provienen de una clase de modelo de tabla única que extendí para todas mis interacciones con todas las tablas ... esto complicaba las cosas cuando intentaba depurar código, porque el error registraba la línea de código php donde estaba mi llamada de ejecución llamé, pero no me dijo de dónde se estaba haciendo la llamada. Usé el siguiente código para resolver este problema:
Entonces, el código anterior detecta AMBAS excepciones PDO Y errores de sintaxis php y los trata de la misma manera. Mi controlador de errores se parece a esto:
Si alguien tiene mejores ideas sobre cómo obtener información relevante para mi controlador de errores que configurar el modelo de tabla como una variable global, me complacería escucharlo y editar mi código.
fuente
Este código funciona muy bien para mí:
No olvide reemplazar $ data y $ query por sus nombres
fuente
Yo uso esta clase para depurar PDO (con Log4PHP )
fuente
He creado un proyecto / repositorio moderno cargado por Composer para exactamente esto aquí:
pdo-debug
Encuentre la casa de GitHub del proyecto aquí , vea una publicación de blog que lo explica aquí . Una línea para agregar en su composer.json, y luego puede usarla así:
$ sql es la instrucción SQL sin procesar, $ parámetros es una matriz de sus parámetros: la clave es el nombre del marcador de posición (": user_id") o el número del parámetro sin nombre ("?"), el valor es ... bueno, el valor.
La lógica detrás: este script simplemente graduará los parámetros y los reemplazará en la cadena SQL provista. Súper simple, pero súper efectivo para el 99% de sus casos de uso. Nota: Esta es solo una emulación básica, no una depuración PDO real (ya que esto no es posible ya que PHP envía SQL sin procesar y parámetros separados al servidor MySQL).
Muchas gracias a bigwebguy y Mike del hilo de StackOverflow Obteniendo una cadena de consulta SQL sin procesar de PDO para escribir básicamente toda la función principal detrás de este script. Big up!
fuente
Cómo depurar consultas de bases de datos mysql de PDO en Ubuntu
TL; DR Registre todas sus consultas y siga el registro de mysql.
Estas instrucciones son para mi instalación de Ubuntu 14.04. Ejecute el comando
lsb_release -a
para obtener su versión. Su instalación puede ser diferente.Active el inicio de sesión en mysql
cd /etc/mysql
. Deberías ver un archivo llamadomy.cnf
. Ese es el archivo que vamos a cambiar.cat my.cnf | grep general_log
. Esto filtra elmy.cnf
archivo por ti. Debería ver dos entradas:#general_log_file = /var/log/mysql/mysql.log
&&#general_log = 1
.sudo service mysql restart
.sudo service nginx restart
.¡Buen trabajo! Estás listo. Ahora todo lo que tiene que hacer es seguir el archivo de registro para que pueda ver las consultas PDO que hace su aplicación en tiempo real.
Sigue el registro para ver tus consultas
Ingrese este cmd
tail -f /var/log/mysql/mysql.log
.Su salida se verá más o menos así:
Cualquier consulta nueva que haga su aplicación aparecerá automáticamente , siempre y cuando continúe siguiendo el registro. Para salir de la cola, golpea
cmd/ctrl c
.Notas
truncate --size 0 mysql.log
.Crédito y gracias
Enorme agradecimiento a la respuesta anterior de Nathan Long para que la inspo descubra esto en Ubuntu. También a dikirill por su comentario sobre la publicación de Nathan que me llevó a esta solución.
Te amo stackoverflow!
fuente
En el entorno Debian NGINX hice lo siguiente.
Vaya a
/etc/mysql/mysql.conf.d
editarmysqld.cnf
si encuentra,log-error = /var/log/mysql/error.log
agregue las siguientes 2 líneas debajo.Para ver los registros goto
/var/log/mysql
ytail -f mysql.log
Recuerde comentar estas líneas una vez que haya terminado con la depuración si está en el entorno de producción, elimine
mysql.log
ya que este archivo de registro crecerá rápidamente y puede ser enorme.fuente