Traitement et affichage des requêtes dans base de données wordpress
C'est bien joli d'avoir nos tables dans base de données, maintenant, nous allons afficher les résultats de nos insertions. Nous avons vu dans le tutoriel sur l'installation du plugin wordpress comment ajouter des tables (et les supprimer), nous allons maintenant voir comment traiter ces données.
Récupération des derniers messages du chat
Regardez pour cela la fonction getLastMessages() de notre plugin qui effectue quelques requêtes simples, mais d'abord décrivons là :
/**
* Renvoi les derniers messages du chat
* @global wpdb $wpdb
* @return array $messages
*/
function getLastMessages($channel = 1,$last_date = null)
{
global $wpdb;
$options = get_option($this->adminOptionsName);
$excludes = preg_split('@\s*,\s*@', $options['exclude_ips']);
if($options['enabled']!='false' && !in_array($_SERVER['REMOTE_ADDR'], $excludes))
{
$table_name = $wpdb->prefix.'jschat_messages';
//print "-$last_date-";
if($last_date==null || trim($last_date)=='')
{
$sql = $wpdb->prepare("SELECT * FROM $table_name WHERE canal='%s' ORDER BY created_at DESC LIMIT 0,9", $channel);
$messages = $wpdb->get_results($sql);
}
else
{
$sql = $wpdb->prepare("SELECT * FROM $table_name WHERE UNIX_TIMESTAMP(created_at)>UNIX_TIMESTAMP('%s') AND canal='%s' ORDER BY created_at DESC LIMIT 0,9", $last_date,$channel);
$messages = $wpdb->get_results($sql);
}
return $messages;
}
return '';
}
Cette fonction :
- récupère l'objet global $wpdb qui permet l'accès au model,
- récupère les options d'administration
- si le chat et activé et que l'utilisateur n'est pas banni, elle récupère les derniers messages,
- si l'argument $last_date est ok, elle sélectionne les 9 derniers messages du canal de discussion concerné,
- sinon, la sélection n'est effectué que sur les entrées dont la date est supérieure à $last_date,
- on renvoi les messages.
Voilà pour la description, intéressons nous maintenant à la première requête.
Requête dans la base de données Wordpress
global $wpdb;
$sql = $wpdb->prepare("SELECT * FROM $table_name WHERE canal='%s' ORDER BY created_at DESC LIMIT 0,9", $channel);
$messages = $wpdb->get_results($sql);
Pour effectuer une requête, il faut donc récupérer l'objet global $wpdb et ensuite préparer la requête avant de l'envoyer.
Sécurité et accès aux données de la base Wordpress
Comme dans tout accès à n'importe quelle base de données, il est important de se prémunir des injections SQL. SI vous ne le faite pas, un utilisateur malveillant/hackeur pourra avoir accès à votre base (le même accès que l'utilisateur de la base de données Wordpress) : cela peut être un carnage, d'où l'utilisation de la méthode prepare() de l'objet $wpdb. Ce code est +/- équivalent à :
$sql = sprintf("SELECT * FROM $table_name WHERE canal='%s' ORDER BY created_at DESC LIMIT 0,9", mysql_real_escape_string($channel));Où mysql_real_escape_string() de PHP échappe la variable et prévient contre le SQLInjection. Soyez donc vigilants, de nombreux plugins wordpress sont facilement hackés ; de plus, si vous comptez distribuer votre plugin wordpress, le code source sera accessible au grand public.
Récupérer les données
Une fois votre requête correctement formatée, vous pouvez récupérer les données dans une variable avec la méthode get_result() :
$messages = $wpdb->get_results($sql);
La variable récupérée ($messages) sera un tableau d'objets dont les attributs correspondent aux noms de colonnes de la table de votre base de données. Il est donc très facile de la afficher.
Affichage des données
Nous affichons les messages dans les fichiers php widget.php et page.php, il suffit de boucler sur le tableau d'objet décrit précédemment :
<?php for ($i = count($messages) - 1; $i >= 0; $i--): ?>
<p><span class='author'><u><?php print $messages[$i]->pseudo; ?></u> : <?php print strToSmileys($messages[$i]->message); ?></span></p>
<?php endfor; ?>
Plus simplement, vous auriez tout aussi bien pu faire :
<?php foreach ($messages as $message): ?>
<p><span class='author'><u><?php print $message->pseudo; ?></u> : <?php print strToSmileys($message->message); ?></span></p>
<?php endforeach; ?>
Voilà pour l'accès aux données wordpress, ce n'est pas si terrible ;-)












Commentaires