Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

COUCHE D'ABSTRACTION SGBD AVEC RÉSULTATS ORIENTÉ OBJET


Information sur la source

Catégorie :Class et Objet ( POO ) Classé sous : abstract, base, fail over, load balancing, donnée Niveau : Initié Date de création : 10/09/2007 Date de mise à jour : 06/12/2007 03:33:03 Vu / téléchargé: 2 942 / 119

Note :
Aucune note

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

Description

Bonjour à tous
Une nouvelle mise à jour de la couche d'abstration à une DB.
Je vous indiquerai les modifications plus bas :)
Dans l'idée, il y a deux classes, celle de base, DB (abstract), et DBResults.
Quand vous faites un query (query, unbufferedQuery, multipleQuery, arrayQuery, objectQuery), le résultat de la requete est placé dans une nouvelle instance de la classe DBResults, qui est retourné.
Du coup, vous pouvez traiter le résultat indépendament de la classe, ce qui fait que vous pouvez faire différent query.
La méthode singleQuery, quant à elle, execute une requete uniquement de type 'action' (voir la methode isAnAction dans la classe DB) (cad autre que SHOW, EXPLAIN, DESCRIBE, SELECT).
 

Source

  • <?php
  • // On inclut les différents fichiers :
  • require_once ('genericException/genericException.class.php'); // Gestion des exceptions
  • require_once ('factory/factory.class.php'); // Factory (utilisée par dbConnector, donc nécéssaire !)
  • require_once ('db/dbConnector.class.php'); // Le connector (on peux aussi juste utiliser la factory)
  • $sCon = array ("mysql://root:passwd@127.0.0.1/dbName",
  • "pgsql://root:passwd@127.0.0.1/dbName",
  • "mssql://root:passwd@127.0.0.1/dbName");
  • // Différentes possibilités
  • // On crée l'instance de la base de donnée :
  • try {
  • $oDb = dbconnector::connect ($sCon, 'db', false, dbConnector::LOAD_BALANCING); // Load balancing ?
  • // On peux aussi utiliser dbConnector::FAIL_OVER (par défaut !)
  • }
  • catch (dbConnectorException $e) {
  • echo "Oups ! :)";
  • }
  • catch (factoryException $e) {
  • echo "Oups ! I did it again .... ?";
  • }
  • catch (... etc) {
  • }
  • // Maintenant on peux faire beaucoup de choses avec
  • // Comme faire mumuse en objet :
  • echo $oDb->query('requete')->fetchObject->NomColonne;
  • // Maintenant, il est aussi possible de faire
  • $QueryObject = $oDb->query('requete');
  • print_r ($QueryObject->fetchAll ()); // pour tout avoir
  • $QueryObject->rewind ();
  • $QueryObject->next ();
  • while ($QueryObject->valid ()) {
  • echo $QueryObject->column ('NOM ou INDEX de la colonne en cours');
  • // ou
  • $var = $QueryObject->current ();
  • echo $var['NOM ou INDEX de la colonne en cours'];
  • }
  • #
  • // la fonction prepare permet de préparer et parser une requete afin qu'elle soit prete a etre executée, exemple :
  • $sQuery = $oDb->prepare ('SELECT nom, prenom, login, passwd FROM §1user WHERE login=§2 AND passwd=§3', $TablePrefix, $LoginUser, $PasswdUser);
  • $QueryObject = $oDb->query ($sQuery);
  • #
  • #
  • // Bien sur, les méthodes de bases existes aussi, tel que (dans la classe DB):
  • /*
  • lastInsertRowid
  • lastInsertId
  • changes (= affected_rows)
  • query
  • singleQuery
  • unbufferedQuery
  • multipleQuery
  • arrayQuery
  • objectQuery
  • */
  • // Et voici les méthodes de la classe DBResults:
  • /*
  • fetch
  • fetchObject
  • fetchSingle
  • fetchAll
  • freeResult
  • column
  • numFields
  • numRows
  • * Ainsi que les éléments implémentés de la classe Iterator, Seekable et countable
  • */
  • ?>
<?php
// On inclut les différents fichiers :
require_once ('genericException/genericException.class.php'); // Gestion des exceptions
require_once ('factory/factory.class.php'); // Factory (utilisée par dbConnector, donc nécéssaire !)
require_once ('db/dbConnector.class.php'); // Le connector (on peux aussi juste utiliser la factory)


$sCon = array ("mysql://root:passwd@127.0.0.1/dbName",
				"pgsql://root:passwd@127.0.0.1/dbName",
				"mssql://root:passwd@127.0.0.1/dbName");
// Différentes possibilités

