begin process at 2010 03 20 08:29:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de données

 > [POO] - CLASSE D'ACCÈS BDD MULTI SGBD

[POO] - CLASSE D'ACCÈS BDD MULTI SGBD


 Information sur la source

Note :
Aucune note
Catégorie :Base de données Classé sous :Base, Connexion, Class, RecordSet, SGBD Niveau :Débutant Date de création :10/02/2009 Date de mise à jour :12/02/2009 16:13:35 Vu / téléchargé :4 161 / 303

Auteur : TheWeasel47

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note


 Description

Salut a tous !

Tout d'abord le titre parle de lui même, en fait il s'agit d'une classe, qui permet un accès uniforme à la BDD quelque soit le SGBD derrière (Oracle,SQlLite, Mysql...).

L'intérête d'une tel source est de développer indépendament du SGBD, et lors d'une migration vous n'aurez qu'un paramètre à changer pour indiquez que vous avez changé de SGBD (plutot que toute une source à revoir). Et même si des librairies existent (je l'ai appris grâce aux commentaires), ceci est plutot un exercice de style.


Source

  • /*
  • IN THE ZIP FILE
  • */
/*
    IN THE ZIP FILE
*/

 Conclusion

Je pense rajouter plus tard :
        - Un gestion de cache
        - Un accès a la structure des base de données
        - Une correction des requêtes (certaines passent sous MySQl ne passent pas sous Oracle)

J'ai aussi besoin de vous ! Je voudrais des avis constructifs sur cette classe, ainsi que des techniques d'optimisations. Si vous avez des exmples déja fait je suis preneur.


Merci beaucoup
TheWeasel47

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

11 février 2009 16:20:20 :
=>Meilleur Gestion des erreurs (suites aux conseils) =>Class séparées et chargement automatique
12 février 2009 16:13:36 :
Meilleurs Gestion des erreurs et ajout des @, pour n'avoir que les remontés d'Exeption et pas les messages PHP qui polluent l'affichage.

 Sources du même auteur

