Cum să afișăm interogarea SQL executată imediat după execuție
Caut o modalitate prin care să pot afișa interogarea SQL executată imediat după:
$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)
);
Ar fi excelent dacă aș putea vedea ce valori sunt introduse în interogare.
Mulțumesc
Obiectul $wpdb
are câteva proprietăți care pot fi accesate pentru acest scop:
global $wpdb;
// Afișează ultimul șir de interogare SQL
echo $wpdb->last_query;
// Afișează rezultatul ultimei interogări SQL
echo $wpdb->last_result;
// Afișează eroarea ultimei interogări SQL
echo $wpdb->last_error;
Notă: Mai întâi, trebuie să setezi define( 'SAVEQUERIES', true );
în fișierul wp-config.php
din folderul rădăcină al WordPress.

Ai pus defined( 'SAVEQUERIES', true );
în wp-config.php
sau ceva de genul ! defined( 'SAVEQUERIES' ) AND defined( 'SAVEQUERIES', true );
în scriptul tău? Altfel nu va funcționa.

Da, am pus, cred că interogarea nu rulează deloc și de aceea nu se setează nimic în $wpdb->last_query. :(

activează wp_debug atunci, ca să primești erori sau avertismente dacă există.

Încearcă $wpdb->get_results()
în schimb și consultă documentația Codex despre $wpdb
.

Știu că întrebarea ta originală este de mult timp, dar se pare că ai întâmpinat problema dimensiunii coloanei. Doar pentru oricine altcineva care caută o soluție pentru lipsa rezultatelor la interogare fără eroare - atenție că wpdb se închide silențios, fără niciun mesaj sau eroare, atunci când o coloană din interogarea ta depășește dimensiunea coloanei din baza de date. Aproape că nu există nicio modalitate de a vedea că acest lucru s-a întâmplat, iar WordPress a fost (după părerea mea) neglijent rezistent la remedierea acestui lucru. Există un patch scurt pe care îl poți aplica în wpdb.php într-un mediu de dezvoltare pentru a face acest lucru mult mai ușor de identificat.

Am enumerat 3 abordări aici:
- Folosirea
SAVEQUERIES
și afișarea tuturor interogărilor în subsol - Folosirea
$wpdb->last_query
pentru a afișa doar ultima interogare executată, utilă pentru depanarea funcțiilor. - Folosirea unui plugin precum Query Monitor.
Va trebui să adăugați aceasta în fișierul wp-config.php
define('SAVEQUERIES', true);
Apoi în subsolul temei dvs. adăugați acest cod:
<?php
if (current_user_can('administrator')){
global $wpdb;
echo "<pre>Lista interogări:";
print_r($wpdb->queries);
echo "</pre>";
}//Afișează toate interogările executate pe pagina dvs.
?>
Sau dacă doriți să afișați doar ultima interogare executată, puteți folosi acest cod chiar sub apelul funcției dvs. $wpdb
.
global $wpdb;
echo $wpdb->last_query;//afișează doar o singură interogare
A 3-a abordare ar fi utilizarea unui plugin precum Query Monitor care listează toate interogările executate pe o pagină în detaliu, precum și alte informații asociate acestora, cum ar fi câte rânduri returnează, timpul de execuție sau dacă este o interogare lentă. http://wordpress.org/plugins/query-monitor/
Este o idee bună să folosiți acest plugin doar în mediu de DEZVOLTARE și nu ar trebui lăsat activat pe un site live. De asemenea, Query Monitor poate cauza uneori probleme cu pagina dvs., cum ar fi eroarea 5XX pe șablon/pagină dacă există prea multe erori.

Am vrut să adaug că cel mai bine votat răspuns de către @kaiser nu este complet corect:
// Afișează ultimul șir de interogare SQL
$wpdb->last_query
Rezultatul returnat este un ARRAY, nu un șir de caractere. Deci, pentru a afișa ultima interogare, ar trebui să faceți astfel:
echo 'Ultima interogare: '.var_export($wpdb->last_query, TRUE);

Uneori ultima interogare nu este foarte relevantă. De exemplu, $wpdb->last_query
mi-a returnat aceasta:
SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)
Evident că eu căutam interogarea dinaintea acesteia... Pentru a obține asta am folosit un filtru 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)