// On crée l'instance de la base de donnée :
try {
	$oDb = dbconnector::connect ($sCon, 'db', false, dbConnector::LOAD_BALANCING); // Load balancing ?
	// On peux aussi utiliser dbConnector::FAIL_OVER (par défaut !)
}
catch (dbConnectorException $e) {
	echo "Oups ! :)";
}
catch (factoryException $e) {
	echo "Oups ! I did it again .... ?";
}
catch (... etc) {

}

// Maintenant on peux faire beaucoup de choses avec
// Comme faire mumuse en objet :
echo $oDb->query('requete')->fetchObject->NomColonne;

// Maintenant, il est aussi possible de faire
$QueryObject = $oDb->query('requete');
print_r ($QueryObject->fetchAll ()); // pour tout avoir
$QueryObject->rewind ();
$QueryObject->next ();
while ($QueryObject->valid ()) {
echo $QueryObject->column ('NOM ou INDEX de la colonne en cours');
// ou
$var = $QueryObject->current ();
echo $var['NOM ou INDEX de la colonne en cours'];
}
#
// la fonction prepare permet de préparer et parser une requete afin qu'elle soit prete a etre executée, exemple :
$sQuery = $oDb->prepare ('SELECT nom, prenom, login, passwd FROM §1user WHERE login=§2 AND passwd=§3', $TablePrefix, $LoginUser, $PasswdUser);
$QueryObject = $oDb->query ($sQuery);
#
#
// Bien sur, les méthodes de bases existes aussi, tel que (dans la classe DB):
/*
lastInsertRowid
lastInsertId
changes (= affected_rows)
query
singleQuery
unbufferedQuery
multipleQuery
arrayQuery
objectQuery
*/

// Et voici les méthodes de la classe DBResults:
/*
fetch
fetchObject
fetchSingle
fetchAll
freeResult
column
numFields
numRows
* Ainsi que les éléments implémentés de la classe Iterator, Seekable et countable
*/ 
?>

Conclusion

De grosses mises à jours ont été faites.

Le groupement de classes supporte maintenant la connection sur des serveurs dispatchés, en LOAD BALANCING ou FAIL OVER.
Elle supporte MySQL, PostGreSQL, MsSQL et d'autres bientots ;)

Et comme toujours : Correction de bugs, amélioration du code, optimisation, danse avec le ptit chat, etc :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

10 septembre 2007 22:42:00 :
Modification de l'exemple
25 novembre 2007 21:34:33 :
Grosse mise à jour, modification du code, nouvelle gestion des exceptions, correction de bugs, utilisation de l'usinage, et possibilité de se connecter à plusieurs base de données grace au mécanisme de connexion corrigé :)
06 décembre 2007 03:33:04 :
Ajout de Nouveauté : Support du Load Balancing, du Fail Over. Correction de Bug. Optimisation du Code. Support de Mysql, Pgsql, Mssql.

Commentaires et avis

signaler à un administrateur
Commentaire de DiGhan le 11/09/2007 13:10:48

Salut,

La classe multiton présente dans la source de malalam est à mon sens indispensable. Elle permet de gérer les ressources et de ce fait les connexions ouvertes.
Pas de mode AUTO (connexion + selection bdd auto) , c'est dommage.
Pour les erreurs emises via exception, je pense qu'il est possible de faire plus simple :

class DBException extends Exception {
  public function __construct($sMsg, $sSearch, $sReplace) {
    $sNewMsg = str_replace($sSearch, $sReaplace, $sMsg);
    parent::__construct($sNewMsg);
  }
}
throw :
throw new DBException(DBException::ERROR, '__SEARCH__', 'mon erreur customisee');
catch :
$e->getMessage() // sans surcharge (final)

Pour le reste je trouve l'idée de la séparation action - resultat pas trop mal.

signaler à un administrateur
Commentaire de DiGhan le 11/09/2007 13:13:25

Pour le next de l'Iterateur, il me semble que c'est un comportement normal. Pour remédier à ce pb, il faut faire appel à next() dans le constructeur de ton Iterateur.

signaler à un administrateur
Commentaire de codefalse le 11/09/2007 14:57:36 administrateur CS

D'apres moi, le multiton est une autre classe qui sera utilisé pour gerer toutes les instances de mes classes. Comme c'est une autre classe, je n'ai pas pensé à la mettre ici car il y en a des tres bien sur phpcs mais perso je m'en sert pour instancier mes classes :)

Ensuite, le mode Auto, au final tu fait pareil ici, sauf que tu appel une fonction en plus, c'est pas vilain :p (c'est d'ailleur pour ca qu'il y a deux possibilités : open ou connect+selectDb)
Personnellement je préfere utiliser une fonction de plus que de "surcharger" la fonction __construct. Apres, ce n'est qu'un avis personnel :)