Source avec Zip EVALUER UNE EXPRESSION À PARTIR D'UNE CHAINE DE CARACTÈRE
COPIER UN REPERTOIRE OU DEPLACER UN REPERTOIRE
Source avec Zip GEO-LOCALISATION (CONTINENT)
SECURITÉ PROTECTION AUTOMATIQUE CONTRE MAGICQUOTE ET REGISTE...
Source avec Zip DECOMPOSEUR DE PDF (EXTRACTION DES PAGES) -[PHP-5 ORIENTÉ OB...

 Sources de la même categorie

RECUP IDENTIFICATION par luludovicp
Source avec Zip EXTEND MYSQLI par petibras
Source avec Zip CLASSE DE COMMANDES PEAR DB par pascalmintrosse
Source avec Zip AFFICHER LE RÉSULTAT D'UNE REQUÊTE SQL SUR PLUSIEURS PAGE par karimmass
Source avec Zip SQLDIFF : MIGRATION, VERSIONNING ET SYNCHRONISATION DE LA ST... par aKheNathOn

 Sources en rapport avec celle ci

Source avec Zip POO - LOGGING PACKAGE par Waredan
POO - OBJECT CLASS par Waredan
Source avec Zip POO - FACTORY CLASS par Waredan
POO - SINGLETON CLASS par Waredan
NEWSLETTER SIMPLE ENREGISTREMENT DES DONNES par GillesWebmaster

Commentaires et avis

Commentaire de garfield90 le 10/02/2009 17:00:28

Aime pas :
- la fonction exit dans une classe, leve une exception et laisse le developpeur le soin de gérer celle ci comme il le souhaite.
- le @ qui n'est la que pour masquer l'incompétence d'un développeur.
- l'existence de plusieurs classes dans le même fichier (ajoute de la charge pour rien)
- l'absence d'interface pour définir les méthodes des différentes connexions DB


Aime:
- l'utilisation de la portée




Commentaire de TheWeasel47 le 10/02/2009 17:09:32

Yes c'est le genre de commentaire que j'aime !
      - Donc lever une exeption je vais me renseigner pour savoir comment faire

      - le problème c'est que sans le @ il m'affiche l'erreur et sa me gene pour ma gestion d'erreur, sinon en général je n'en met pas ! as tu une solution ?
    
      -Donc je sépare les class des fichiers mais il faudra donc bien les charger  toute pour l'utilisateur quel intéret ?
    
     -je n'ai pas compris ta derniere remarque j'ai fait une classe abstraite pour les curseurs ?


MErci beaucoup !
TheWeasel47

Commentaire de NewSky le 10/02/2009 17:18:10

Salut,

peu étonnant que toutes les requêtes ne fonctionnent pas sur tous les SGBD : aucun ne respecte intégralement la norme SQL (essentiellement avec la clause LIMIT) et chacun y va de sa petite implémentation.

Déjà, depuis PHP5, il y a PDO qui est déjà une librairie d'abstraction pour les différents SGBD du marché.

Il existe une librairie très simple, écrite sous le modèle objet de PHP4 : ezsql. Je l'ai utilisé pendant bon nombre de temps.

Aujourd'hui, je me tourne plutôt vers des librairies ORM complètes telle que Zend_DB ou encore Doctrine. il en existe bien d'autres : propel, phpMyObject, ... Une recherche "ORM PHP" dans ton ami google te donnera quelques résultats utiles.
En outres, ces librairies répondent à tes questions (cache, accès a la structure des DB, correction du SQL pour les différents SGBD, ...)

En ce qui concerne ta source, j'ai juste jeté un oeil furtif et je ne pourrait pas dire grand chose...

Commentaire de webdeb le 10/02/2009 17:24:41

Tu t'es embêté pour pas grand chose... L'extension de PDO est faite pour ça et a l'avantage d'être bien plus performante et plus complète que ta classe.

D'autre part, le SQL n'étant pas si standard que ça, tu trouveras des requêtes SQL qui fonctionnent uniquement sur MySQL et d'autres qui ne fonctionneront que sur Oracle par exemple. Tous les SGBDR ayant chacun leurs spécificités (support des arbres XML sous Oracle par exemple), les requêtes SQL évoluent en conséquence. Des mots-clés différents et des syntaxes différentes sont intégrées dans chaque SGBDR. De ce fait, il est très difficile d'arriver à faire une véritable couche d'abstraction de DB.

Je t'invite à jeter un oeil à PDO ainsi qu'à des projets comme Propel et Doctrine qui sont des ORMs basés sur PDO ;)

++

Commentaire de webdeb le 10/02/2009 17:25:11

Grilled by NewSky ^^

Commentaire de NewSky le 10/02/2009 17:26:54

;-)

Commentaire de garfield90 le 10/02/2009 17:31:21

