Come stampare la query SQL eseguita subito dopo la sua esecuzione

16 ago 2013, 14:04:29
Visualizzazioni: 166K
Voti: 42

Sto cercando un modo per stampare la query SQL eseguita subito dopo:

$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)
            );

Sarebbe ottimo se potessi vedere quali valori vengono inseriti nella query.

Grazie

1
Commenti

So che è troppo tardi, ma per riferimento futuro. Puoi semplicemente fare echo della prepare statement prima di passarla alla query. Sarebbe sicuramente più semplice.

Maciej Paprocki Maciej Paprocki
20 ott 2016 20:08:32
Tutte le risposte alla domanda 5
8
91

L'oggetto $wpdb ha alcune proprietà impostate per questo:

global $wpdb;

// Stampa l'ultima stringa di query SQL
echo $wpdb->last_query;

// Stampa il risultato dell'ultima query SQL
echo $wpdb->last_result;

// Stampa l'errore dell'ultima query SQL
echo $wpdb->last_error;

Nota: Prima di tutto devi impostare define( 'SAVEQUERIES', true ); nel tuo file wp-config.php nella cartella principale di WordPress.

16 ago 2013 14:08:31
Commenti

hmm ma nel mio caso non c'è niente in $wpdb->last_query.

Ravi Soni Ravi Soni
16 ago 2013 14:11:19

Hai defined( 'SAVEQUERIES', true ); nel tuo wp-config.php o qualcosa tipo ! defined( 'SAVEQUERIES' ) AND defined( 'SAVEQUERIES', true ); nel tuo script? Altrimenti non funzionerà.

kaiser kaiser
16 ago 2013 14:32:09

Sì l'ho fatto, penso che la query non venga eseguita affatto ed è per questo che non c'è nulla impostato in $wpdb->last_query. :(

Ravi Soni Ravi Soni
16 ago 2013 14:36:10

attiva wp_debug quindi, così da ottenere eventuali errori o avvisi se presenti.

Kumar Kumar
16 ago 2013 14:38:21

Errore database WordPress: [La query era vuota]

Ravi Soni Ravi Soni
16 ago 2013 14:45:23

Prova $wpdb->get_results() invece e dai un'occhiata alla documentazione del Codex su $wpdb.

kaiser kaiser
16 ago 2013 15:12:16

So che la tua query originale risale a molto tempo fa, ma sembra che tu abbia incontrato il problema della dimensione della colonna. Solo per chiunque altro stia cercando una soluzione per query senza risultati e senza errori - attenzione che wpdb termina silenziosamente, senza alcun messaggio o errore, quando una colonna nella tua query supera la dimensione della colonna nel tuo database. È quasi impossibile accorgersene e WordPress è stato (a mio avviso) irresponsabilmente resistente a correggere questo problema. Esiste una piccola patch che puoi inserire in wpdb.php in un ambiente di sviluppo per rendere molto più semplice identificare questo problema.

Brian C Brian C
22 dic 2019 08:19:38

@BrianC Potresti voler linkare alla patch? O ancora meglio: aggiungerla in una risposta? O [modificare] questa risposta?

kaiser kaiser
26 dic 2019 23:23:01
Mostra i restanti 3 commenti
2
19

Ho elencato 3 approcci qui:

  1. Utilizzare SAVEQUERIES e stampare tutte le query nel footer
  2. Utilizzare $wpdb->last_query per stampare solo l'ultima query eseguita, utile per il debug delle funzioni.
  3. Utilizzare un plugin come Query Monitor.

Dovrai aggiungere questo nel tuo file wp-config.php

 define('SAVEQUERIES', true);

Poi nel footer del tuo tema aggiungi questo codice:

 <?php
  if (current_user_can('administrator')){
   global $wpdb;
   echo "<pre>Query List:";
   print_r($wpdb->queries);
   echo "</pre>";
 }//Mostra tutte le query eseguite sulla tua pagina
?>

Oppure se vuoi stampare solo l'ultima query eseguita, puoi usare questo codice subito dopo la tua chiamata alla funzione $wpdb.

global $wpdb;
echo $wpdb->last_query;//mostra solo una singola query

Un terzo approccio è utilizzare un plugin come Query Monitor che elenca tutte le query eseguite su una pagina in dettaglio, insieme ad altre informazioni come il numero di righe restituite, il tempo di esecuzione o se è una query lenta. http://wordpress.org/plugins/query-monitor/

È una buona idea utilizzare questo plugin solo in ambiente di sviluppo e non lasciarlo attivato su un sito live. Inoltre, Query Monitor può a volte causare problemi con la tua pagina, come errori 5XX sul tuo template/pagina se ci sono troppi errori.

16 ago 2013 14:15:34
Commenti

Come ottenere query inizializzate via ajax?

itsazzad itsazzad
18 set 2015 14:36:29

puoi stamparle nella funzione di gestione dell'azione ajax.

Kumar Kumar
18 set 2015 18:56:57
0

Devi aggiungere entrambe le funzioni, altrimenti non mostrerà mai l'errore

$wpdb->show_errors(); 
$wpdb->print_error();

Questa funzione ti mostrerà l'errore correttamente come questo

Esempio di errore visualizzato

15 apr 2017 14:04:35
0

Volevo aggiungere che la risposta più votata di @kaiser non è del tutto corretta:

// Stampa l'ultima query SQL eseguita
$wpdb->last_query

Il valore restituito è un ARRAY, non una stringa. Quindi per visualizzare l'ultima query dovresti fare così:

echo 'Ultima query: '.var_export($wpdb->last_query, TRUE);
4 lug 2017 23:36:06
0

A volte l'ultima query non è molto rilevante. Ad esempio $wpdb->last_query mi ha restituito questo:

SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)

Ovviamente stavo cercando la query precedente a questa... Per ottenere questo risultato ho utilizzato 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)
7 lug 2022 11:02:18