wikiDevClassesData

Manirac

LES CLASSES DE GESTION DE DONNEES

PARTIE 1 - LES CLASSES GENERALES

Retour au sommaire général

1 Introduction

Paroiciel utilise un sorte de motif (degin pattern) de type DAO. Celui-ci est incomplet et assez mal foutu, mais il fonctionne à peu près bien. Il utilise trois classes générales (basemysqli, tablemysqli et querymysqli) qui sont regroupées au sein du fichier class.databasei.php situé dans le dossier php/shared/services.

Ces classes permettent l'accès à la base mysql en utilisant les API mysqli inclus dans le package général PHP. Elles ont pour objectif de masquer l'accès à la base de données aux objets qui les utiliseront. En effet, tout en conservant les mêmes méthodes, on pourrait tout à fait, en les réécrivant, changer de moteur de base de données ou bien changer d'API pour accéder à la base mySql.

La classe tablemysqli est ensuite spécialisée pour créer des classes spécifiques permettant de gérer les tables ou les objets (ensembles de tables cohérents d'un point de vue de la gestion de Paroiciel) : foyers, personnes, agendas, etc...

2 Les Classes Générales

2.1 la classe basemysqli

La classe basemysqli spécialise la classe mysqli. Elle crée un objet de connexion à la base de données. Il faut fournir au constructeur les renseignements suivants :

  • nom ou adresse IP de l'hôte (le serveur) qui accueille le moteur et la base de données mysql. Souvent, c'est le même que celui qui héberge le serveur Web (apache ou IIS).
  • nom de l'utilisateur mysql qui permet de manipuler la base paroiciel. Cet utilisateur doit être de préférence local (il n'accèdera à mysql que depuis le serveur Apache situé, le plus souvent, sur le même hôte). Eviter l'utilisateur root (inclus de base dans mysql).
  • mot de passe correspondant de l'utilisateur mysql. N'ayez pas peur de le complexifier !
  • nom de la base de données paroiciel (le plus souvent paroiciel si installation en local, mais pas obligatoire).

En retour, on reçoit un objet de connexion qu'on doit utiliser lors de l'instanciation des classes tablemysqli (et de ses dérivées) ou bien querymysqli).

la classe contient les getteurs suivants :

méthode type Résultat Explications
getHost String nom ou adresse IP de l'hôte
getUsr string nom de l'utilisateur
getPwd string mot de passe de l'utilisateur
getBdd string nom de la base de données utilisée

2.2 la classe tablemysqli

Cette classe est la plus complexe des trois. En effet, elle permet de manipuler une table de la base de données. Elle incorpore donc un certain nombre de fonctions qui permettent :

  • la lecture des enregistrements
  • le rajout de nouveaux enregistrements (insert)
  • la mise à jour d'enregistrements existants (update)
  • l'effacement d'enregistrements (delete)

En revanche, elle ne permet pas de modifier la structure de la table.
Ceci permet de conserver un certain niveau d'abstraction par rapport à l'implémentation de la base de données.

2.2.1 comment lire des enregistrements avec tablemysqli ?

Le processus de lecture des enregistrements en utilisant tablemysqli fonctionne de la manière suivante un peu à la manière d'un curseur pour explorer une collection.

étape méthode Explications
1 sélection des enregistrements setQuery() setQuery constitue un tableau associatif des enregistrements comprenant les lignes de la table correspondant aux critères de tri et de sélection donnés en paramètre à la méthode.
2 lecture du 1° enregistrement getFirst() les valeurs des champs de l'enregistrement peuvent être lues à l'aide la méthode getFV() et modifiées avec setFV().
3 test de fin de sélection getEof() cet méthode rend un booléen : vrai : on a atteint la fin de la sélection, faux : on peut continuer.
4 lecture du suivant getNext() commme pour getFirst(), les valeurs des champs de l'enregistrement sont accessible avec la méthode getFV() et modifiables avec setFV().

Au lieu de la séquence getFirst()/getNext() (qui commence au 1° enregistrement de la sélection), on peut utiliser getLast() / getPrevious() qui permet de commencer au dernier enregistrement de la sélection et de remonter vers le premier.

Exemple :

<?php
//connexion à la base
$maBase = new basemsqli("localhost","root","","paroiciel");
// instanciation de la table f_diocese
$maTable = new tablemysqli('f_diocese',$myBase);
// sélection des enregistrements : tous les diocèses qui comment par la lettre "R"
// tri des enregistrements par nom de département
$maTable->setQuery('NomDiocese like \'R%\'','nomDepartement');
// lecture du 1° enregistrement
$maTable->getFirst()
// tant qu'on n'est pas à la fin de la sélection
// on affiche le nom du département
// et on lit le suivant.
while (!$maTable->getEof()) {
    echo $maTable->getFV('nomDepartement');
    $maTable->getNext();
}
?>

