Formation PUB020 : WordPress, 2023 La base de données WordPress

30.3 Effectuer une requête SELECT à l'aide de $wpdb


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

Si on doit retrouver un ou plusieurs champs pour 0, 1 ou plusieurs enregistrements, 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().

Je commence cette fiche par une explication détaillée d'une requête avec get_results().

Suivront des exemples avec get_row() et get_var().

Pour atteindre une section rapidement :

▼Publicité Le texte se poursuit plus bas

$wpdb->get_results()

$wpdb->get_results() est la méthode la plus polyvalente puisqu'elle peut retrouver un ou plusieurs champs pour 0, 1 ou plusieurs enregistrements.

Je vais donc faire une démonstration détaillée de l'utilisation de cette méthode.

Les mêmes principes s'appliquent pour $wpdb->get_row() et $wpdb->get_var(). C'est pourquoi, dans les sections réservéces à ces méthodes, je vais simplement vous montrer un exemple d'utilisation.

À la base, il faut initialiser une variable qui contiendra la requête SQL puis effectuer la requête avec $wpdb->get_results().

WordPress (PHP)

function monprefixe_afficher_liste() {
    global $wpdb;
 
    $table_matable = $wpdb->prefix . 'monprefixebd_matable';
    $requete = "SELECT champ1, champ2, champ3 FROM $table_matable 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é ?

Après avoir effectué une requête à l'aide d'une des méthodes de $wpdb, on peut savoir si la requête a fonctionné en consultant la valeur de la propriété $wpdb->last_error. Elle contiendra une chaîne vide si la dernière requête a été réussie. En cas d'erreur SQL, elle contiendra le message d'erreur correspondant.

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );
$erreur_sql = $wpdb->last_error;
if ( "" == $erreur_sql ) {
    ...
} else {
    echo '<div class="message-erreur">';
    _e( "Oups ! Un problème a été rencontré.", "mon-domaine-de-localisation" );
    echo '</div>';
 
    // afficher l'erreur à l'écran seulement si on est en mode débogage
    monprefixe_echo_debug( $erreur_sql );}

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().

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );
$erreur_sql = $wpdb->last_error;
 
if ( "" == $erreur_sql ) {
    if ( $wpdb->num_rows > 0 ) {
        ...
     } else {
        echo '<div class="message-avertissement">';
        _e( "Aucune donnée ne correspond aux critères demandés.", "mon-domaine-de-localisation" );
        echo '</div>';    }
} else {
    echo '<div class="message-erreur">';
    _e( "Oups ! Un problème a été rencontré.", "mon-domaine-de-localisation" );
    echo '</div>';
 
    // afficher l'erreur à l'écran seulement si on est en mode débogage
    monprefixe_echo_debug( $erreur_sql );
}

Boucler dans les résultats

$wpdb->get_results() retournera un tableau à deux dimensions (une colonne pour chaque champ et une ligne pour chaque enregistrement).

Donc, 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.

WordPress (PHP)

$resultat = $wpdb->get_results( $requete );
$erreur_sql = $wpdb->last_error;
 
if ( "" == $erreur_sql ) {
    if ( $wpdb->num_rows > 0 ) {
        ?>
        <table class="...">
            // en-têtes de colonnes 
            //...

            <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 '<div class="message-avertissement">';
        _e( 'Aucune donnée ne correspond aux critères demandés.', 'mon-domaine-de-localisation' );
        echo '</div>';
    }
} else {
    echo '<div class="message-erreur">';
    _e( 'Oups ! Un problème a été rencontré.', 'mon-domaine-de-localisation' );
    echo '</div>';
 
    // afficher l'erreur à l'écran seulement si on est en mode débogage
    monprefixe_echo_debug( $erreur_sql );
}

Notez que le code précédent se charge d'afficher du code HTML ou un message d'erreur à l'écran. S'il faisait partie de la fonction de rappel d'un shortcode, il faudrait plutôt faire un return de cette information.

