DBAL signifie litéralement DataBase Abstraction Layer, ou bien en français : couche d'abstraction de base de donnée. Derrière ces termes barbares se cache un concept de programmation propre aux bases de données. Comme vous le savez surement, MySQL est loin d'être le seul SGBD (type de base de donnée en gros). Il en existe de nombreux autres, certains libres et gratuits (PostgreSQL par exemple), d'autres commercials (oracle pour ne citer que lui). En PHP, chacune de ces bases de données à des fonctions propres à elle même pour éxécuter des requètes. Par exemple avec MySQL la fonction est mysql_query( tandis qu'avec PostgreSQL c'est pg_exec(). Et ainsi de suites, sachant que de plus la syntaxe des requètes peut différer dans certains cas, que les fonctions ne prennent pas forcément les même arguments, que les connexions aux serveurs ne requiert pas forcément toujours les même données ...
DBAL est un moyen de pouvoir gérer très facilement une compatibilité avec plusieurs bases de données. Pour cela, il faut créer une classe PHP pour chacune des SGBD qu'on souhaite rendre compatible avec le projet, ces classes comporteront le même nom, et les méthodes auront un nom identique pour les fonctionalités. Par exemple sous FSB2 pour éxécuter une requète, la méthode sera $db→query($sql); pour n'importe laquelle des bases de données.
Actuellement les SGBD supportées par FSB2 sont :
Les classes se trouvent dans le dossier ~/main/dbal/.
Sql_<sgbd>($server, $login, $pass, $db, $use_cache = TRUE) : Constructeur de la classe. Prend comme argument les différents paramètres de connexion pour les bases de données. Pour SQLite, la base de donnée se trouve dans le dossier ~/main/dbal/sqlite/. L'argument $use_cache détermine si on active la mise en cache de certaines requètes.
$db→query($sql, $buffer = TRUE, $cache_prefix = ' ') : méthode permettant d'éxécuter une requète. Le premier argument est la requète, le second détermine si la requète doit être bufferisée ou non. Le troisième argument $cache_prefix permet de mettre la requète en cache. Vous devez passer une chaine de caractère qui identifiera la requète, généralement il est conseillé de passer le nom de la table, par exemple forums_ ou bien groups_. Le résultat de la requète sera mis en cache dans un fichier ayant comme nom $cache_prefix ainsi qu'un identifiant basé sur le contenu de la requète. Attention il est recommandé de ne mettre en cache que les requètes étant peu souvent mises à jour (comme les smilies, les groupes, etc ...). En appelant cette méthode la variable $db→count est incrémentée.
$db→destroy_cache($prefix = NULL) : supprime les fichiers caches associés à un prefixe, par exemple si vous passez l'argument forums_ les fichiers mis en cache par un $db→query($sql, TRUE, 'forums_') seront effacés.
$db→simple_query($sql) : méthode permettant d'éxécuter très simplement une requète sans incrémentation de compteur, etc ...
$db→row($result, $function = 'assoc') : permet de parcourir ligne par ligne le résultat d'une requète. Le second argument peut prendre comme valeur assoc, row ou array suivant le type de clef dans le tableau, souhaitées.
$db→rows($result, $function = 'assoc') : renvoie toutes les lignes du résultat de la requète. Le second argument peut prendre comme valeur assoc, row ou array suivant le type de clef dans le tableau, souhaitées.
$db→free($result) : libère la mémoire alouée pour une requète renvoyant un résultat. Il est fortement conseillé d'appeler cette fonction après chacune des requètes SELECT, afin de limiter la mémoire prise durant l'éxécution de la page PHP.
$db→last_id() : renvoie la valeur de la dernière ID créee lors d'une requète INSERT, mélée à un champ subissant une incrémentation.
$db→escape($str) : Protège une chaîne contre les failles d'injection.
$db→affected_rows($result) : Renvoie le nombre de lignes affectées par une requète DELETE, INSERT ou UPDATE.
$db→query_insert($table, $ary, $insert = 'INSERT') : Méthode permettant de construire et d'éxécuter une requète de type INSERT ou REPLACE. Elle prend en premier argument le nom de la table (sans le préfixe), en second argument un tableau associatif clef ⇒ valeur, puis en troisième argument INSERT ou REPLACE. Voici un exemple d'utilisation :
$db->query_insert('test', array( 'champ1' => 'valeur1', 'champ2' => 'valeur2', )); // Va créer une requète sous MySQL : // INSERT INTO fsb2_test (champ1, champ2) VALUES ('valeur1', 'valeur2')
ATTENTION, lorsque que vous faîtes une requète REPLACE, vous devez préciser les index de cette façon :
$db->query_insert('test', array( 'champ1' => array('valeur1', TRUE), 'champ2' => 'valeur2', ), 'REPLACE'); // champ1 est un index
Il est possible de gérer des multi-insertions, c'est à dire des insertions affectants une même table, avec un même format au niveau du nombre de champs et de valeurs, le tout en une requète. Tout dépend de votre SGBD après ... Voici la syntaxe à utiliser :
for ($i = 0; $i < 3; $i++) { $db->query_insert('table', array( 'champ1' => 'valeur1', 'champ2' => 'valeur1', ), 'INSERT', TRUE); } $db->query_multi_insert(); // Va générer une requète // INSERT INTO table (champ1, champ2) VALUES ('valeur1', 'valeur2'), ('valeur1', 'valeur2'), ('valeur1', 'valeur2') // pour les SGBD le suportant.
$db→query_update($table, $ary, $where) : Méthode permettant de construire et d'éxécuter une requète de type UPDATE. Elle prend en premier argument le nom de la table (sans le préfixe), en second argument un tableau associatif clef ⇒ valeur, puis en troisième argument la clause WHERE. Voici un exemple d'utilisation :
$db->query_update('test', array( 'champ1' => 'valeur1', 'champ2' => 'valeur2', ), 'WHERE champ1 = \'yyy\''); // Va créer une requète sous MySQL : // UPDATE fsb2_test SET champ1 = 'valeur1', champ2 = 'valeur2' WHERE champ1 = 'yyy'
$db→field_type($result, $field, $table = NULL) : Renvoie le type d'un champ. $result est le résultat d'une requète de type SELECT, $field est le nom ou bien l'offset du champ, $table est le nom de la table concernée.
$db→get_field_type($result, $field, $table = NULL) : Renvoie string ou int suivant la “famille” auquel le type du champ appartient. $result est le résultat d'une requète de type SELECT, $field est le nom ou bien l'offset du champ, $table est le nom de la table concernée.
$db→list_tables() : Liste les tables de la base de donnée courante. Renvoie une ressource.
$db→sql_error() : Renvoie la chaîne de la dernière erreur.
$db→close() : Ferme la connexion à la base de donnée.