2.2.2 comment rajouter des enregistrements dans une table avec tablemysqli ?

Pour rajouter un enregistrement avec la classe tablemysqli, il suffit de donner la valeur à chacun des champs avec la méthode setFV() puis d'invoquer la méthode insert().

exemple :

<?php
//connexion à la base
$maBase = new basemsqli("localhost","root","","paroiciel");
// instanciation de la table f_diocese
$maTable = new tablemysqli('f_diocese',$myBase);
// rajout d'un enregistrement
$maTable->setFV('IDDiocese',NULL);                        //IDDiocese est l'identifiant de la table. il est en autoIncrément.
$maTable->setFV('NomDiocese','Fort de France');
$maTable->setFV('NumDepartement','972');
$maTable->setFV('NomDepartement','MARTINIQUE');
$maTable->insert();
?>

Notez bien la nécessité de la valeur NULL pour le champ en auto-incrémentation.

2.2.3 Comment mettre à jour ou effacer un enregistrement ?

Pour mettre à jour un enregistrement (changer la valeur de certains champs), il est impératif d'avoir au préalable lu cet enregistrement. Le curseur doit être positionné dessus. En effet, la méthode update() met à jour TOUS les champs de la table. Par conséquent, il faut que ceux qui ne changent pas soient chargés à leur valeur initiale. On utilise la méthode setFV() pour changer la valeur des champs et la méthode update() pour opérer la mise à jour.

exemple :

<?
//connexion à la base
$maBase = new basemsqli("localhost","root","","paroiciel");
// instanciation de la table f_diocese
$maTable = new tablemysqli('f_diocese',$myBase);
// lecture de l'enregistrements à mettre à jour
$maTable->setQuery('IDDiocese = \'104\'');
// lecture de l'enregistrement
$maTable->getFirst();
if (!$maTable->getEof()) {    // vérification que l'enregistrement existe.
    // Modification des champs voulus 
    $maTable->setFV('GpsLatitude';14.6415);
    $maTable->setFV('GpsLongitude',-61.051388);
    $maTable->update();
}
?>
~~~~~~

Pour effacer un enregistrement, on procède de même (lecture puis effacement) en utilisant la méthode **delete**() :

**exemple :**
setQuery('IDDiocese = \'104\''); // lecture de l'enregistrement $maTable->getFirst(); if (!$maTable->getEof()) { // vérification que l'enregistrement existe. $maTable->delete(); } ?>
Ces méthodes ne permettent pas de faire une mise à jour ou un effacement d'un ensemble d'enregistrements. Pour faire cela, il vaut mieux utiliser la classe querymysqli.

### 2.2.4 Comment utiliser des déclencheurs avant ou après insertion ou mise à jour ?

Il est possible de mettre en place des déclencheurs avant et après l'exécution de l'Insert. Traditionnellement, le déclencheur 'Avant' sert à vérifier les valeurs des champs, le déclencheur 'Après' sert à gérer des mises à jours dans d'autres tables de la base.

Les triggers sont des fonctions PHP qui utilisent une liste de paramètres figée. Ils rendent soit une chaine (string) correspondant à un message d'erreur; soit rien (un simple return).

Les paramètres figés attendus sont les suivants :

paramètre|explication
--------|-----
$pNbFields|nombre de champs de la table
$pvFields|tableau associatif contenant la valeur des champs
$pOldVFields|tableau associatif contenant la valeur antérieure des champs (avant mise à jour par exemple)
$pdb|objet de connexion |a base

** exemple : insert avec triggers**
setFV('IDDiocese',NULL); //IDDiocese est l'identifiant de la table. il est en autoIncrément. $maTable->setFV('NomDiocese','Fort de France'); $maTable->setFV('NumDepartement','972'); $maTable->setFV('NomDepartement','MARTINIQUE'); try { $maTable->Insert(BeforeDioIU,AfterDioIU); { ... ... exit; //Trigger BeforeDioIU : à exécuter avant l'insertion ou la mise à jour de la table Diocese // les paramètres de cette fonction sont figés. function BeforeDioIU($pNbFields,$pvFields,$pOldVFields,$pdb) { if ($pvFields['numDepartement'] < 1) { return ('Le numéro de département est erroné'); // les erreurs sont renvoyées sous forme de String } return; //si tout se passe bien la fonction ne retourne aucune valeur. } // Trigger AfterDioIU : à exécuter avent l'insertion ou la mise à jour de la table Diocèse // les paramètres sont les mêmes que pour le trigger Before. function AfterDioIU($pNbFields,$pvFields,$pOldVFields,$pdb) { writeLog ('L'insertion du diocèse".$pvFields['NomDiocese']."s'est bien déroulée"); return; //si tout se passe bien la fonction ne retourne aucune valeur. } ?>

