Cómo imprimir la consulta SQL ejecutada justo después de su ejecución
Estoy buscando una manera mediante la cual pueda imprimir la consulta SQL ejecutada justo después de:
$wpdb->query(
$wpdb->prepare("INSERT
INTO tbl_watchprosite SET
keywords=%s,url_to_post=%s,description=%s,
date_captured=%s,crawl_id=%d,
image_main=%s,images=%s,brand=%s,
series=%s,model=%s,condition=%s,box=%s,
papers=%s,year=%s,case_size=%s,status=%s,listed=%s,
asking_price=%s,retail_price=%s,payment_info=%s,forum_id=%d",
$this->getForumSettings()->search_meta,$element->href,$post_meta['description'],current_time('mysql'),$cid,$post_meta['image_main'],$images,$post_meta[0],$post_meta[1],$post_meta[2],$post_meta[3],$post_meta[4],$post_meta[5],$post_meta[6],$post_meta[7],$status,$post_meta[9],$post_meta[10],$post_meta[11],$this->getForumSettings()->ID)
);
Sería genial si pudiera ver qué valores se están introduciendo en la consulta.
Gracias
El objeto $wpdb
tiene algunas propiedades configuradas para eso:
global $wpdb;
// Imprimir la última cadena de consulta SQL
echo $wpdb->last_query;
// Imprimir el último resultado de consulta SQL
echo $wpdb->last_result;
// Imprimir el último error de consulta SQL
echo $wpdb->last_error;
Nota: Primero debes configurar define( 'SAVEQUERIES', true );
en tu archivo wp-config.php
ubicado en la carpeta raíz de WordPress.

¿Has puesto defined( 'SAVEQUERIES', true );
en tu wp-config.php
o algo como ! defined( 'SAVEQUERIES' ) AND defined( 'SAVEQUERIES', true );
en tu script? Si no, no funcionará.

Sí lo tengo, creo que la consulta no se está ejecutando en absoluto por eso no hay nada configurado en $wpdb->last_query. :(

activa wp_debug entonces, para que obtengas errores o advertencias si hay alguno.

Prueba con $wpdb->get_results()
en su lugar y revisa la documentación del Codex sobre $wpdb
.

Sé que tu consulta original fue hace mucho tiempo, pero parece que estabas encontrando el problema del tamaño de la columna. Solo para cualquier otra persona que esté buscando una solución a "no hay resultados de consulta" sin ningún error: ten en cuenta que wpdb sale silenciosamente, sin mensaje ni error, cuando una columna en tu consulta excede el tamaño de la columna en tu base de datos. Es casi imposible ver que esto ha ocurrido, y WordPress ha sido descuidadamente resistente (en mi opinión) a solucionar esto. Hay un parche breve que puedes aplicar en wpdb.php en un entorno de desarrollo para hacer que esto sea mucho más fácil de detectar.

He enumerado 3 enfoques aquí:
- Usar
SAVEQUERIES
e imprimir todas las consultas en el pie de página - Usar
$wpdb->last_query
para imprimir solo la última consulta ejecutada, esto es útil para depurar funciones. - Usar un plugin como Query Monitor.
Necesitarás agregar esto en tu archivo wp-config.php
define('SAVEQUERIES', true);
Luego, en el pie de página de tu tema, añade este código:
<?php
if (current_user_can('administrator')){
global $wpdb;
echo "<pre>Lista de Consultas:";
print_r($wpdb->queries);
echo "</pre>";
}//Muestra todas las consultas ejecutadas en tu página
?>
O si prefieres imprimir solo la última consulta ejecutada, puedes usar esto justo debajo de tu llamada a la función $wpdb
.
global $wpdb;
echo $wpdb->last_query;//muestra solo una consulta
Un tercer enfoque sería usar un plugin como Query Monitor que lista todas las consultas ejecutadas en una página con detalle, junto con otra información relacionada como cuántas filas retorna, el tiempo de ejecución o si es una consulta lenta. http://wordpress.org/plugins/query-monitor/
Es una buena idea usar este plugin solo en entornos de DESARROLLO y no debería dejarse activado en un sitio en producción. Además, Query Monitor puede a veces causar problemas con tu página, como errores 5XX en tu plantilla/página si hay demasiados errores.

Quería agregar que la mejor respuesta votada por @kaiser no es del todo correcta:
// Imprimir la última cadena de consulta SQL
$wpdb->last_query
El retorno de esto es un ARRAY, no una cadena. Por lo tanto, para mostrar la última consulta deberías hacer esto:
echo 'Última consulta: '.var_export($wpdb->last_query, TRUE);

A veces la última consulta no es muy relevante. Por ejemplo, $wpdb->last_query
me devolvió esto:
SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)
Obviamente yo estaba buscando la consulta anterior a esta... Para lograrlo utilicé un filtro query
:
add_filter('query', function($query) {
echo $query;
return $query;
});
$my_query = new WP_Query($my_args);
// -> SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_parent = 0 AND wp_posts.post_type IN ('attachment') AND ((wp_posts.post_status = 'inherit')) ORDER BY wp_posts.post_type DESC, wp_posts.post_date DESC LIMIT 0, 100
// -> SELECT FOUND_ROWS()
// -> SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)
