8791 sujets

Développement web côté serveur, CMS

Bonsoir à tous !

Je remet cette épineuse question sur la table, question sur laquelle personne ne s'entend (si ce n'est sur le ait que les variables globales, c'est le mal). Cette communauté étant assez tournée "bonnes pratiques", j'espère trouver mon bonheur ici.
Question simple : comment transmettez-vous votre connexion SQL (en considérant que c'est un objet mysqli ou PDO) à vos fonctions ? A vos classes ?

Personnellement jusqu'à ce que je sois obligé de stopper tout développement il y a 2 ans, je les transmettais simplement à mes fonctions en tant qu'argument.
Avant de me relancer dans le dev d'un projet, je voudrais m'assurer de partir sur de bonnes bases, d'où ma question.

Un grand merci d'avance.

PS : j'admets que mes souvenirs sont un peu flous, alors si votre solution repose sur quelque chose d'assez technique pensez, si vous le pouvez, à introduire le code plutôt qu'un long discours Smiley cligne .
J'utilise un objet utilisant le motif Singleton pour une base de donnée unique, ou, ce que certains appellent un Multiton (mais qui est en fait aussi un Singleton) pour les sites utilisant plusieurs bases de données.

Si tu connais pas, ça permet de faire un truc comme ça (n'importe où dans ton script) :


// si j'ai besoin de la connexion à la db
$db = Db::getInstance();

// ici tu fais ce que tu veux avec l'objet (PDO, mysqli) $db, exemple (avec PDO) :
$query = "SELECT....";
try {
	$result = $this->db->query($query);
}
catch(PDOException $e) {
	Db::outputError($e->getMessage());
}

$data = $result->fetchAll(PDO::FETCH_ASSOC);

Modifié par jb_gfx (12 May 2011 - 22:49)
Oui, le Singleton je connais et je viens de me rappeler (ça revient tout doucement) pourquoi je l'utilisais pas : j'étends la classe PDO et je ne peux pas étendre ET utiliser un Singleton à cause du constructeur qui merdoie (les détails du problème ne me reviennent pas dans l'immédiat, mais je suppose qu'avec ça vous devriez comprendre ^^).
Ou alors je n'avais pas à l'époque trouvé comment faire et personne n'avait su me répondre.

Merci pour ton avis en tout cas, je renoncerai peut-être à étendre la classe au profit d'un singleton...
Si tu instancies ta classe enfant de PDO depuis ton Singleton, ça pose problème ? J'ai jamais essayé mais ça me parait jouable.
Modifié par jb_gfx (12 May 2011 - 23:04)
Le problème c'est que pour l'héritage, il faut un constructeur public ( PDO étant public, si on veut l'étendre, faut le même). Donc tu ne garantis plus l'unicité de l'instance dans ton programme, ce qui est contraire à la définition du singleton.
Mais ce n'est pas le même objet. Tu as un objet Db (Singleton) et un objet PDO (public) ou un objet qui étend PDO (public aussi).

Ton objet Db sera toujours unique lui.
Modifié par jb_gfx (13 May 2011 - 10:50)