pour la levée d'exception, je vais te donner un exemple :
dans ta classe
function connexion(){
     if ( $this->Connexion =  mysql_connect(   $this->Serveur, $this->Utilisateur, $this->MotDePasse ) ){
     if ( false === mysql_select_db($this->Base, $this->Connexion ){
       throw new Exception('Base inconnue');
     }
  }else{
     throw new Exception('Connexion au serveur impossible');
  }
}


et dans ton code
try{
   $oDBConnector = new BaseDeDonnee('mysql', 'root', 'password', 'localhost', 'maDB');
   $oDBConnector->connexion();
}catch( Exception $e){
    // je traite mon exception i.e. la non connexion a ma base de donnée ou a mon serveur de base de donnée
}


Tu utilises rarement plusieurs moteurs de bases de données en meme temps, donc tu ne charges que les fichiers nécessaires (c.a.d. que si tu n'utilises que MySQL, aucun interet de savoir gérer Oracle ou SQLite). => Mémoire libérée.

Classe abstraite != Interface

Une interface te permet de faire un prototypage obligatoire dont dérive tes classes l'implémentant (une classe en php peut avoir plusieurs interfaces)
http://fr.wikipedia.org/wiki/Classe_(informatique)#Interface

une classe abstraite te permet de définir des méthodes et aussi dans implémenter quelques unes. Cependant cette classe n'est pas appelable directement.

Faire des interfaces et des classes abstraites te permet de découpler encore plus tes fonctionnalités.





Commentaire de Delphiprog le 10/02/2009 21:33:09 administrateur CS

C'est un bel exercice de style mais ça ne restera que cela. Je rejoins mes prédécesseurs pour affirmer que PDO est une couche d'abstraction aboutie, éprouvée, simple et robuste.

Attention à ne pas confondre couche d'abstraction d'accès à une base de données et un ORM comme on peut le lire plus haut.

Commentaire de webdeb le 10/02/2009 23:47:38

@Delphiprog : c'est bien pour cette raison que l'on mentionne que les derniers projets d'ORM du moment s'appuient sur PDO. D'autre part, il ne faut pas non plus dire que PDO est une couche d'abstraction de base de données. Ce n'en est pas véritablement une puisque les requêtes SQL écrites dépendent toujours du SGBDR avec lequel on s'interface via PDO. PDO est donc à mon sens principalement un connecteur commun pour un bon nombre de SGBDR du marché plus qu'une véritable couche d'abstraction de bases de données.

Commentaire de TheWeasel47 le 11/02/2009 14:26:14

Yes !
Ok bah merci pour tous ces commentaires qui touchent sur une piste. Effectivement c'est surtout un exercice de style et puis sa permet d'avoir divers avis ! C'est loin d'etre inutile :D.

En tout cas si vous voyez sur le plan des sources la possibilité d'optimiser, d'améliorer. Je vais mettre vos technique en oeuvre en tous cas !

Merci beaucoup !
TheWeasel47

Commentaire de codefalse le 12/02/2009 09:35:15 administrateur CS

Bon, si l'on reste sur le code tel qu'il est proposé, il y a plein de points à revoir, par l'auteur, et par les "commentateurs" :

faire un
try {
   $object->function_that_throw_sth ();
}
catch (Exception $oE) {
   throw new Exception ($oE->getMessage ());
}

Ca ne sert à rien, à part éventuellement changer le type d'exception (si à l'origine, l'exception lancée n'est pas de type Exception mais une fille étendant la classe Exception). Si c'est une exception, tu ne la catch pas : tant qu'elle sera pas catchée, elle remontera dans les fonctions. En fait, ce que tu fait là avec ton code, php l'aurait fait sans ton try/catch.

@Garfield: "le @ qui n'est la que pour masquer l'incompétence d'un développeur.". Je suis pas d'accord avec toi. Je suis tout à fait d'accord sur le fait que mettre le @ cache la misère, et est la méthode de facilité pour le développeur, mais masquer l'incompétence d'un développeur, non.
Un exemple de pourquoi, la fonction "parse_url".
Elle te retourne un tableau de tous les éléments d'une url (le schéma (ex: http), l'utilisateur, le mot de passe, le serveur, le port, le path, le query, etc (exemple, dans l'ordre : http://user:pass@serveur:80/path?query). Si celui qui donne l'url, retourne une url mal formée (dans notre cas, si tu te connecte à ta base de donnée en fournissant un dsn de la forme url (mysql://root:pass@localhost:3306/dbname), et que cette url est mauvaise, la fonction va génerer une erreur de type e_warning. Tu ne l'as pas forcément voulue, et tu ne peux rien faire pour l'éviter. Le @ (ou modifier le error_reporting) semble être la seule façon de ne pas afficher l'erreur. Bien sur il faudra tester le retour par la suite, savoir si la fonction à bien fait son travail ou pas.

Dans tes classes, il manque un gros point (entre autres), c'est l'usage de la SPL. Elle va te permettre de faire des itérations (dans ton cas) pour retourner une liste de résultats de tes requêtes.

Je ne peux que te conseiller d'aller voir les couches d'abstractions faites par certains membres de CS, tel que FhX, Malalam, moi et probablement d'autres. Regarde comment c'est fait, regarde la structure, les différents usages, et tu verra la complexité du truc :)

Bien sûr, comme je le dis tout le temps, utilisez PDO !!
C'est à peine plus lent que mysql_query (de quasiment rien, donc négligeable), et ca vous permet d'avoir une architecture modulaire, qui vous permettra d'utiliser du mysql comme du oracle, et avec un ensemble de classes bien faites, votre application sera complètement adaptée, rien qu'en changeant le dsn de connection !

Bon courage pour la suite :)

Commentaire de TheWeasel47 le 12/02/2009 14:44:33

Salut !

Bon Merci pour le explications. Pour la gestion des exeptions en fait je ne savais pas ! C'est ma première gestion :D, je vais donc corriger ça.

Pour ce qui est du @, je suis d'accord avec toi, je ne suis pas fan de ce genre de programmation, toutefois ça affiche des erreurs alors que je prefererai les traiter avec Exeptions.
typiquement :Warning: mysql_connect() [function.mysql-connect]: Access denied for user 'root2'@'localhost' (using password: NO) in D:\wamp\www\BDD\Rs\Class_BddMySQL.php on line 31

Par contre je ne vois pas l'intéret d'utiliser des SPL. Je viens de regarder (rapidement) ce que c'est. Bref je le verrai surement en analysant vos sources.

Merci pour toutes ces techniques !
Cordialement
TheWeasel47

Commentaire de BAMOS14 le 19/02/2009 18:16:07

Salut je vous de votre super travail .Et d'ailleurs pourquoi ja voudrai que vous m'assister dans mon projet transversal java-uml.Comment pourrai-je communiquer avec vous

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Connexion à une base de données Paradox ! [ par orelien ] Bonjour !Voilà, j'aimerai me connecter à une base de données Paradox mais je n'y arrive pas !...Quelqu'un peut il m'aider ??Merci beaucoup.Orelien. connexion dune base de donées access avec un fichier .dat [ par jessicalba ] bonjour je rencontre actuellement un petit problème pour une connexion : j'aai un lecteur code barre qui génére un fichier .dat ce fichier doit etre connexion aun base de données [ par jessicalba ] bonjour jai posé cette question tout a lheure dans le thème base de données mais je nai pas eu de retour je rencontre un problème au niveau dune base Erreur de connexion a la base de donnée [ par glagaffe ] je viens de prendre la fonction de webmaster et je ne suis qu'un débutant en PHP alors je récupère des sources.J'utilise EasyPhp et quans j'utilise le Problème de création de table Mysql [ par perig ] BonjourVoilà je cherche à créer une table dans ma base Mysql (je suis chez free).Mon programme fonctionne (je consulte tous les codes d'erreur et tout probleme connexion plusieurs BDD [ par ehmarc ] SalutJe sais pas si c'est possible mais je voudrai essayer de me connecter sur plusieurs Base de donnée simultanément, sans pour autant perdre ma conn probleme de connexion à base mysql [ par loutwice ] salut!ben voilà le problème:j'ai fait des pages en php gérant les sesions et tout et tout....et quan je veux les réutiliser dans un autre site, et bie Problème de connexion [ par CHABRY ] Bonjour!J'ai installé un serveur apache, je l'ai lancé ainsi que ce lui de la base de données assuré par easyphp.J'ai pu faire pou PROBLEME CONNEXION BASE DE DONNEES ACCESS AVEC PHP [ par johnpelu ] bonjour , je souhaite (en fait je suis obligé c'est pour mon stage ;D )mettre une base de données access sur le site web de la société ou je suis et y base de donnée [ par MiTcH37 ] saluch,j'aimerai savoir si c'était possible de garder une connexion à une bdd ouverte dans une page appelée par un include, et de la reconnaitre dans


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), 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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,217 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales