Une classe de gestion d’une base de données mySQL en PHP à la sauce Rails

Ayant actuellement un projet en cours mettant en oeuvre une base de données mySQL avec PHP et n’ayant pas trouvé de classe d’abstraction qui me plait car souvent trop complète pour ce que j’ai à faire, j’ai décidé d’en créer une et de la distribuer sous licence libre. Je me suis inspiré d’ActiveRecord de Ruby on Rails. C’est vraiment bien plus basique, on est loin d’avoir autant de possibilités qu’avec ActiveRecord mais d’un autre coté, c’est simple et ça fait juste ce dont j’ai besoin.

De quelle configuration ai-je besoin ?

Utilisant la programmation objet et la version 4 de PHP n’étant pas assez complète à ce niveau, j’ai réalisé du code en PHP 5 pour cette bibliothèque. Il vous faut aussi une base de données, ici j’utilise mySQL en accès direct par les fonctions de PHP, je n’ai pas utilisé de couche d’abstraction d’accès à la base mais rien ne vous empêche de le réaliser en utilisant PDO par exemple et de me faire parvenir votre réalisation pour la diffuser ici : Cette bibliothèque est sous licence libre GPL.

Comment ça marche ? Un rapide aperçu.

Le principe est des plus simples : j’ai créé une classe Database servant de parent à tous mes futurs objets en sachant que chaque objet sera associé à une table.

Commencez donc par la création de vos tables en respectant ces quelques règles :

  • Bien que ce ne soit pas obligatoire, j’aime bien nommer mes tables en utilisant des mots qui décrivent bien leur contenu, sans majuscule et en séparant les mots par des tirets ( _ )
  • Les tables doivent avoir un champ « id » unique. Il peut être en autoincrement et il doit être un clé primaire.

Puis créez un fichier php déclarant un objet (dérivé de Database) pour chacune de vos tables, sur ce modèle :

class MaTable extends Database
 
{
 
  function __construct($connexion, $table_name)
 
  {
 
    parent::__construct($connexion, $table_name);
 
  }
 
}

Comment la mettre en place

Là encore rien n’est figé, il vous suffit d’inclure le fichier database.php à votre application et de créer autant d’objets que vous avez de tables :

include 'database.php';
 
include 'ma_table.php';$connexion = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
 
ma_table = new MaTable($connexion, 'ma_table');

Le constructeur de l’objet à besoin de deux paramètres : la connexion à la base de données et le nom de la table.

Pour simplifier tout ça, j’ai décidé de regrouper tous mes modèles (fichiers des objets correspondants aux tables, c’est le M de MVC) dans un seul répertoire et de créer une fonction d’initialisation (indépendante de la classe Database) qui s’occupe de créer les objets toute seule, cette fonction s’appelle models_initialize et elle prend en paramètre le chemin du répertoire où se trouvent les modèles. Cette fonction est disponible dans ce fichier : models.zip. Vous devrez modifier son fonctionnement pour le faire correspondre à vos besoinsmais l’essentiel y est (parcours du répertoire et création des objets)

Il vous suffit donc de créer un répertoire modeles par exemple, d’y mettre tous vos fichiers modèles (ma_table.php dans notre exemple) et la fonction « models_initialize » s’occupera de créer les variables globales suivantes :

  • $DBCon et $DBBase : variables de connexion à la base mySQL.
  • un objet pour chaque fichier nommé selon la convention que j’ai choisi : minuscules et tiret pour l’objet, majuscule de la première lettre de chaque mots sans espace pour le nom de la classe. Le nom de l’objet et de la table sont issus du nom du fichier alors faites attention de ne pas vous tromper en nommant vos fichiers.

N’hésitez pas à regarder le code source de cette fonction, il est dans le fichier database.php. C’est ici que vous devrez apporter vos modifications si vous n’utilisez pas la même convention de nommage que moi.

Téléchargement et fin de la première partie

Vous pouvez télécharger le fichier database : Sources Database. Je vous rappelle qu’il est sous licence libre GPL. Important : Maintenant, Database est intégrée au framework PHP Nano vous y trouverez une version bien plus récente mais aussi très différent du point de vue du fonctionnement.

La suite à la rentrée, je vous décrirai la façon d’utiliser les objets créés dans cette première partie. En attendant, passez de bonnes fêtes, et si vous le voulez, vous pouvez jeter un oeil aux méthodes de la classe Database j’ai essayé de les documenter au mieux…

La suite est disponible dans ce billet