La classe wpdb

WordPress met à la disposition des programmeurs la classe wpdb pour accéder à la base de données. Tout le code WordPress, que ce soit dans l'API, dans un thème ou dans une extension, doit utiliser cette classe pour effectuer des requêtes SQL.

▼Publicité

Utilisation de la variable globale $wpdb

Une variable globale nommée $wpdb a été créée dans l'API WordPress. Les accès à la base de données se feront à l'aide de cette variable.

Pour que la variable soit accessible dans une fonction, vous devez la déclarer comme suit :

global $wpdb;

Ajustement du préfixe des tables

En utilisant $wpdb pour effectuer une requête, on peut être assuré que les requêtes entrées fonctionneront peu importe le préfixe utilisé pour nommer les tables.

Ex : $wpdb->query( "UPDATE $wpdb->comments SET comment_approved = '$status' WHERE comment_ID IN ('" . $comments_in . "')" );

Protection contre les injections SQL

À chaque fois qu'un programme effectue une requête SQL à partir de données entrées par l'utilisateur, il s'expose aux injections SQL. Comme donnée entrée par l'utilisateur, on peut retrouver :

  • une valeur saisie dans un formulaire
  • un paramètre dans l'URL (ex : dans l'URL « http://monsite.com/unepage.php?post_id=5 », 5 est la valeur donnée au paramètre post_id)
  • une valeur lue dans un cookie
  • etc.

Les injections SQL sont bien connues des utilisateurs malveillants : lorsqu'une requête SQL utilise une information entrée par l'utilisateur, on tente d'intercepter la requête originale à l'aide de caractères pouvant être interprétés par le SGBD. Tout ceci sera fait dans le but d'effectuer une requête différente de celle qui était originalement prévue.

Par exemple, prenons la requête suivante :

SELECT * FROM wp_posts WHERE ID='$_GET['post_id']'

Dans cette requête, la valeur de $_GET['post_id'] peut être n'importe quoi. Elle est tirée d'un URL sous la forme « http://monsite.com/unepage.php?post_id=5 ».

Si un utilisateur malveillant modifiait l'URL ainsi :

« http://monsite.com/unepage.php?post_id=5' OR 1=1; UPDATE wp_users SET  user_pass='motdepassecrypte' -- »

La requête exécutée sur le serveur serait la suivante :

SELECT * FROM wp_posts WHERE ID='5' OR 1=1; UPDATE wp_users SET  user_pass='motdepassecrypte' --'

En entrant un mot de passe de son choix, l'utilisateur malveillant aura ainsi accès à tous les comptes d'utilisateurs du site Web. Ouch !

Si cette requête est exécutée à l'aide de la classe $wpdb en prenant soin d'entourer la requête par un appel à $wpdb->prepare(), on bénéficiera d'une protection contre les injections SQL.

Remarquez que $wpdb->prepare() exige que chaque paramètre soit identifié par son type dans la requête (ex : %d pour décimal, %s pour chaîne, etc.).

Ex : $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $wpdb->posts WHERE ID = '%d' ", $_GET['post_id']  ) );

Principales méthodes de $wpdb

Voici quelques méthodes de la classe $wpdb dont vous pourriez avoir besoin dans votre code. Des exemples pour chacune sont disponibles sur Codex WordPress.

  • $wpdb-> suivi du nom d'une table sans son préfixe : ajoute automatiquement le préfixe utilisé par le site
  • $wpdb->prepare : protection contre les injections SQL pour les requêtes utilisant des paramètres
  • $wpdb->query : exécute une requête quelconque
  • $wpdb->get_var : exécute une requête SELECT. Le résultat consiste en une seule donnée.
  • $wpdb->get_row : exécute une requête SELECT. Le résultat est un vecteur comprenant un élément par champ pour l'enregistrement donné par la requête.
  • $wpdb->get_col : exécute une requête SELECT. Le résultat est un vecteur comprenant un élément par enregistrement pour le champ demandé.
  • $wpdb->get_results : exécute une requête SELECT. Le résultat est un tableau à deux dimensions comprenant une colonne par champ et une ligne par enregistrement.
  • $wpdb->insert : ajoute un enregistrement dans une table donnée avec des valeurs données.
  • $wpdb->update : met à jour un enregistrement donné

Pour plus d'information

« Class Reference/wpdb ». WordPress Codex. http://codex.wordpress.org/Class_Reference/wpdb

« Les tables personnalisées dans WordPress ». Nicolas Juen. http://blog.nicolas-juen.fr/2011/12/04/les-tables-personnalisees-dans-wordpress/

« WordPress Database Functions ». WP Engineer.com. http://wpengineer.com/1746/wordpress-database-functions/

« Développer pour WordPress : wpdb et les requêtes SQL ». Responsive Mind. http://www.responsive-mind.fr/developper-pour-wordpress-wpdb-et-les-requetes-sql/

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