Class abstraction mysql (orm)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 333 fois - Téléchargée 1 140 fois

Contenu du snippet

deleteddeleteddeleteddel
eteddeleteddeleteddeletedd
eleteddeleteddeleteddeleteddeleteddelete

ddeleteddeleteddeleteddele
teddeleteddeleteddeleteddeleted

Source / Exemple :


deleted

Conclusion :


deleted

A voir également

Ajouter un commentaire

Commentaires

neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
C'est quand même dommage de ne pas s'inquiéter de l'interopérabilité quand on utilise PDO...
Si tu utilises PDO, tu devrais t'en inquiéter tout de suite, sans forcément l'implémenter... Mais l'avoir en tête et en tenir compte dans ce qu'on fait, ça me parait important...
mytrip
Messages postés
5
Date d'inscription
samedi 9 août 2008
Statut
Membre
Dernière intervention
16 août 2008

salut :)
pour les procédures stockées ça pourrait faire l'affaire, mais j'aime bien faire des petit "datagrid", avec des trie par nom etc ...
donc dans ces là, je génère les requête automatiquement selon le besoin, ça deviens plus difficile de faire ça avec des procédures stockés... peut être qu'il y'a des solutions, mais je ne les connais pas.
cette class me permet d'avoir un bon contrôle sur ce qui est généré.

je préfère recodé une class si je change de db, plutot que de codé une class qui fait tout.
il suffirais de charger la bonne class selon le driver, mais l'interoperabilité c'est pas mon soucis pour le moment :)
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
15
Salut,

Si tu as souvent la même requête à quelques variables près (comme le nom de la table), pourquoi ne pas utiliser une procédure stockée ?

Concernant la clause particulière LIMIT, je m'étais posé la question à un moment. J'en avais parlé avec Malalam, qui m'avait dit qu'on pouvait tout à fait récupérer tous les enregistrements et utiliser un itérateur (un LimitIterator plus exactement) pour n'accéder qu'aux résultats souhaités.
Une alternative à LIMIT existe, utilisant des variables existe (je ne l'ai pas en tête) et doit se retrouver sur le net grâce à notre ami à tous.

Sinon, toujours dans un soucis de compatibilité de code, il me semble (mais je dis peut-être une bêtise, j'ai commencé seulement hier à me pencher dessus pour mes besoins personnels) que le DSN n'est pas formé de la même manière suivant les SGBDR... Par exemple, et d'après la doc de PHP, un DSN MySQL ressemble à ça :
mysql:host=localhost;port=3306;dbname=mydatabase
on passe alors user et password en argument du constructeur.
Pour PostgreSQL, le DSN ressemble à ça :
pgsql:host=localhost port=5432 dbname=mydatabase user=myself password=topsecret

Rien que pour séparer les "arguments" du DSN, MySQL utilise des points-virgules et pgSQL utilise des espaces.
Et je ne prends que ces deux exemples là... On peut aussi se connecter à MySQL via un socket Unix. On peut se connecter à une base de données Access (beurk, oui, je sais) en utilisant un nom catalogué, ou un DSN plus "classique".
Je manque de pratique de ce côté là pour pouvoir en parler plus en détails.

Je continue de penser que ta classe apporte une surcouche pas vraiment nécessaire, si ce n'est qu'elle peut éventuellement gérer des incompatibilités de code d'un SGBDR à l'autre, et permettre aux requêtes de fonctionner dans tous les cas. Mais ça représente un gros gros boulot... Et je trouve dommage d'avoir à développer une classe spécifique pour gérer chaque SGBDR, alors que PDO est supposé servir à ça... Il y a peut-être encore des progères à faire du côté de PDO...

Cela dit, tu sembles accorder à cette classe une véritable importance didactique, et ça, c'est très très bien.
mytrip
Messages postés
5
Date d'inscription
samedi 9 août 2008
Statut
Membre
Dernière intervention
16 août 2008

tout a fait d'accord pour les exeptions

pour le coté "sql compliant", je pense que je devrais utiliser une class interface et une class implement pour le type de db.
et, par exemple, recoder le comportement de la fonction limit selon le type de db si besoin dans la class implement.

ce qui m'a fait coder ça, c'est que j'ai souvent les mêmes codes avec des tables au nom différent.
déclarer des variable gobale ou des constante avec le nom des table ne me plaisais pas.
"SELECT ".MA_TABLE.".bla, ".MA_TABLE.".bli" ...
ça deviens vite galère

pour les transactions ça doit passer, puisque ce n'est qu'un extension de pdo.
je n'ai pas encore testé mais c'était dans mon intention de les utiliser :)

cette classe n'est qu'un ensemble de méthode pour contruire des requêtes (avec des lacune certes) et utilise les méthodes pdo pour le reste.
La plus grosse lacune de cette source a mes yeux, c'est de ne pas gérer les jointures (sauf en passant les requêtes directement biensur).
je n'ai pas trouver de solution pour le moment ... et je me demande bien comment je pourrais faire :/
j'en suis encore au stade expérimentale avec cette source, je l'utilise sur un petit projet test. j'aimerais bien la développer un peu plus sans en faire une énorme usine a gaz (c'est déjà pas mal tordu comme ça là).

en tout cas merci d'avoir pris le temps de regarder la source et de l'avoir commenté ;)
malalam
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
20
Mea culpa, j'ai très mal lu :-)
Donc oublie ces commentaires.
Par contre, maintenant que j'ai lu le contenu du zip (en partie), je suis comme Neige, je comprends quand même mal l'intérêt : simplement parce que je trouve ça bcp plus complexe à utiliser que directement utiliser pdo par exemple. Et surtout, ce que je reproche à tous les packages de e genre (donc pas que le tien :-) : les requêtes deviennent illisibles. Je préfère nettement voir directement un truc du genre
$sQuery = <<<sql
SELECT
t1.bla, t2.bli
FROM
table1 t1
INNER JOIN table2 t2 ON t2.t1_id = t1.t1_id
WHERE
t1.t1_where = :sWhere
sql;
avec un bindValue() qui va bien, plutôt que passer par des méthodes pour faire chaque condition de ma clause WHERE par exemple, et la table de ma clause FROM etc...
C'est quand même plus lisible comme ça.
Maintenant, tu me diras, on n'est pas obligé de pousser jusque là avec ta classe. Certes.

Pour surrenchérir à ce que dit Neige, en effet, fais attention au côté "sql compliant" : LIMIT n'est PAS une clause standard. Et quand elle existe pour un moteur DB, elle ne s'utilise pas forcément comme celle de mysql.
Gaffe aussi au driver PDO choisi par l'utilisateur, tu risques d'avoir des surprises...et dans ce sens, ça manque d'exceptions ton truc.

Au final, ça n'est qu'une surcouche de trucs basiques. Tant qu'à réécrire PDOn autant proposer des trucs inédits et plus complexes : gestion poussée des jeux de résultats multiples (poussée car PDO le fait déjà), des trucs sur les tables systèmes facilitant la récupération des types d'un champ ? Insertion/Update avec vérification du types des champs touchés, etc etc...
Manque aussi la gestion des transactions (c'est basique, mais là, ça manque...!), des procédures stockées (ça rejoint svt les jeux de résultats multiples), etc...

Sinon y a de l'idée pour le code :-) A quelques exceptions près (les exceptions notamment, donc, gestion d'erreur poussée).

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.