Pour les exceptions, au final ca revient au meme. Le probleme dans ton idée, c'est que je ne fait pas forcément appel à la fonction str_replace, or, dans ton cas, si, ce qui use d'une fonction supplémentaire (à mon avis). Maintenant, c'est sur qu'il y a des choses à améliorer :)

Pour le next dans le constructeur, je suis justement pas sur, d'apres FhX (adns les commentaires de la source de Malalam), il dit qu'il ne doit pas etre dans le constructeur, mais que c'est à toi de faire appel dans une boucle while, et que c'est fait automatiquement dans une boucle foreach, mais c'est pas mon cas :/ bizar :)

Merci bien de tes commentaires :)

signaler à un administrateur
Commentaire de neigedhiver le 19/09/2007 12:31:05

Salut,

Une classe d'abstraction c'est bien, mais c'est mieux quand c'est compatible avec d'autres moteurs que MySQL...

# $DB->connect ('host', 'login', 'password');
# $DB->selectDb ('base');

Avec postgreSQL, ça marche pas...

Même DB::open, étant donné qu'elle sélectionne la base après la connexion ne fonctionnera pas avec pgSQL...

A moins que je ne dise une ânerie, hein, mais j'ai bien cru voir que la connexion ne se faisait pas de la même manière entre MySQL et pgSQL (pour ne citer que les deux moteurs auxquels je me suis intéressé). Du coup, je pense que le code de connexion doit se trouver dans la classe concrète, puisque dépendant du moteur.

signaler à un administrateur
Commentaire de codefalse le 26/09/2007 16:08:54 administrateur CS

c'est vrai faudra que je regarde ca de plus pres ! :)
Merci pour ta remarque :)

signaler à un administrateur
Commentaire de codefalse le 06/12/2007 03:35:46 administrateur CS

Bon, grosse mise à jours, j'ai pris en compte vos commentaires :
Maintenant on peux se connecter à Pgsql (qui est pris en charge automatiquement (repertoire /db/dbms/pgsql.class.php)), mais aussi à Microsoft Sql Server (et comme toujours, à MySQL ! :))

La classe supporte la connexion à des serveurs dispatchés, en Load Balancing ou Fail Over (par défaut).

J'attends vos avis ! :)

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

LA taille d'une base de donnée sql [ par FleX ] ba en fait je suis sur Free et j'ai une base de donnée que je manipule en php.J'aimerai savoir comment c'est ty qu'on peut bien faire pour obtenir la Fichiers dans une base de donnée [ par Clem ] Comment uploader un fichier dans une base de données, et le downloader ? image aleatoire ... sans base de donnée [ par sana72 ] Bonjour,voile, je dois recharger des images tous les x tempsmes images sont stocké dans un repertoire qui porte le nom du thême et dans ce repertoire, PHP / ODBC (base access) : Pb de date ! [ par Alextasis ] AlexVoilà j'ai un ptit problème et ce serait cool si qq un pouvait me renseigner !voilà j'ai une base de donnée ACCESS tout ce qu'il y a de plus simpl Float ??? [ par Mamienova ] Je voudrais intégrer dans ma base de donnée un nombre décimal. Le seul petit probléme et que je souhaiterai qu'il n'y ait qu'un seul chiffre apres la serveur Apache et Base de donnée [ par coolboy78 ] Bonjour a tous, je dois installé un serveur Apache et crée un base de donné MySQL sous linux ( mais si vous savez le faire sous windows sa peux ken me sauvegardé tous els fichiers en envoyant tous les fichiers compréssé en 1 seul, sauvegarder la base de donnée [ par pcpourtous ] Voila, j'aimerais en un clique pouvoir sauvegarder ma base de donnée, j'ai deja trouver quelque chose la dessus et ça à l'air de marcher, j'aimerais a base de donnée [ par pablor44 ] slt,voilà j'ai un problème, j'ai créer un sité d'échange de divx. Tous mes divx y sont enregistrés dans une base de donnée mysql et mon problème c'est php et base de donnée sql.... HELP ;-) [ par zarzar ] je souhaite adapter en ligne (en php) un programme que j'ai créé sous excel et qui effectue des calculs de moyennes (avec des coeff, des matières), je Insérer du code php dans une base de donnée mysql [ par Sipadan ] Bonjour,Voici mon probleme:Dans un champ d'une base de donnée j'insére du code php du type de: &lt;? include("monfichier.php")?&gt;. Sur ma page en .p


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,468 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.