II) Les requêtes
Si vous avez déjà chipoté un petit peu au code de phpBB vous avez sûrement remarqué que la manière de gérer les requêtes n'est pas comme expliqué sur la plupart des sites de programmation php (
c'est a dire avec les fonctions habituelles de PHP : mysql_query, mysql_select_db, mysql_connect, ....)
En effet PHP a codé son propre système de requête.
Le but de ce chapitre n'est pas d'explorer la manière dont cela a été codé mais comment s'en servir pour vos MOD's.
Donc si vous voulez voir comment phpBB à procédé rendez-vous dans le fichier :
\db\db2.php
II.1 Que fait donc ce fameux fichier ?
Ce fichier utilise les classes et la programmation orientée objet (POO)
La POO n'étant pas quelque chose qui s'apprend en 3 phrases je vous invite à vous informer d'abord sur ce que c'est réellement (si vous avez de bons liens à me proposer, envoyez-les moi par MP) :
http://www.phpdebutant.org/article42.php
Ce fichier permet donc de créer et d'utiliser un objet qui permet de faire une connexion à MySQL & à une base de données, d'exécuter des requêtes, de récupérer le résultat de ces requêtes, de compter le nombre de résultats, etc...
II.2 Quel est l'avantage ?
Cet objet va gérer tout seul le type de base.
Cela permet de gérer l'installation de phpBB sur plusieurs types de base de données (l'utilisation des fonctions telles que mysql_connect ne peuvent servir qu'à des bases de données de type mMySQL, et pareillement pour les fonctions commencants par ODBC, OCI, etc).
Cela permet donc de faire des actions sur divers types de base de données en utilisant les même fonctions (méthodes en POO).
Plus besoin dans le code de se soucier du type de base 
II.3 Comment utiliser tout ce brol
II.3.1 Création de l'objet
- Code: Tout sélectionner
// Connexion avec la base de donnée
$db = new sql_db($dbhost, $dbuser, $dbpasswd, $dbname, false);
Normalement vous n'avez pas à le créer de vous même ! Il est créé dès le départ par le fichier "includes/common.php" qui le fait en incluant "includes/db.php"
La création de l'objet provoque la connexion au serveur MySQL et à la base de données concernée.
Lors de la création de l'objet certains champs d'instances (variables) sont accessibles notamment db_connect_id qui est un boolean qui contient true si la connexion s'est affectuée, false sinon une erreur a été rencontrée.
II.3.2 Test de connexion
Même remarque, ceci est dans le fichier db.php et vous ne devez donc pas le faire vous même (dans la plupart des cas).
Pour tester la connexion il suffit d' évaluer db_connect_id :
- Code: Tout sélectionner
//Teste si la connexion s' est correctement passée, sinon arrête le script et affiche qu' il n' a pu se conneceter a la bd
if(!$db->db_connect_id)
{
message_die(CRITICAL_ERROR, "Impossible de se connecter à la base de données<br />Could not connect to the database");
}
=> Ces deux actions sont simplement la fin du fichier "includes/db.php"
II.3.3 Fermer la connexion
- Code: Tout sélectionner
// Ferme la connexion
$db-> sql_close();
II.3.4 Exécuter une requête
Voici la méthode qui permet d' effectuer des requêtes SQL.
l' objet $db contient une méthode : sql_query( $sql ) qui permet dd'exécuter la requête passée en paramètre.
- Code: Tout sélectionner
$sql = "requete SQL";
//Exécute la requête sql et retourne arrête le script la requête s' est mal passée
if( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'message d\' erreur', '', __LINE__, __FILE__, $sql);
}
Si la requête n'a pas été effectuée correctement, alors arrêt du script avec le message d'erreur, la ligne, le fichier et la requête SQL.
Pour la requête SQL :
Ne mettez pas les noms des tables directement mais utilisez les Constantes définies par phpBB dans "includes/constants.php" simplement pour le fait qu'on a pu, non seulement changer le préfixe phpbb_(assez courant) mais aussi le nom des tables (pour ceux qui chipotent de trop :-p).
Exemple :
- Code: Tout sélectionner
$sql = "SELECT *
FROM " . CONFIG_TABLE;
Essayer d'utiliser les requêtes qui va avec tout type de base de données. (par exemple mysql possède certaines fonctions qui n' existent pas sous Oracle).
II.3.5 Récupération du résultat de la requête
Pour récupérer le résultat, la manière de faire est comme avec la fonction
mysql_fetch_array() de php :
- Code: Tout sélectionner
//Récupération du résultat de la requête dans le tableau $row et parcourt de ce tableau
while ( $row = $db->sql_fetchrow($result) )
{
//traitement des éléments de $row
}
II.3.6 Récupération du nombre de résultats d'une requête
Ca se passe également d'une manière proche des fonctions de PHP (e.g mysql_num_rows()) :
- Code: Tout sélectionner
// Nombre d' élements du résultat de la rquête.
$numrows = $db->sql_numrows($result);
II.3.7 Libérer la mémoire inutile
- Code: Tout sélectionner
//Libération de la mémoire inutile
$db->sql_freeresult($result);
II.3.8 Récupérer le nombre de champs de la requête
- Code: Tout sélectionner
//Nombre de champs de la requete
$numfields = $db->sql_numfields($result);
Cette méthode donne le nombre de champs de la requête.
Si la requête a échoué alors elle retourne false
II.3.9 Récupérer le nombre de colonnes affectées par une requête
- Code: Tout sélectionner
// Nombre de colonnes affectée par $result
$num = $db-> sql_affectedrows($result);
Cette méthode donne le nombre de colonnes affectées par une requête.
Si la requête a échoué alors elle retourne false
II.3.10 Récupérer l' id du dernier enregistrement
- Code: Tout sélectionner
// Id du dernier enregistrement.
$id = $db->sql_nextid(result);
II.3.11 D'autres méthodes
D'autres méthodes existent mais sont moins utilisées que celles ci-dessus.
Pour prendre connaissance de celles-ci rendez vous dans le fichier "\db\db2.php"
J'essayerai de mettre une description de ces autres méthodes 
II.3.12 Correspondance fonction mysql et méthodes class sql_db
- Code: Tout sélectionner
mysql_num_rows($query_id = 0) = $db->sql_numrows($query_id)
mysql_affected_rows() = $db->sql_affectedrows()
mysql_num_fields($query_id = 0) = $db->sql_numfields($query_id)
mysql_field_name($query_id, $offset) = $db->sql_fieldname($offset, $query_id = 0)
mysql_field_type($query_id, $offset) = $db->sql_fieldtype($offset, $query_id = 0)
mysql_fetch_array($query_id, MYSQL_ASSOC) = $db->sql_fetchrow($query_id = 0)
mysql_data_seek($query_id, $rownum) = $db->sql_rowseek($rownum, $query_id = 0)
mysql_insert_id($this->db_connect_id) = $db->sql_nextid()
mysql_free_result($query_id) = $db->sql_freeresult($query_id = 0)