Effectuer une requête à l’aide de $wpdb

Avec WordPress tout comme avec tout autre site PHP, il est possible d'effectuer une requête SQL puis de boucler dans les résultats de la requête.

Alors que les sites PHP peuvent utiliser l'objet $mysqli, les sites WordPress auront tout avantage à utiliser l'objet $wpdb.

Voici donc comment bien utiliser $wpdb.

▼Publicité

Prenons le cas d'une requête qui doit lire plusieurs champs et qui pourrait retourner 0, 1 ou plusieurs enregistrements. Une telle requête retournera un tableau à deux dimensions (une colonne pour chaque champ et une ligne pour chaque enregistrement). 

Dans ce cas, la meilleure fonction pour effectuer la requête est $wpdb->get_results().

Si on avait été assuré que la requête ne retournera jamais plus d'un enregistrement (ex : requête avec un WHERE utilisant l'identifiant), on aurait utilisé $wpdb->get_row().

Et si on avait voulu lire qu'un seul champ pour un seul enregistrement, ou encore une seule fonction d'aggrégation (ex : COUNT(*) ), on aurait utilisé $wpdb->get_var().

Ex :

WordPress (PHP)

function afficher_liste() {

   global $wpdb;

   $nom_table = $wpdb->prefix . 'matable';

   $requete = "SELECT champ1, champ2, champ3 FROM  $nom_table ORDER BY champ1";

   $resultat = $wpdb->get_results( $requete );

   ...

}

Une fois la requête effectuée, il faut s'assurer que :

  • la requête a fonctionné
  • la requête a donné des résultats

La requête a-t-elle fonctionné ?

Lorsqu'une requête est effectuée, le type de la valeur de retour dépendra de la fonction utilisée. On pourrait avoir, par exemple, un entier, une chaîne de caractères, un objet, un tableau associatif, la valeur NULL, etc. 

Dans le cas où la requête cause une erreur SQL, la valeur de retour dépend elle aussi de la fonction utilisée. 

Fonctions qui retournent FAUX en cas d'erreur SQL

Les fonctions suivantes retourneront FAUX en cas d'erreur SQL : 

  • $wpdb->query()
  • $wpdb->insert()
  • $wpdb->update()
  • $wpdb->delete() 

Il serait intéressant d'informer l'internaute lorsqu'on rencontre un problème SQL, sans toutefois lui révéler la nature exacte du problème. Si on ne le fait pas, la classe wpdb captera tout de même l'erreur mais rien ne sera affiché à l'écran, ce qui peut laisser l'internaute perplexe.

Lorsqu'on utilise une de ces fonctions, on vérifiera donc toujours si la requête a fonctionné en testant si elle a retourné FAUX.

Attention : pour éviter de confondre la valeur 0 avec FAUX, il faudra utiliser la triple égalité (===).

Ex :

WordPress (PHP)

$resultat = $wpdb->query( $requete );

if ( ! ( $resultat === FALSE ) ) {

   ...

} else {

   echo  __( "Oups ! Un problème a été rencontré." );

Fonctions dont la valeur de retour n'indique pas s'il y a eu erreur SQL

À premier abord, il semble plus difficile de cibler les erreurs SQL lorsqu'on utilise une fonction comme :

  • $wpdb->get_var()
  • $wpdb->get_row()
  • $wpdb->get_col()
  • $wpdb->get_results()
  • $wpdb->replace()

En effet, ces fonctions ne retourneront pas FAUX en cas d'erreur SQL. Si on ne vérifie pas si la requête a fonctionné, le programme réagira comme si la requête n'avait retourné aucun enregistrement lorsqu'il rencontre une erreur SQL.

Il reste tout de même un espoir pour détecter les erreurs SQL : le champ $wpdb->last_error. Ce champ sera une chaîne vide si la dernière requête a été réussie. En cas d'erreur SQL, il contiendra le message d'erreur correspondant.

Ex :

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );

$erreurSql = $wpdb->last_error;

if ( $erreurSql == "" ) {

   ...

} else {

   echo  __( "Oups ! Un problème a été rencontré." );

   // afficher l'erreur à l'écran seulement si on est en mode débogage

   montheme_echo_debug( $erreurSql );

La requête a-t-elle donné des résultats ?

Il faut maintenant vérifier si la requête a donné des résultats, c'est-à-dire s'il y avait des enregistrements correspondant à ce qui était demandé. Pour le savoir, nous ferons appel à $wpdb->num_rows().

Ex :

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );

$erreurSql = $wpdb->last_error;

if ( $erreurSql == "" ) {   

   if ( $wpdb->num_rows > 0 ) {

      ...

   } else {

      echo  __( "Aucune donnée ne correspond aux critères demandés." );

   }

} else {

   echo  __( "Oups ! Un problème a été rencontré." );

   // afficher l'erreur à l'écran seulement si on est en mode débogage

   montheme_echo_debug( $erreurSql );

Boucler dans les résultats

Une fois que nous sommes assurés que la requête a fonctionné et qu'elle a donné des résultats, nous pouvons effectuer une boucle dans le tableau des résultats.

Ex :

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );

$erreurSql = $wpdb->last_error;

if ( $erreurSql == "" ) {

   if ( $wpdb->num_rows > 0 ) {

      ?>

      <table class="...">

         ...

         <tbody>

         <?php

         foreach( $resultat as $enreg ) {

            echo "<tr>";

            echo "<td>$enreg->champ1</td>";

            echo "<td>$enreg->champ2</td>";

            echo "<td>$enreg->champ3</td>";

            echo "</tr>";

         } 

         ?>

         </tbody>

      </table>

      <?php

   } else {

      echo  __( "Aucune donnée ne correspond aux critères demandés." );

   }

} else {

   echo  __( "Oups ! Un problème a été rencontré." );

   // afficher l'erreur à l'écran seulement si on est en mode débogage

   montheme_echo_debug( $erreurSql );

}

Merci de partager ! Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedInPin on PinterestShare on StumbleUponEmail this to someone
Catégories