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...
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 :
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 |
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 :
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.
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.
| n° | é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();
}
?>
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.
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 :**
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**
~~~~~~
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 : **
~~~~~
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) |