COUCHE D'ABSTRACTION DE LA BASE DE DONNÉES ET GESTION ORIENTÉ OBJET DES ACCÈS AU

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 15 déc. 2006 à 16:50
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 24 déc. 2006 à 17:05
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/40731-couche-d-abstraction-de-la-base-de-donnees-et-gestion-oriente-objet-des-acces-aux-tables

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
24 déc. 2006 à 17:05
Oh bah je suis content de garder ma propre classe maison ( que j'ai refaite, pas celle qui est ici ^^).

C'est une vrai usine à gaz ton bordel... je comprend que c'est du PHP4 m'enfin quand même :)

Faudra m'expliquer l'intérêt du criteria par contre... Parce que si je décortique le code, ca veut dire que je fou dans un objet ma requète SQL (enfin juste des morceaux apparament), donc un premier parsing; puis ensuite, je redécortique mon objet d'un bout à l'autre pour reconstituer la requète (donc 2ème parsing).
Ca fait pas un peu beaucoup ?

Et puis quel intérêt de faire ca :S Personne ne sait écrire une requète SQL en dur ? :s

Et puis, faudra aussi me démontrer l'intérer de faire une factory si c'est pour ne gérer qu'une seule DB à la fois ! Parce que... ta factory, à part juste servir de Singleton pour ta classe SQL, elle ne sert à rien du tout. Je peux arriver au meme résultat dans une classe unique.

Si tu veux faire de la gestion d'erreur sur tes fonctions mysql_*, met un @.

Bref, y'a un problème d'usine à gaz dans ta factory pour commencer :)
vanadium1 Messages postés 5 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 18:02
Effectivement, certains fichiers du packages sont issus de xoops (c'est d'ailleurs indiqué dans les sources ;)). Le modele objet a tout de meme été modifié pour supporter le gestionnaire de base de données maison : le modele de xoops ne gerait pas les clef des tables, et toutes les methodes (insert,update,delete...) sont désormais génériques, ce qui n'est pas totalement le cas dans Xoops. (sauf dans xoops 2.2 en derivant de xoopspersistablehandler)

Difficile d'innover pour une abstraction de base de données ! Et le bousin est assez léger tout de meme ;)
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
18 déc. 2006 à 11:05
Ah la class d'abstraction SGDB de Xoops... bien quelle présente quelques lourdeur c'est ma préférée elle est assez simple à prendre en main mais là ou ça se complique c'est lorsque l'on veux l'utiliser avec la class critéria qui est plus complexe à apréhender... par contre je pense que plutot que te passer par un tableau (déclaré en global je suppose) tu aurais du garder les constantes qui sont bien plus efficace à mon sens (déclarés dans le fichier conf et basta)... .. .

Sinon l'idée est bonne je regrette juste le "manque d'innovation" si je puis dire ça ainsi vu qu'une très grosse partie du package vient de xoops et n'a, à première vue, quasiement pas été modifié... ce qui est domage car certaines parties de ces classes (je pense notament au modèle object de xoops) demande à être retravaillé pour alléger le bousin... cependant ça reste un bon package... .. .

@ tchaOo°
vanadium1 Messages postés 5 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 18 décembre 2006
16 déc. 2006 à 14:37
La variable de configuration $CONFIG est dans le fichier conf/config.php. Elle définit le type de base de données ainsi que les informations de connexion à celle-ci.
vanadium1 Messages postés 5 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 18 décembre 2006
16 déc. 2006 à 14:35
La seule documentation qu'il y ait pour le moment, c'est les commentaires apportés au code (toutes les fonctions ont une entête aux standards Java) ainsi qu'un fichier exemple reprenant de façon très résumée les possibilités offertes.
Pour ce qui est du passage des informations de la base ça se déroule ainsi :
// instanciation d'un manager d'objets par inversion de controle
$link_m =& get_manager('link');
la fonction get_manager va inclure la classe définissant l'objet link et le manager d'objet link toute seule (suivant des conventions de nommage du fichier classe et des classes dans ce fichier).
dans class.object.php, tu remarqueras que dans le constructeur du manager d'objet nous avons :
$this->con =& DatabaseFactory::getConnection();
Ce code appelle la Factory qui s'occupe de l'instanciation d'une connexion à la base de données. On crée ainsi un découplage entre le type de base de données que l'on veut (SQL, PostGre...) et on laisse l'usine à connexion choisir pour nous le type de connexion approprié en fonction de $CONFIG['database'].
Database::getInstance() fait la meme chose que DatabaseFactory::getConnection();. Ce code est juste Deprecated, je l'utilisais dans un script et je l'ais conservé pour la compatibilité.
La Factory inclut le bon driver de connexion à la base et retourne une instance de celui-ci par inversion de controle suivant $CONFIG['database'] et en lui passant les paramètres de connexion à la base de données.
Le driver de base de données dérive de la classe MyDatabase qui est une interface indiquant les méthodes devant être implémentées dans les sous-classes (dans les drivers).
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
16 déc. 2006 à 12:05
euh j'ai quand même rapidement regardé et deux choses : +1 pour la doc.

