Classe de gestion d’une base de données : l’utilisation

Dans un précédent billet j’ai présenté l’architecture et la mise en place de ma classe d’accès à une base de données mySQL. Il est temps de voir comment utiliser cette classe, c’est le but de ce billet.

Comment accéder aux données

Sur le principe du CRUD (Create Read Update Delete), cette classe contient des méthodes permettant d’effectuer les opérations de base.
Pour illustrer les exemples, nous utiliserons une table auteurs associée à l’objet Auteurs dont une instance est dans la variable $auteurs. Toujours pour l’exemple, la table est structurée ainsi :

  • un entier qui sert d’index : id
  • une chaîne pour le nom : nom

L’ajout de données

Pour ajouter un champ dans un table, il faut utiliser la méthode add. Elle prend en paramètre une table contenant toutes les données à ajouter. Les clés de la table doivent correspondrent aux noms des champs. Exemple :

/* On récupère les données issues du formulaire */
$auteur = $_POST['auteur'];if($auteurs->add($auteur))
{
    /* L'auteur à été ajouté */
}

associé au formulaire suivant :

<form action="ajoute-auteur.html" method="post">
<input name="auteur[nom]" type="text" />
<input name="auteur_ajout" value="Ajouter cet auteur" type="submit" />
</form>

Vous noterez que je n’ai rien mis pour le champ id, c’est parce que je le crée toujours en auto-incrément et c’est donc mySQL qui s’occupera d’y affecter une valeur lors de l’ajout. Cela s’applique aussi à tous les champs qui seraient définis avec une valeur par défaut : leur présence dans le tableau n’est pas obligatoire.

La lecture

Pour l’extraction de données j’ai créé trois fonctions :

  • find_first()
  • find_by_id()
  • find_all()

find_first() et find_all() ont un seul paramètre : un tableau contenant la description de notre requête, la façon de construire ce tableau est assez simple : vous pouvez y mettre trois ordres : conditions, order et limit. Par exemple :

/* Trouver les 10 premiers auteurs classés suivant leur nom */
$ressource_mysql = $auteurs->find_all( array('order'=>'nom ASC', 'limit'=>10) );
 
/* Trouver le premier auteur classé suivant le nom */
$tableau_de_retour = $auteurs->find_first( array('order'=>'nom ASC') );
 
/* Trouver les 10 premiers auteurs classes dont le nom commence par 'bal' */
$ressource_mysql = $auteurs->find_all( array('conditions'=>"nom LIKE 'bal%'", 'limit'=>10) );
 
/* Trouver l'auteur qui a l'id 123 */
$tableau_de_retour = $auteurs->find_by_id(123);

La mise à jour

La façon de faire est exactement la même que pour l’ajout de données si ce n’est qu’il faut utiliser la fonction update_attributes($id, $donnees)

  • $id est l’index du champ à mettre à jour.
  • $données est le tableau contenant les données. Vous n’êtes pas obligé de mettre tous les champs présents dans la table, seul ceux qui sont dans le tableau sont mis à jour.

Il existe aussi une fonction permettant de mettre à jour un seul champ : update_attribute($id, $champ, $valeur)

La suppression de données

La aussi c’est très simple : la fonction destroy($id) permet de supprimer un enregistrement.

Extensions

Selon vos besoins et selon vos donnés, vous devrez ajouter des fonctionnalités à ces méthodes, par exemple : rechercher tous les auteurs selon leur nom. Ajoutez vos méthodes dans les fichiers correspondant à vos tables. Dans notre exemple vous pouvez créer une méthode find_all_by_name() dans le fichier auteurs.php

class Auteurs extends Database{
    function __construct($connexion, $table_name)
    {
        parent::__construct($connexion, $table_name);
    }
 
    public function find_all_by_name($name)
    {
        return $this->find_all(array("conditions"=>"name = 'hobb'");
    }
}

Ce qu’il reste à faire

Comme je l’ai déjà dit, le but de cette classe est juste de rendre service en gérant simplement des données, c’est pourquoi il n’y a pas d’abstraction au niveau de la gestion de la base de données même : On accède uniquement à une base mySQL. Il serait intéressant de sortir cette gestion de cette classe et de créer une autre couche permettant d’accéder à d’autres base de données comme PostgreSQL ou SQLite.

Si vous utilisez cette classe dans un de vos projets, vous pouvez m’envoyer l’adresse du site en question avec une petite description du projet afin d’être cité dans le billet des utilisateurs de cette classe.

5 commentaires ↓

#1 Lionnel on 10.13.07 at 14:17

Au cas où nous avons un login à place du id comment faire pour l’utiliser? Merci

#2 Stéphane on 10.17.07 at 9:13

Vous récupérez les données avec le finder (find_…) et vous pouvez mettre à jour avec la fonction update_attribute. La façon dont est programmée cette classe rend le champ id obligatoire.

#3 Karima on 12.14.07 at 19:12

Bonjour,

J’utilise database que je trouve pratique mon site internet. Par contre, j’ai un petit soucis lors de l’insertion, les données s’enregistrent 2fois voir 3 fois dans la BD. Est-ce que tu as une idée du problème ?

#4 Stéphane on 01.02.08 at 14:37

Un exemple concret aiderait sûrement à mieux voir le problème

#5 Karima on 01.03.08 at 11:26

Voici mon formulaire :

<form action="./update.php?update=fonctionadd" class="center" method="post">

<div class="cadrePage">
<label class="labelUpdateProfil">Fonction :</label>
<input type="text" name="fonction[nom_fonction]" value="" class="formUpdateProfil" />
</div>

<div class="cadrePage">
<input type="submit" value="Ajouter" class="formUpdateProfil" />
</div>

</form>

et la page de traitement du formulaire update.php :

<?
……
……

switch($_GET['update'])

{ case "fonctionadd":

$_POST['fonction']['nom_fonction'] = htmlentities($_POST['fonction']['nom_fonction'],ENT_QUOTES,"utf-8");
if($t_fonctions->add($_POST['fonction']))
{ ?>

<p class="alignementjustify">La nouvelle fonction a bien &eacute;t&eacute; enregistr&eacute;e dans la base de donn&eacute;es.</p>

<? } break; ?>
…….
…..
…..etc.

Laisser un commentaire