[PHP5] CLASSE BASE DE DONNÉES

FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 - 2 déc. 2005 à 17:39
cs_slimane3 Messages postés 1 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 29 octobre 2007 - 29 oct. 2007 à 19:09
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/34880-php5-classe-base-de-donnees

cs_slimane3 Messages postés 1 Date d'inscription lundi 7 février 2005 Statut Membre Dernière intervention 29 octobre 2007
29 oct. 2007 à 19:09
Salut,

Je trouve ta classe vraiment pas mal du tout. Par contre ya un point sur lequel je bloque:
C'est au niveau de ta classe abstraite dbfactory. Tu as une méthode factory, et une autre singleton.
A quel moment la méthode singleton est-elle appelée? Est ce automatique?
Sinon pourquoi ne pas combiner les deux en une seule fonction (faire ce que fait factory() dans singleton()
et ensuite
instancier un objet en faisant dbfactory::singleton(...)

Pourrais tu s'il te plait m'éclairer sur ce point, ça me trouble un peu,
j'ai l'impression qu'y a un truc qui m'échappe...

Je te remercie d'avance.

A+
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 nov. 2006 à 18:03
Je comprends, mais selon moi, il est normal d'avoir une erreur fatale si la classe que l'on tente d'instancier n'existe pas.
Ceci dit, tu as raison pour l'exception levée dans ce cas.
Voilà la modif qui permet d'éviter le fatal error, et d'attraper l'exception :

function __autoload($class_name) {
if (file_exists ($_SERVER['DOCUMENT_ROOT'].'/cls/dbfactory/classes/'.$class_name . '.cls.php')) {
require_once ($_SERVER['DOCUMENT_ROOT'].'/cls/dbfactory/classes/'.$class_name . '.cls.php');
}
}

PS : j'ai mis MES chemins, hein... ;-)
Zzarbi974 Messages postés 8 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 21 novembre 2006
21 nov. 2006 à 17:37
Le try catch n'y change rien...
En fait autoload fait des require_once().

Donc si je suis l'aglo de ton singleton, si je fait : $db = dbfactory::factory ('bidulesql', 'localhost', 'root', '', 'test');
Arriver à la ligne 32, class_exist() tente de vérifier que la classe bidulesql n'existe pas.
Mais apparament PHP interprètre ça comme une instanciation à la classe bidulesql (comme $r = new bidulesql();), et donc avec la fonction autoload, il essaye de faire un require_once({...}bidulesql.cls.php'); et comme ce fichier n'existe pas on a affaire à une erreur.
Je te laisse tester tu comprendra :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
21 nov. 2006 à 16:18
Hello,

tente un try {} catch () {} dans l'autoload, en attendant que je comprenne ce que tu expliques et que je teste ;-)
Zzarbi974 Messages postés 8 Date d'inscription lundi 7 juillet 2003 Statut Membre Dernière intervention 21 novembre 2006
21 nov. 2006 à 15:33
Je suis en train de faire une classe d'abstraction mysql en me basant sur tes sources (pour le singleton) et celle de FhX (Pour toute les options ajoutées), et je vien de voir une "erreur", et je voulais savoir s'il y aurai une solution.
En effet à la ligne 32 tu vérifies si la class est implémentée pour la base de données que tu veux, et tu génères une exception si elle ne l'est pas.

Le problème c'est que lorsqu'on utilise un autoload (comme c'est le cas), si la classe n'est pas implémentée, php génère une erreure fatal lors de l'execution de class_exist(). Il dit : Fatal error: require_once() sur le fichier de class qui n'existe pas vu qu'elle n'est pas implémenté. On dirait que autoload tente quand même de la charger. Evidemment l'exception que tu veux générer dans ce cas là est inutile...
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 déc. 2005 à 15:05
Amen ! :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 déc. 2005 à 14:36
Tu as ma bénédiction, ça fonctionne ;-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 déc. 2005 à 14:34
En fait c'est ce que j'avais fait au départ, le unset, mais après j'avais laissé le throw et du coup j'avais tjrs l'erreur ;-)
Donc oui, ça me semble mieux. Je vais tester, vu que je suis dessus là :-)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 déc. 2005 à 14:32
Mais je vais pas le faire comme ca mon destructeur :)
public function __destruct() {
if ( isset($this->_config['link']) ) mysql_close();
unset($this);
}

Ca m'évite d'appeler la méthode close() pour refaire un test si il existe déja une liaison avec la base de donnée !

Oui ? Non ? Mieux ? Pire ?
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 déc. 2005 à 14:29
Ah voui éxact.... honte à moi :o
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 déc. 2005 à 13:40
J'ai vu :-) D'ailleurs j'ai récupéré, j'ai encore fait une petite modif...lol (j'ai ajouté le singleton et la factory encore... ;-) ) :
public function __destruct() {
if (isset($this->_config['link']) ) {
mysql_close($this->_config['link']);
}
}
Parce que sinon, j'avais systématiquement une erreur étrange, dans UNKNOWN, ligne 0, without stack...fatal error, un truc dans le genre. Je pense qu'il essayait d'accéder aux prorpiétés déjà détruites de l'objet (les messages d'erreur).
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
8 déc. 2005 à 13:24
Re-regarde ma source, j'ai épuré et pris en compte ce que tu m'as dis !
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
8 déc. 2005 à 09:38
Merci Sjon ;-)

FhX => Nan, vais la réécrire, je t'ai dit, sont farouchement contre l'utilisation de php5, toujours (m'enfin je n'abdique pas encore).
Et puis je me rends compte qu'elle n'est pas adaptée à mes besoins pour un gros projet, faudrait enlever des trucs, en rajouter...lol. Bref la changer. Mais bon, sinon, oui, je l'utiliserais volontiers pour un de mes projets, où on me paye grassement... ;-)
Je vais garder ton histoire de config, passer le connect en public (enfin en php4 on s'en tape un peu), mettre un close (), et, malgré tes réticences ;-) ouvrir et fermer ma connexion en gardant l'instance :-) Je garde mon singleton et ma factory je pense (je réflêchis au singleton parce que ta remarque sur le fait qu'on ne peut dans ce cas pas se connecter à plusieurs bdd commence à me travailler : et si je finissais par en avoir besoin ? ;-)). Je vais aussi virer l'historisation histoire d'alléger l'obet (en production uniquement, je la garde en dév).
Mais un truc me dérange actuellement : j'ai fait un test en instanciant mon objet, et en faisant 2 requêtes : je requête, je ferme la connexion, je traite, je réouvre, je requête, je ferme, je traite...: j'ai 2 ouvertures de connexion dès le départ :-( donc 3 en tout, et 2 fermetures (plus la destruction de l'objet...). Et si je passe le link dans la méthode close (), il n'arrive pas à fermer (le link ne correspond pas à la dernière connexion utilisée apparemment). Bref je travaille là-dessus. Et de touytes façons suis en phase de test de mon modèle de données, donc je verrai à l'utilisation ce dont j'ai besoin exactement, quitte à tout réécrire au final.

Exon => bah ouais, comme FhX dit ;-) En l'occurence, j'aime créer mes objets aussi parce qu'au moins, eux, je suis sûr de les maîtriser complètement...et qu'ils sont adaptés à mes besoins, pas plus (je parle là de dév en prod, dans mon taf quoi). Et si ce n'est pas dans un cadre professionnel, bah autant s'amuser! Et donc coder...
En fait c'est déjà fait, mais un truc
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 déc. 2005 à 20:59
Merci Sjon :)
Au passage, apprendre le PHP n'est pas vraiment le plus dur ! Même si j'ai encore quelques lacunes (surtout en expressions régulières et un peu en SQL), il est assez aisé de concevoir certaines choses :)

L'exemple est ci-dessus =)

Malalam, me dis pas que tu utilises des morceaux de ma classe pour tes propres projets... si ? ;)
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
7 déc. 2005 à 20:48
Parce qu'on aime bien faire ca nous-même :)
Faut qu'on remplisse nos trous dans la journée !
cs_eXon Messages postés 166 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 8 avril 2007 1
7 déc. 2005 à 19:11
Tant qu'à utiliser PHP5 pourquoi pas utiliser simplement la classe de MySQLi?
cs_sjon Messages postés 861 Date d'inscription mardi 26 mars 2002 Statut Membre Dernière intervention 29 novembre 2006 1
7 déc. 2005 à 18:50
Sael og blesud

Il y a des jours comme ça, devant de tels codes, où l'on regrette presque de ne pas savoir coder en php ... ;-) ... Bravo Malalam ... Bravo FhX ;-) ...
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
5 déc. 2005 à 16:32
FhX => bah voui, elle est vachement bien ta classe :-) C'est pour ça que je la réutilise.
Par contre, en prod, je vais virer l'historisation. Ca alourdit trop l'instance. Mais en dév, et en test, c'est très intéressant
vincseize Messages postés 113 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 28 mars 2010
5 déc. 2005 à 16:27
Cela à l air super interressant en tout cas ... le temps de le tester et bien comprendre le code (car c'est assez balèze je trouve )
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
2 déc. 2005 à 17:39
Moi je dis y'a du copitage :D

Heuresement que je ne suis pas sucéptible :) En tout cas, y'a au moins quelqu'un qui aime ma source de départ =)
Rejoignez-nous