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

cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009 - 10 févr. 2009 à 17:00
BAMOS14 Messages postés 1 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 19 février 2009 - 19 févr. 2009 à 18:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49236-poo-classe-d-acces-bdd-multi-sgbd

BAMOS14 Messages postés 1 Date d'inscription lundi 17 mars 2008 Statut Membre Dernière intervention 19 février 2009
19 févr. 2009 à 18:16
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
TheWeasel47 Messages postés 39 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 25 août 2009
12 févr. 2009 à 14:44
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
codefalse Messages postés 1123 Date d'inscription mardi 8 janvier 2002 Statut Modérateur Dernière intervention 21 avril 2009 1
12 févr. 2009 à 09:35
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 :)
TheWeasel47 Messages postés 39 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 25 août 2009
11 févr. 2009 à 14:26
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
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
10 févr. 2009 à 23:47
@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.
cs_Delphiprog Messages postés 4297 Date d'inscription samedi 19 janvier 2002 Statut Membre Dernière intervention 9 janvier 2013 33
10 févr. 2009 à 21:33
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.
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
10 févr. 2009 à 17:31
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.
NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
10 févr. 2009 à 17:26
;-)
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
10 févr. 2009 à 17:25
Grilled by NewSky ^^
webdeb Messages postés 488 Date d'inscription samedi 5 avril 2003 Statut Membre Dernière intervention 31 mars 2009 4
10 févr. 2009 à 17:24
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 ;)

++
NewSky Messages postés 86 Date d'inscription dimanche 27 janvier 2002 Statut Membre Dernière intervention 20 février 2009
10 févr. 2009 à 17:18
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...
TheWeasel47 Messages postés 39 Date d'inscription mercredi 19 mars 2008 Statut Membre Dernière intervention 25 août 2009
10 févr. 2009 à 17:09
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
cs_garfield90 Messages postés 388 Date d'inscription lundi 7 juillet 2003 Statut Webmaster Dernière intervention 10 février 2009
10 févr. 2009 à 17:00
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
Rejoignez-nous