~~~~~~

2.2.5 Consistance des requêtes

Par défaut, mysql avec le moteur InnoDB commite chaque requête dès lors qu'elle est exécutée. Il est possible de changer ce mode de fonctionnement avec tablemysqli en utilisant les méthodes startTransaction(), commit() et rollback().

exemple :

~~~~~~

setFV('IDDiocese',NULL); //IDDiocese est l'identifiant de la table. il est en autoIncrément. $maTable->setFV('NomDiocese','Fort de France'); $maTable->setFV('NumDepartement','972'); $maTable->setFV('NomDepartement','MARTINIQUE'); // début de la transaction $maTable->startTransaction; try { $maTable->Insert(BeforeDioIU,AfterDioIU); } catch Exception $e { // si la transaction échoue, on fait un rollback sur la base qui annule toutes les requêtes faites depuis le dernier startTransaction(). echo "erreur dans l'insertion"; $maTable->rollback(); } // sinon on fait un commit qui valide toutes les requêtes et les applique effectivement sur la base. $maTable->commit(); ?>
### 2.2.6 Quelques méthodes intéressantes de la classe tablemysqli

Méthode|paramètres|type|Explications
--------|----|------|---------------------------
getCount|$uneSelection|Integer|Rend le nombre d'enregistrements correspondant à la sélection passée en paramètre
getInserId|néant|Integer|Rend la dernière valeur du champ autoincrémenté d'une table (par exemple après un Insert ou un update.
getFieldsName||Array|rend un tableau qui contient le nom de chaque champ de la table
getNFields||Integer|rend le nombre de champs de la table
getNRecords||Integer|fournit le nombre d'enregistrements dans la collection retournée par setQuery
getNrCurrentRecord||Integer|Donne le n° d'ordre de l'enregistrement courant dans la collection retournée par setQuery
getOldRecord||array|rend un tableau contenant la valeur initiale de chaque champ même après update
getRecord||array|rend un tableau contenant la valeur actuelle de chaque champ (après update)
getTableName||String|fournit le nom de la table.

## 2.3 la classe querymysqli

Le but de cette classe est de réaliser directement des requêtes sur la base de données. Les requêtes peuvent être de n'importe quelle nature mais il vaut mieux pour des raisons d'indépendance du code par rapport aux données s'en tenir à des ordres SELECT qui sont à peu près normalisés dans toutes les bases de données.

Le constructeur de cette table nécessite les paramètres suivants

paramètre|obligatoire ?|Explications
--------|----|------------------
$query|Oui|une chaine de caractères qui contient un ordre SELECT valide. Il est mieux de constituer cette chaine dans une variable en amont de l'instanciation de la table.
$bdd|Oui|un objet de type basemysqli
$limit|Non|Précise l'OFFSET de la requete.
$nb|non|Précise le nombre de lignes à récupérer dans la requête (voir des explications : http://sql.sh/cours/limit)

On utilise la classe queymysqli comme la classe tablemysqli à la différence qu'on peut réaliser une requête complexe (avec des jointure, des unions, etc...). Ensuite, on retrouvera les mêmes propriétés et les mêmes méthodes pour naviguer dans la collection que rend la requête.

**exemple : **
base); // affichage du nombre d'enregistrements echo $monQuery->getNrecords; $monQuery->getFirst(); while (!$monQuery->getEof()) { // impression n° enregistrement courant, nom paroisse et nom du lieu echo 'Numero : '.$monQuery->getNrCurrentRecord.' - '$monQuery->getFV('NomParoisse').' '.$monQuery->getFV('NomLieu'); $monQuery->getNext(); } ?>

~~~~~

Ainsi qu'on le voit dans cet exemple, les renseignements proviennent des 2 tables unies par la jointure.

On retrouve pour querymysqli de nombreuses propriétés et méthodes communes avec la classe tablemysqli.

Méthode paramètres type Explications
getNRecords Integer fournit le nombre d'enregistrements dans la collection retournée par setQuery
getNrCurrentRecord Integer Donne le n° d'ordre de l'enregistrement courant dans la collection retournée par setQuery
getRecord array rend un tableau contenant la valeur actuelle de chaque champ (après update)

Retour au sommaire général


Related

Paroiciel v.11: wikiDev

MongoDB Logo MongoDB