Et sinon je vois pas quand est-ce que tu passe les informations de connexion à la base? C'est géré en interne sur la classe?
Si oui, c'est dommage pour ma part j'aurais préféré les passé via une méthode ou via le constructeur : cela permet d'utiliser un système de stockage de paramètre indépendant du système de gestion de bdd.
cs_wizad Messages postés 355 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 14 avril 2009
16 déc. 2006 à 11:57
Zut Malalam à été plus rapide que moi... :)

Donc en php5 ce serait (déja dit mais je le redit quand même... gniark).

Sinon ça à l'air d'être du costaud et d'être vachement intérréssant. Cependant une chose ma surpise : le nombre de fichier. mais bon ce n'est pas une critique dans le sens ou il est vrai que le système d'accés à un SGBD est généralement le plus lourd dans un site donc autant faire quelque chose de bien.

Sinon je regarderais le code et testerai plus tard (suis pas sur mon pc).
vanadium1 Messages postés 5 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 18 décembre 2006
15 déc. 2006 à 23:54
je vais tacher de mettre des exemples d'utilisation.
Pour mydatabase::quotestring() et escape() c'est vrai qu'il y a redondance, je ne l'avais pas vu. Le logger est flexible, là il est très simple. Je peux eventuellement proposer ou non de l'activer.
Merci pour tes conseils. :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
15 déc. 2006 à 22:43
Re,

c'est gentil ça ;-)
Bon, j'ai maté un peu plus...mais pas encore testé, ni téléchargé à dire vrai donc je vais te faire quelques commentaires de plus, mais loin d'être exhaustif.
Je maintiens que ce serait vraiment chouette en PHP5 ;-) Avec des classes abstraites, de vraies constantes de classes, des ùéthodes abstraites (paskeu les méthodes qui retournent false parce qu'elles sont destinées à être surchargées...ça fait pauvre ;-) ). Et des exceptions! Et un bel itérateur pour ta classe recordset...!
- 1er conseil : ajoute une doc! Et un ou plusieurs exemples d'utilisation. Parce que bon...déjà pour un bon codeur, faut un temps d'adaptation à mon avis pour utiliser ta classe...mais pour un moins bon codeur, même pas la peine d'y penser!
- ensuite : tu devrais laisser le choix, pour le log des requêtes. C'est bien d'avoir un logger. C'est mieux d'avoir le choix quant à son utilisation. Parce que moi je veux bien logger des update ou des insert, des truncate, des create table etc...mais des select, bof...je m'en fous un peu.
- mydatabase::quoteString () : attention... : c'est valable pour pas mal de base de données, dont mysql, et pas mal d'autres...mais pas pour certaines : au hasard, mssql. Ce qui fait que cette méthode ne devrait pas être définie ici. D'ailleurs, t'as un mysql::escape(), donc si ça se trouve un truc m'échappe là...mais bref, si tu fous un addslash sur une chaîne destinée à être insérée dans une base mssql, ben...ça va pas beaucoup t'aider pour les apostrophes.
- dans mysql, ou du moins la classe fille directement liée à la bdd utilisée, j'aurais vien vu des vérifications plus poussées sur les ressources. Via gettype (), et get_resource_type (), tu devrais bien t'en sortir en faisant bien gaffe...mssql_* encore, en php 5.0x, renvoie des entiers et non des ressources. Alors qu'avec php5.1+, t'as tes ressources).

Bon enfin...j'arrête là pour ce soir. C'est quand même très joli.
vanadium1 Messages postés 5 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 18 décembre 2006
15 déc. 2006 à 20:03
Merci pour ton commentaire :)
C'est vrai qu'en php5, ça aurait été encore mieux mais j'ai encore du chemin avant d'atteindre ton niveau je pense. ;-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
15 déc. 2006 à 16:50
Hello,

j'ai pas tout maté, mais c'est un joli package, de ce que j'en avais vu.
C'eut été plus joli en PHP5, mais bon...faut bien du PHP4 :-)
Pas grand chose à en dire là, je n'ai pas assez approfondi.