Cum să afișăm interogarea SQL executată imediat după execuție

16 aug. 2013, 14:04:29
Vizualizări: 166K
Voturi: 42

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

1
Comentarii

Știu că e prea târziu, dar pentru referință viitoare. Poți pur și simplu să afișezi instrucțiunea pregătită înainte de a o transmite interogării. Ar fi cu siguranță mai ușor.

Maciej Paprocki Maciej Paprocki
20 oct. 2016 20:08:32
Toate răspunsurile la întrebare 5
8
91

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.

16 aug. 2013 14:08:31
Comentarii

hmm dar în cazul meu nu este nimic în $wpdb->last_query.

Ravi Soni Ravi Soni
16 aug. 2013 14:11:19

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.

kaiser kaiser
16 aug. 2013 14:32:09

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

Ravi Soni Ravi Soni
16 aug. 2013 14:36:10

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

Kumar Kumar
16 aug. 2013 14:38:21

Eroare în baza de date WordPress: [Interogarea a fost goală]

Ravi Soni Ravi Soni
16 aug. 2013 14:45:23

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

kaiser kaiser
16 aug. 2013 15:12:16

Ș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.

Brian C Brian C
22 dec. 2019 08:19:38

@BrianC Ai putea să incluzi un link către patch? Sau chiar mai bine: Adaugă-l într-un răspuns? Sau [editează] acest răspuns?

kaiser kaiser
26 dec. 2019 23:23:01
Arată celelalte 3 comentarii
2
19

Am enumerat 3 abordări aici:

  1. Folosirea SAVEQUERIES și afișarea tuturor interogărilor în subsol
  2. Folosirea $wpdb->last_query pentru a afișa doar ultima interogare executată, utilă pentru depanarea funcțiilor.
  3. 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.

16 aug. 2013 14:15:34
Comentarii

Cum să obțineți interogări inițiate prin ajax?

itsazzad itsazzad
18 sept. 2015 14:36:29

puteți afișa același lucru în funcția de gestionare a acțiunii ajax.

Kumar Kumar
18 sept. 2015 18:56:57
0

Trebuie să adăugați ambele funcții, altfel niciodată nu va afișa eroarea

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

Această funcție vă va afișa eroarea corectă, precum în exemplul de mai jos

Exemplu afișare eroare WordPress

15 apr. 2017 14:04:35
0

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);
4 iul. 2017 23:36:06
0

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)
7 iul. 2022 11:02:18