WordPress (PHP)

$code_html = '';
$message_aucune_donnee = __( 'Aucune donnée ne correspond aux critères demandés.', 'mon-domaine-de-localisation' );
$message_erreur_sql = __( 'Oups ! Un problème a été rencontré.', 'mon-domaine-de-localisation' );
 
$resultat = $wpdb->get_results( $requete );
$erreur_sql = $wpdb->last_error;
 
if ( "" == $erreur_sql ) {
    if ( $wpdb->num_rows > 0 ) {
        $code_html .= '<table class="...">';
         // en-têtes de colonnes 
         //...

         foreach( $resultat as $enreg ) {
            $code_html .= "<tr>";
            $code_html .= "<td>$enreg->champ1</td>";
            $code_html .= "<td>$enreg->champ2</td>";
            $code_html .= "<td>$enreg->champ3</td>";
            $code_html .= "</tr>";
        }
        $code_html .= '</table>';
    } else {
        $code_html .= '<div class="message-avertissement">';
        $code_html .= $message_aucune_donnee;
        $code_html .= '</div>';
    }
} else {
   $code_html .= '<div class="message-erreur">';
   $code_html .= $message_erreur_sql;
   $code_html .= '</div>';
 
    // écrit l'erreur dans le journal seulement si on est en mode débogage
    monprefixe_log_debug( $erreur_sql );
}
 
return $code_html;

$wpdb->get_row()

$wpdb->get_row() retournera un tableau associatif à une dimension.

Il s'agit du résultat pour un seul enregistrement.

Il n'y a donc pas lieu d'effectuer une boucle dans les résults.

WordPress (PHP)

$table_matable = $wpdb->prefix . 'monprefixebd_matable';
$enreg = $wpdb->get_row( $wpdb->prepare( "SELECT champ1, champ2, champ3 FROM $table_matable WHERE id = '%d' ", $id ) );

$erreur_sql = $wpdb->last_error;
 
if ( "" == $erreur_sql ) {
    if ( $wpdb->num_rows > 0 ) {
        echo "<div class='unitem'>";
        echo "<p>$enreg->champ1</p>";
        echo "<p>$enreg->champ2</p>";
        echo "<p>$enreg->champ3</p>";
        echo "</div>";
    } else {
        echo '<div class="message-avertissement">';
        _e( 'Aucune donnée ne correspond aux critères demandés.', 'mon-domaine-de-localisation' );
        echo '</div>';
    }
} else {
    echo '<div class="message-erreur">';
    _e( 'Oups ! Un problème a été rencontré.', 'mon-domaine-de-localisation' );
    echo '</div>';
 
    // afficher l'erreur à l'écran seulement si on est en mode débogage
    monprefixe_echo_debug( $erreur_sql );
}

$wpdb->get_var()

$wpdb->get_var() retournera une variable simple, c'est-à-dire la valeur d'un seul champ ou d'une fonction d'aggrégation.

Une utilisation typique de get_var() consiste à compter le nombre d'enregistrements dans une table.

WordPress (PHP)

$table_matable = $wpdb->prefix . 'monprefixebd_matable';
$valeur = $wpdb->get_var( "SELECT COUNT(*) FROM $table_matable" );

$erreur_sql = $wpdb->last_error;

if ( "" == $erreur_sql ) {
    echo "<p>$valeur</p>";
} else {
    echo '<div class="message-erreur">';
    _e( 'Oups ! Un problème a été rencontré.', 'mon-domaine-de-localisation' );
    echo '</div>';

    // afficher l'erreur à l'écran seulement si on est en mode débogage
    monprefixe_log_debug( $erreur_sql );
}

 

Veuillez noter que le contenu de cette fiche vous est partagé à titre gracieux, au meilleur de mes connaissances et sans aucune garantie.
Par Christiane Lagacé
Dernière révision le 17 juillet 2023
Merci de partager !

Site fièrement hébergé chez A2 Hosting.

Soumettre