Base de données et requêtes
Catégorie : Fiches techniques

Si le module que vous souhaitez créer fait appel à  des données stockées dans des tables de la Bdd, vous serez amené, dês le début de sa création, à  mettre en place vos tables et écrire les requêtes nécessaires à  l'extraction, ou l'insertion, de ces données.
Ce document a pour but de vous expliquer les grandes lignes à  suivre, le détail des méthodes utilisables se trouvant dans le mémento du développeur.

1) Les tables

2) Conventions

Respectez les conventions d'écriture, votre code n'en sera que plus lisible et compréhensible par vous-même, mais également par vos utilisateurs.
Certaines de ces conventions sont officielles, d'autres sont des conventions d'usage.
- Les instructions sql doivent être écrites en majuscules (SELECT, GROUP BY, etc.)
- Utilisez (de préférence) $sql pour écrire la requête dans une chaine de caractêre.
- Utilisez (de préférence) $result pour le résultat de la requête.
- Utilisez (de préférence) $myrow pour parcourir les lignes du tableau $result.

3) Requêtes

N'utilisez jamais directement les fonctions mysql_ , n'utilisez que les méthodes de l'object xoopsDB : $xoopsDB->prefix(), $xoopsDB->query(), etc.
* Pour vous affranchir des instructions de connection à  la Bdd.
* Pour bénéficier du mode debug sql.
* Pour une éventuelle compatibilité de xoops avec d'autres bases de données.

Ecrivez votre requête dans une chaine de caractêre ($sql) :
$sql = 'SELECT * FROM '.$xoopsDB->prefix('mymodule_table1').' WHERE champ1 = '.$variable.' AND champ2 = '.$variable2';
Cette façon de procéder présente plusieurs avantages:
- une meilleure lisibilité du code
- la possibilité d'afficher votre requête avec un echo $sql pendant la phase de mise au point
- la possibilité de concaténer votre requête suivant le résultat d'un test

$sql = "SELECT cat_id, count(*) FROM ".$xoopsDB->prefix("mymodule_table1 ");
if ( !empty($order)) $sql .= " ORDER BY ".$order;
else $sql .= " ORDER BY ".$weight;


Puis exécutez la requête
$result = $xoopsDB->query($sql)

Pendant la phase de développement, mettez un test pour vérifier son exécution
if ( !$result ) { die( 'Erreur sql : '.$sql ); }

L'astuce ci-dessus présente plusieurs avantages si votre requête ne s'exécute pas :
- votre requête s'affichera et vous permettra de voir s'il manque un élément (ex WHERE champ1= AND.)
- vous pourrez faire un copier /coller de cette requête et l'exécuter avec phpmyadmin pour voir le résultat.

Dans votre code définitif, ne laissez pas ce test, mais supprimez le, ou mieux modifiez le pour faire une redirection sur un message d'erreur, par exemple :.

if (!$result) $msg = _MD_ERROR_INSERT;
else $msg = _MD_INSERT_OK;
redirect_header("index.php", 3, $messagesent);

Prévoyez également le cas où votre requête SELECT ne retourne aucun résultat, qui, s'il n'est pas traité, peut aboutir à  une page blanche

4) Requêtes SELECT

Il existe de nombreuses méthodes pour exploiter les résultats.
Vous trouverez différents exemples à  la page xoopsDB du mémento du développeur.
N'oubliez pas que les résultats sont obtenus sous forme d'un tableau qu'il faudra parcourir pour en extraire les résultats. Une bonne compréhension de la notion des tableaux en Php vous est donc recommandée !

5) Requêtes INSERT et UPDATE

Avant d'insérer des données dans une table, et particuliêrement si elles proviennent d'un formulaire, il est impératif de contrôler la validité de ces données.
Exemple pour une donnée numérique: $number = intval($number);
Pour du texte, utilisez les différentes méthodes de la classe MyTextSanitizer.
Enfin, n'oubliez pas que votre texte, pour être inséré, doit être placé entre simples quotes.
Vous pourrez utiliser pour celà  la méthode $xoopsDB->quoteString($mytext)

6) queryF

J'avoue ne pas tout connaitre à  propos des requêtes et de queryF, et ne vous livrerai donc que ce que je sais :
- il arrive que les requêtes INSERT, UPDATE ou DELETE ne s'exécutent pas en utilisant la méthode $xoopsDB->query($sql).
- on peut utiliser dans ce cas la méthode $xoopsDB->queryF($sql), le F signifiant force.
- attention, l'utilisation non contrôlée de cette méthode peut entrainer une faille de sécurité, il est impératif de vérifier les données avant insertion.

7) Déclaration

Si vous utilisez les méthodes de la classe xoopsDB dans une fonction, n'oubliez pas de la déclarer globale:


function my_function($param) {
global $xoopsDB;

8) Mise au point

Vous disposez pour la mise au point de vos requêtes de la console de débuggage que vous activez dans
Administration>>Systême>>Préférences>>Paramêtres généraux>>Mode de mise au point>>MySQL/Blocs

Personnellement, je préfêre rester en mode Mise au point Php et insérer des echo $sql.'<br>'; à  la suite des mes requêtes, plutôt que d'avoir cette fenêtre qui surgit à  chaque page ...

Par contre, cette console de débuggage est extrêmement utile pour connaitre toutes les requêtes qui s'exécutent à  l'appel d'une page, vous permettant ainsi, entre autres, de faire la chasse aux requêtes inutiles !

<a href="http://creativecommons.org/licenses/by-nc-sa/2.0/fr/" title="Licence, certains droits réservés"><img src="http://www.frxoops.org/images/cdr_bouton.gif" alt="Licence, certains droits réservés" /></a>