Comment imprimer le sql excuté juste après son exécution

26

Je recherche un moyen d'imprimer la requête SQL exécutée juste après:

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

Ce serait formidable si je peux voir quelles valeurs vont dans la requête.

Merci

ravisoni
la source
1
Je sais qu'il est trop tard, mais pour référence future. Vous pouvez simplement faire écho préparer l'instruction avant de la passer à la requête. Ce serait sûrement plus facile.
Maciej Paprocki

Réponses:

51

L' $wpdbobjet a des propriétés définies pour cela:

global $wpdb;

// Print last SQL query string
$wpdb->last_query
// Print last SQL query result
$wpdb->last_result
// Print last SQL query Error
$wpdb->last_error

Remarque: Tout d'abord, vous devez définir define( 'SAVEQUERIES', true );votre wp-config.phpfichier dans le dossier racine de WordPress.

kaiser
la source
hmm mais dans mon cas il n'y a rien dans $ wpdb-> last_query.
ravisoni
Avez-vous defined( 'SAVEQUERIES', true );dans votre wp-config.phpou quelque chose comme ! defined( 'SAVEQUERIES' ) AND defined( 'SAVEQUERIES', true );dans votre script? Sinon ça ne marchera pas.
kaiser
Oui j'ai, je pense que la requête ne fonctionne pas du tout que y il n'y a rien de paramètre est $ wpdb-> last_query. :(
ravisoni
1
activez ensuite wp_debug, de sorte que vous obtiendrez des erreurs ou un avertissement le cas échéant.
Kumar
Erreur de base de données WordPress: [La requête était vide]
ravisoni
14

J'ai énuméré 3 approches ici:

  1. Utilisation SAVEQUERIESet impression de toutes les requêtes en pied de page
  2. Utilisé $wpdb->last_querypour imprimer uniquement la dernière requête exécutée, ceci est utile pour les fonctions de débogage.
  3. Utiliser un plugin comme Query Monitor.

Vous devez l'ajouter dans votre wp-config.php

 define('SAVEQUERIES', true);

Ensuite, dans le pied de page de votre thème, ajoutez ce code:

 <?php
  if (current_user_can('administrator')){
   global $wpdb;
   echo "<pre>Query List:";
   print_r($wpdb->queries);
   echo "</pre>";
 }//Lists all the queries executed on your page
?>

Ou si vous souhaitez imprimer uniquement la dernière requête exécutée, vous pouvez l'utiliser juste en dessous de votre $wpdbappel de fonction de requête.

global $wpdb;
echo $wpdb->last_query;//lists only single query

Une 3ème approche serait d'utiliser un plugin comme Query Monitor qui répertorie toutes les requêtes exécutées sur une page en détail, et d'autres détails qui lui sont associés comme le nombre de lignes qu'elle renvoie et le temps nécessaire à l'exécution ou s'il s'agit d'une requête lente. http://wordpress.org/plugins/query-monitor/

C'est une bonne idée d'utiliser ce plugin dans l'environnement DEV uniquement et ne doit pas être laissé activé sur un site en direct. En outre, Query Monitor peut parfois provoquer des problèmes avec votre page, comme l'erreur 5XX sur votre modèle / page s'il y a trop d'erreurs.

Kumar
la source
Comment obtenir des requêtes initiées par ajax?
itsazzad
vous pouvez imprimer la même chose dans la fonction de gestionnaire d'actions ajax.
Kumar
3

Vous devez ajouter les deux fonctions, sinon il ne montrera jamais d'erreur

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

Cette fonction vous montrera une erreur appropriée comme celle-ci

entrez la description de l'image ici

Ketan Chaudhari
la source
1

Je voulais ajouter que la meilleure réponse votée par @kaiser n'est pas entièrement correcte:

// Print last SQL query string
$wpdb->last_query

Le retour est ARRAY , pas une chaîne. Donc, pour sortir la dernière requête, vous devez faire ceci:

echo 'Last query: '.var_export($wpdb->last_query, TRUE);
KestutisIT
la source