Azorkast
Messages postés1Date d'inscriptionvendredi 28 janvier 2011StatutMembreDernière intervention29 janvier 2011 29 janv. 2011 à 11:34
Merci bcp pour ce code !
franco_se
Messages postés151Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention30 juillet 20182 14 sept. 2008 à 16:45
Hello
Dans le cadre d'un projet, j'utilise ton script. Mais j'ai un probleme assez enervant: j'utilise des tableaux pour la config et non du xml ( en fait un fichier YAML convertit en array ).
J'ai structuré mon tableau pour coller au xml d'exemple :
Array
(
[USER] => Array
(
[ID] => Array
(
[BDD_NAME] => id
[TYPE] => int
)
Mais je m'arrive pas a modifier le script pour utiliser un tableau et non un xml .....
Pourrais-tu m'aider ?
Merci
soundpanther
Messages postés68Date d'inscriptionvendredi 27 juillet 2007StatutMembreDernière intervention31 janvier 2009 4 mai 2008 à 17:12
j'aime bien
slyfog
Messages postés4Date d'inscriptionjeudi 8 septembre 2005StatutMembreDernière intervention21 juillet 2007 21 juil. 2007 à 19:13
Hum... si on pousse un peu plus loin, même avec cette modif on peux pas mettre de chaine vide dans la bdd, si on a un tel besoin il faut alors carrément virer le if ^^
slyfog
Messages postés4Date d'inscriptionjeudi 8 septembre 2005StatutMembreDernière intervention21 juillet 2007 21 juil. 2007 à 18:57
Salut, bravo pour cette class et merci malalam de nous faire découvrir la puissance des itérateurs.
J'ai trouvé un petit défaut, lors de la creation/modification d'un utilisateur le script teste si la chaine qu'on lui fournie n'est pas vide avec un !empty(), et comme le 0 est considéré comme vide, ça ne les prend pas en compte, ce qui peut etre assez gênant dans certains cas...
Si d'autres ont rencontré le même problème voici la modif pour que ça fonctionne, ligne 456 et 513 remplacer :
if (!empty ($aValues[$sKeyName]))
par :
if ($aValues[$sKeyName] != '')
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 23 mai 2007 à 19:40
Parce que je n'y ai pas du tout pensé...
franco_se
Messages postés151Date d'inscriptionsamedi 1 novembre 2003StatutMembreDernière intervention30 juillet 20182 2 mai 2007 à 19:13
comme d'ab malalam nous pond ici un pur bonheur ! :D
mais j'avais une question, somme toute conne mais ....... pourquoi , parti comme tu étais ds cette classe, tu n'as pas aussi geré la deconnection ("propre" ) du membre ? ......
( j'avais prevenu, elle est conne )
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 28 nov. 2006 à 08:23
De toute façon, si ce package est utilisable tel quel sans problème, comme je l'ai dit, j'en utilise une version plus complexe et complète. Il mérite qu'on l'adapte, le cas échéant. Mais ce n'est pas nécessaire.
Pour te donner une idée, dans ma version, entre autre, j'ai largement complexifié le getter de la classe abstraite pour pouvoir accéder plus facilement à tout.
De plus, un exemple d'amélioration rapide et pratique, qui ne nécessite pas d'ajout de code du tout : je travaille avec une classe de traitement de formulaire, à qui on passe notamment un masque. Par exemple, basiquement, pour traiter un email, je lui balancerais le masque "EMAIL" (y a d'autres options, mais on s'en fout là). Du coup, j'ai stocké les masques relatifs à chaque propriété de mon utilisateur : EMAIL pour l'email, TEXT pour le nom et le prénom, CODE_POSTAL pour le code postal etc...
C'est ainsi très facile à récupérer, cela fait partie de la configuration du site, et je n'ai pas à ajouter de code, juste à ajouter une description à mon fichier XML.
bj33
Messages postés145Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 1 mai 2012 27 nov. 2006 à 18:59
<< malalam
>> tu as une erreur parce que tu es en short_open_tags à On.
non, non, ils sont bien à off.configuration php 5 recommandée strictement appliquée.pour php 4, c'est plus laxiste mais je ne teste que mes scripts avec php 4.
>> tu as cette erreur parce que tu as utilisé ZEND Studio
éffectivement, çà ne change rien à la source générée.c'est juste génant avec la plupart des ide qui renvoi une erreur qui n'en ai pas une.j'ai aussi testé avec maguma, même combat.mais c'est juste un détail, c'est un bug connu de zend mais aussi d'autres.
>> J'espère que c'est plus clair.
je commence à voir la lumière ;) ma culture "scriptique" n'est pas aussi vaste que la tienne mais en travaillant dessus je devrais pouvoir en tirer des enseignements et peut être
l'utiliser pour ma future zone membre.ton concept n'est pas simple, je vais donc travailler les scripts.
merci beaucoup d'avoir pris le temps d'écrire toutes ces lignes d'explications.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 27 nov. 2006 à 14:26
Au passage, le code inutilisé, ce sont les unset () et return false après les throw new Exception () dans les deux méthodes citées. Suffit de les virer.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 27 nov. 2006 à 14:23
Hello Bj,
merci, déjà :-)
L'en-tête XML du XHTML : tu as une erreur parce que tu es en short_open_tags à On. Il faut qu'il soit à Off.
ceci dit, chez un -mauvais- hébergeur, quand on ne peut pas modifier le php.ini, effectivement, il faut faire un echo :-)
Je travaille avec mes propres serveurs, donc je n'ai pas ce problème, ils sont bien configurés ;-)
Mais je sais que tu as cette erreur parce que tu as utilisé ZEND Studio, et son analyseur de code...et je n'ai jamais réussi à le mettre en short_open_tags à Off, celui-là. Mais c'est une mauvaise configuration du moteur interpréteur PHP de Zend, sur ce coup.
Pour la classe DB, c'est fort possible : j'ai récupéré un vieux bout de classe qui trainait, sans chercher à comprendre : le but n'est pas de montrer une classe DB, et la plupart des utilisateurs utiliseront la leur. Ce n'est pas la classe que j'utilise, parce que la mienne est faire pour mssql, à dire vrai. Bref, elle est juste là pour l'exemple. Il faut instancier la sienne.
Le fichier XML...bon...
Il décrit les champs que l'on utilise.
Il faut comprendre que ce package est un package que j'utilise dans mon taf. Mais il est simplifiée (bah oui...ma version est plus poussée vu que je la "vends", lol). Je suis parti du constat que dans certains types de sites que je devais développer, la gestion utilisateur était sensiblement toujours la même.
Sauf que les champs différaient un peu.
Dans un site, je vais avoir besoin uniquement d'un email, dans d'autres, des coordonnées postales, d'autres encore, de quelques champs supplémentaires.
Par contre, chaque fois, j'ai une table utilisateurs, et le besoin de pouvoir identifier un utilisateur, en créer un, vérifier qu'il n'y ait pas de doublon, ou encore, en modifier un.
Et évidemment, de récupérer les données utilisateur.
Du coup, j'au créé ce module.
Les itérateurs me permettent surtout de parcourir mon utilisateur, et de récupérer ce que je veux facilement : soit tout, soit uniquement les valeurs, soit uniquement les noms des champs, juste l'email, etc...
J'ai ajouté les méthodes pourt faire du get, du set, de l'update, etc.
Et j'avais besoin d'une classe DB, et que ma classe user soit capable d'attaquer la table utilisateurs, quels que soient le nom des champs, ou leur nombre. Ou leurs spécifités.
Et enfin, d'une classe SESSION, avec la même problématique : on a pas toujorus besoin des mêmes variables de session.
En décortiquant ça, j'en suis arrivé à cette classe, et à ce fameux fichier de configuration XML.
Il décrit la structure de l'utilisateur, que ce soit pour ses propriétés, ou celles de la session.
Dans les deux cas, j'ai un champ obligatoire: ID. Forcément.
Et pour les champs propriétés de l'utilisateur, 2 descriptions obligatoires :
BDD_NAME qui est le nom dans la table utilisateur, du champ en question.
ex:
La seconde, c'est le type. Dans ce package simplifié, j'en utilise 2 seulement : string et int (c'est surtout pour faire des INSERT ou des UPDATE...pour savoir si oui ou non, j'ai besoin de quotes.
Ensuite, j'ai défini des descriptions dont je peux avoir besoin :
IDENT indique que la propriété est utilisée pour l'identification.
Dans mon exemple, ce sont les propriétés EMAIL et PASSWORD.
Bref, pour identifier un mec, je dois faire le match sur ces 2 champs.
Et enfin, MANDATORY indique qu'une propriété est obligatoire pour la création d'un utilisateur (à priori, les champs décrits comme IDEBT sont aussi MANDATORY).
En clair, ce fichier XML est le descriptif de mon utilisateur, pour un site donné.
Si on a ça comme table utilisateur :
user_id, user_nom, user_prenom, user_cp, user_ville, user_email, user_pwd, et que dans ma session on a besoin de son ID, de son Email, et de son nom + prénom, que le compte
est identifié via email et pwd, et que tous les champs sont nécessaires, on aura un truc du genre :
<root>
bj33
Messages postés145Date d'inscriptionvendredi 13 juin 2003StatutMembreDernière intervention 1 mai 2012 27 nov. 2006 à 13:35
salut malalam
heu...superbe!
je ne comprend pas tout mais je vais décortiquer, c'est sur.
une petite suggestion, dans exemple.php, le prologue xml est écrit en html directement, ce qui créer une erreur.
echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//
comme çà y en à plus
j'ai aussi çà :
Code inaccessible dans la fonction query() (ligne 44)
Code inaccessible dans la fonction connect() (ligne 22)
dans le fichier mysql.cls.php
je ne comprend pas trop comment fonctionne le fichier xml.
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 24 nov. 2006 à 15:27
Bah le but est double :
- essayer de comprendre parfaitement cette *** de SPL...parce que je sens bien que c'est très puissant...mais ça reste très complexe à utiliser quand même, là. Et je sais déjà ce que je veux en faire en plus, un gros, gros projet...
- montrer aux autres ce qu'on peut faire avec (en suivant mon évolution dessus évidemment), parce que les tuto présents sur le web sont pour le moment très basiques.
Et merci ;-)
Naixn
Messages postés455Date d'inscriptionmardi 17 septembre 2002StatutMembreDernière intervention22 juillet 2007 24 nov. 2006 à 15:18
Ok, c'est bien ce que je pensais :)
Bon boulot quoiqu'il en soit. C'est marrant que tu t'amuses à appliquer les itérateurs un peu partout en tout cas :)
Bonne continuation ;)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 24 nov. 2006 à 14:48
Hello,
à dire vrai, j'ai pris une classe incomplète pour la DB, vu que ce n'était pas du tout le sujet de ce package. J'ai juste réécrit rapidement ce qui me manquait. Je mise plutôr sur le fait que les gens vont utiliser leur propre classe de DB.
Mais pour te répondre : j'ai 2 classes : une pour mysql, et une pour mssql en réalité. Là, je n'ai mis que mysql.
Le constructeur de la classe parente est automatiquement utilisé, vu que les filles n'en ont pas.
Le singleton est optionnel, simplement, je le règle si je veux un singleton. En général, je n'en veux pas, car j'utilise souvent plusieurs serveurs de bdd (à mon taf en tous cas).
Mais il est là, juste au cas où...j'aurais pu l'utiliser ici en effet. Mais bon...je t'ai dit, la classe est juste là comme support au package, parce qu'il me fallait bien une classe DB.
Ce n'est même pas la classe DB que j'utilise généralement, mais la mienne est exclusivement mssql.
Naixn
Messages postés455Date d'inscriptionmardi 17 septembre 2002StatutMembreDernière intervention22 juillet 2007 24 nov. 2006 à 14:14
Hé bé, c'est un truc bien complet.
J'ai pas testé, parceque 1/ je sais que ça marche 2/ Flemme de créer une table MySQL, mais sinon ça m'a l'air bien complet.
Juste deux remarques, notemment au niveau de dbfactory :
1/ Même pas utilisé les réflexions, tssss :p
2/ Je ne vois pas du tout à quoi te sert ton __construct ? Vu qu'il est protégé, et que tu utilise le singleton, il ne peut donc être qu'appelé par des classes filles, mais... Tu ne te serts ni de la fonction dbfactory::singleton(), ni de parent::__construct dans la classe qui étend dbfactory.
D'ailleurs, je remarque aussi qu'en fait tu n'utilises même pas la méthode singleton : ta fonction dbfactory::factory() te retourne à chaque fois une nouvelle instance de la classe, même si une instance a déjà été créée.
Après, si c'est volontaire, à savoir que tu utilises une classe générique pour différentes utilisations, alors là je comprends mieux. Mais il est vrai que je ne suis pas habitué à voir du code non utilisé dans des trucs d'exemples XD.
29 janv. 2011 à 11:34
14 sept. 2008 à 16:45
Dans le cadre d'un projet, j'utilise ton script. Mais j'ai un probleme assez enervant: j'utilise des tableaux pour la config et non du xml ( en fait un fichier YAML convertit en array ).
J'ai structuré mon tableau pour coller au xml d'exemple :
Array
(
[USER] => Array
(
[ID] => Array
(
[BDD_NAME] => id
[TYPE] => int
)
[EMAIL] => Array
(
[BDD_NAME] => email
[TYPE] => string
[MANDATORY] =>
[IDENT] =>
[DEDOUBLE] =>
)
[PASSWORD] => Array
(
[BDD_NAME] => password
[TYPE] => string
[MANDATORY] =>
[IDENT] =>
)
[NOM] => Array
(
[BDD_NAME] => login
[TYPE] => string
)
)
[SESSION] => Array
(
[0] => ID
[1] => EMAIL
)
Mais je m'arrive pas a modifier le script pour utiliser un tableau et non un xml .....
Pourrais-tu m'aider ?
Merci
4 mai 2008 à 17:12
21 juil. 2007 à 19:13
21 juil. 2007 à 18:57
J'ai trouvé un petit défaut, lors de la creation/modification d'un utilisateur le script teste si la chaine qu'on lui fournie n'est pas vide avec un !empty(), et comme le 0 est considéré comme vide, ça ne les prend pas en compte, ce qui peut etre assez gênant dans certains cas...
Si d'autres ont rencontré le même problème voici la modif pour que ça fonctionne, ligne 456 et 513 remplacer :
if (!empty ($aValues[$sKeyName]))
par :
if ($aValues[$sKeyName] != '')
23 mai 2007 à 19:40
2 mai 2007 à 19:13
mais j'avais une question, somme toute conne mais ....... pourquoi , parti comme tu étais ds cette classe, tu n'as pas aussi geré la deconnection ("propre" ) du membre ? ......
( j'avais prevenu, elle est conne )
28 nov. 2006 à 08:23
Pour te donner une idée, dans ma version, entre autre, j'ai largement complexifié le getter de la classe abstraite pour pouvoir accéder plus facilement à tout.
De plus, un exemple d'amélioration rapide et pratique, qui ne nécessite pas d'ajout de code du tout : je travaille avec une classe de traitement de formulaire, à qui on passe notamment un masque. Par exemple, basiquement, pour traiter un email, je lui balancerais le masque "EMAIL" (y a d'autres options, mais on s'en fout là). Du coup, j'ai stocké les masques relatifs à chaque propriété de mon utilisateur : EMAIL pour l'email, TEXT pour le nom et le prénom, CODE_POSTAL pour le code postal etc...
C'est ainsi très facile à récupérer, cela fait partie de la configuration du site, et je n'ai pas à ajouter de code, juste à ajouter une description à mon fichier XML.
27 nov. 2006 à 18:59
>> tu as une erreur parce que tu es en short_open_tags à On.
non, non, ils sont bien à off.configuration php 5 recommandée strictement appliquée.pour php 4, c'est plus laxiste mais je ne teste que mes scripts avec php 4.
>> tu as cette erreur parce que tu as utilisé ZEND Studio
éffectivement, çà ne change rien à la source générée.c'est juste génant avec la plupart des ide qui renvoi une erreur qui n'en ai pas une.j'ai aussi testé avec maguma, même combat.mais c'est juste un détail, c'est un bug connu de zend mais aussi d'autres.
>> J'espère que c'est plus clair.
je commence à voir la lumière ;) ma culture "scriptique" n'est pas aussi vaste que la tienne mais en travaillant dessus je devrais pouvoir en tirer des enseignements et peut être
l'utiliser pour ma future zone membre.ton concept n'est pas simple, je vais donc travailler les scripts.
merci beaucoup d'avoir pris le temps d'écrire toutes ces lignes d'explications.
27 nov. 2006 à 14:26
27 nov. 2006 à 14:23
merci, déjà :-)
L'en-tête XML du XHTML : tu as une erreur parce que tu es en short_open_tags à On. Il faut qu'il soit à Off.
ceci dit, chez un -mauvais- hébergeur, quand on ne peut pas modifier le php.ini, effectivement, il faut faire un echo :-)
Je travaille avec mes propres serveurs, donc je n'ai pas ce problème, ils sont bien configurés ;-)
Mais je sais que tu as cette erreur parce que tu as utilisé ZEND Studio, et son analyseur de code...et je n'ai jamais réussi à le mettre en short_open_tags à Off, celui-là. Mais c'est une mauvaise configuration du moteur interpréteur PHP de Zend, sur ce coup.
Pour la classe DB, c'est fort possible : j'ai récupéré un vieux bout de classe qui trainait, sans chercher à comprendre : le but n'est pas de montrer une classe DB, et la plupart des utilisateurs utiliseront la leur. Ce n'est pas la classe que j'utilise, parce que la mienne est faire pour mssql, à dire vrai. Bref, elle est juste là pour l'exemple. Il faut instancier la sienne.
Le fichier XML...bon...
Il décrit les champs que l'on utilise.
Il faut comprendre que ce package est un package que j'utilise dans mon taf. Mais il est simplifiée (bah oui...ma version est plus poussée vu que je la "vends", lol). Je suis parti du constat que dans certains types de sites que je devais développer, la gestion utilisateur était sensiblement toujours la même.
Sauf que les champs différaient un peu.
Dans un site, je vais avoir besoin uniquement d'un email, dans d'autres, des coordonnées postales, d'autres encore, de quelques champs supplémentaires.
Par contre, chaque fois, j'ai une table utilisateurs, et le besoin de pouvoir identifier un utilisateur, en créer un, vérifier qu'il n'y ait pas de doublon, ou encore, en modifier un.
Et évidemment, de récupérer les données utilisateur.
Du coup, j'au créé ce module.
Les itérateurs me permettent surtout de parcourir mon utilisateur, et de récupérer ce que je veux facilement : soit tout, soit uniquement les valeurs, soit uniquement les noms des champs, juste l'email, etc...
J'ai ajouté les méthodes pourt faire du get, du set, de l'update, etc.
Et j'avais besoin d'une classe DB, et que ma classe user soit capable d'attaquer la table utilisateurs, quels que soient le nom des champs, ou leur nombre. Ou leurs spécifités.
Et enfin, d'une classe SESSION, avec la même problématique : on a pas toujorus besoin des mêmes variables de session.
En décortiquant ça, j'en suis arrivé à cette classe, et à ce fameux fichier de configuration XML.
Il décrit la structure de l'utilisateur, que ce soit pour ses propriétés, ou celles de la session.
Dans les deux cas, j'ai un champ obligatoire: ID. Forcément.
Et pour les champs propriétés de l'utilisateur, 2 descriptions obligatoires :
BDD_NAME qui est le nom dans la table utilisateur, du champ en question.
ex:
La seconde, c'est le type. Dans ce package simplifié, j'en utilise 2 seulement : string et int (c'est surtout pour faire des INSERT ou des UPDATE...pour savoir si oui ou non, j'ai besoin de quotes.
Ensuite, j'ai défini des descriptions dont je peux avoir besoin :
IDENT indique que la propriété est utilisée pour l'identification.
Dans mon exemple, ce sont les propriétés EMAIL et PASSWORD.
Bref, pour identifier un mec, je dois faire le match sur ces 2 champs.
Et enfin, MANDATORY indique qu'une propriété est obligatoire pour la création d'un utilisateur (à priori, les champs décrits comme IDEBT sont aussi MANDATORY).
En clair, ce fichier XML est le descriptif de mon utilisateur, pour un site donné.
Si on a ça comme table utilisateur :
user_id, user_nom, user_prenom, user_cp, user_ville, user_email, user_pwd, et que dans ma session on a besoin de son ID, de son Email, et de son nom + prénom, que le compte
est identifié via email et pwd, et que tous les champs sont nécessaires, on aura un truc du genre :
<root>
<TYPE value="int" />
<NOM>
<TYPE value="string" />
<MANDATORY />
</NOM>
<TYPE value="string" />
<MANDATORY />
<CODE_POSTAL>
<TYPE value="string" />
<MANDATORY />
</CODE_POSTAL>
<VILLE>
<TYPE value="string" />
<MANDATORY />
</VILLE>
<TYPE value="string" />
<MANDATORY />
<TYPE value="string" />
<MANDATORY />
<SESSION>
<NOM />
</SESSION>
</root>
J'espère que c'est plus clair.
27 nov. 2006 à 13:35
heu...superbe!
je ne comprend pas tout mais je vais décortiquer, c'est sur.
une petite suggestion, dans exemple.php, le prologue xml est écrit en html directement, ce qui créer une erreur.
echo '<?xml version="1.0" encoding="iso-8859-1"?>'."\n";
?>
<!DOCTYPE html PUBLIC "-//W3C//
comme çà y en à plus
j'ai aussi çà :
Code inaccessible dans la fonction query() (ligne 44)
Code inaccessible dans la fonction connect() (ligne 22)
dans le fichier mysql.cls.php
je ne comprend pas trop comment fonctionne le fichier xml.
24 nov. 2006 à 15:27
- essayer de comprendre parfaitement cette *** de SPL...parce que je sens bien que c'est très puissant...mais ça reste très complexe à utiliser quand même, là. Et je sais déjà ce que je veux en faire en plus, un gros, gros projet...
- montrer aux autres ce qu'on peut faire avec (en suivant mon évolution dessus évidemment), parce que les tuto présents sur le web sont pour le moment très basiques.
Et merci ;-)
24 nov. 2006 à 15:18
Bon boulot quoiqu'il en soit. C'est marrant que tu t'amuses à appliquer les itérateurs un peu partout en tout cas :)
Bonne continuation ;)
24 nov. 2006 à 14:48
à dire vrai, j'ai pris une classe incomplète pour la DB, vu que ce n'était pas du tout le sujet de ce package. J'ai juste réécrit rapidement ce qui me manquait. Je mise plutôr sur le fait que les gens vont utiliser leur propre classe de DB.
Mais pour te répondre : j'ai 2 classes : une pour mysql, et une pour mssql en réalité. Là, je n'ai mis que mysql.
Le constructeur de la classe parente est automatiquement utilisé, vu que les filles n'en ont pas.
Le singleton est optionnel, simplement, je le règle si je veux un singleton. En général, je n'en veux pas, car j'utilise souvent plusieurs serveurs de bdd (à mon taf en tous cas).
Mais il est là, juste au cas où...j'aurais pu l'utiliser ici en effet. Mais bon...je t'ai dit, la classe est juste là comme support au package, parce qu'il me fallait bien une classe DB.
Ce n'est même pas la classe DB que j'utilise généralement, mais la mienne est exclusivement mssql.
24 nov. 2006 à 14:14
J'ai pas testé, parceque 1/ je sais que ça marche 2/ Flemme de créer une table MySQL, mais sinon ça m'a l'air bien complet.
Juste deux remarques, notemment au niveau de dbfactory :
1/ Même pas utilisé les réflexions, tssss :p
2/ Je ne vois pas du tout à quoi te sert ton __construct ? Vu qu'il est protégé, et que tu utilise le singleton, il ne peut donc être qu'appelé par des classes filles, mais... Tu ne te serts ni de la fonction dbfactory::singleton(), ni de parent::__construct dans la classe qui étend dbfactory.
D'ailleurs, je remarque aussi qu'en fait tu n'utilises même pas la méthode singleton : ta fonction dbfactory::factory() te retourne à chaque fois une nouvelle instance de la classe, même si une instance a déjà été créée.
Après, si c'est volontaire, à savoir que tu utilises une classe générique pour différentes utilisations, alors là je comprends mieux. Mais il est vrai que je ne suis pas habitué à voir du code non utilisé dans des trucs d'exemples XD.