besoin d'aide pour optimiser connexion sql en objet [résolu] [php] - PHP - Programmation
Marsh Posté le 03-01-2011 à 11:28:52
Regarde comment c'est fait dans les différents framework. Tu utilise un Singleton pour faire le lien avec ta base de donnée, histoire d'avoir une seule connexion (tu as raison de te préoccuper de ça, ça prend beaucoup de temps) et ensuite tu balances toutes tes requêtes dans le tuyau ..
Marsh Posté le 03-01-2011 à 12:03:52
bonjour esox_ch et merci de ta réponse;
donc je le pressentais bien : c'est pas terrible de faire une création de connexion à chaque requete ! je vais rechercher de la doc sur Singleton (nom que je découvre ce matin).
Merci. Dominique
Marsh Posté le 03-01-2011 à 13:11:35
Cadeau : http://php.net/manual/en/language.oop5.patterns.php
Marsh Posté le 03-01-2011 à 13:52:28
Un truc du style...
Le dbExecute fait un dbConnect, qui ne se reconnecte pas si la connexion existe déjà.
Ce n'est pas un singleton dans le sens ou il existe une connexion par objet de type Database, mais si tu réutilises cet objet sans en instancier d'autres du même type, alors ton problème est résolu.
Si tu est un fan des new Database() multiples, alors le singleton est la solution qu'il te faut.
Code :
|
Bon là j'ai placé une connexion persistante, à toi de voir si tu en as besoin...
Marsh Posté le 03-01-2011 à 14:18:26
T'utilises ça en prod toi ?
Marsh Posté le 03-01-2011 à 17:05:17
rebonjour
Merci de m'avoir lancé sur des pistes. J'ai maintenant une solution qui fonctionne mais j'ai encore un dernier doute.
En fait , avant chaque requete sql je fais maintenant ceci :
$bdd = Outils_Bd::getInstance()->getConnexion();
puis
$requete = $bdd->prepare('select id_type, etc....')
En tout cas la technique du "singleton" fonctionne. ET j'ai compris que de la sorte je ne crée pas des dizaines de connections
Mais maintenant j'essaie de mettre la ligne
$bdd = Outils_Bd::getInstance()->getConnexion();
dans mon controleur de page, de sorte à ne pas devoir répéter à chaque fois cette ligne avant chaque requete.
Et bien ça ne fonctionne pas.
On dirait que cette variable $bdd n'est connue que dans la fonction.
Donc est ce normale ?
Dominique
nb : cuberdenix : j'ai pas tout compris....désolé, mais je débute en php...
Marsh Posté le 03-01-2011 à 17:09:56
Montre la structure de ton code, tu dois avoir loupé une étape.
Marsh Posté le 03-01-2011 à 17:49:01
Code :
|
les PDO::ATTR_ non rien faire la, ce paramètre c'est pour les options de driver
et pourquoi les gens s'acharne a mettre le ` (opérateur d'exécution) de php dans les regexp, un jour on va vous sortir ca :
Code :
|
Marsh Posté le 03-01-2011 à 21:53:48
stealth35 a écrit :
|
Peux-tu commenter davantage ?
Marsh Posté le 03-01-2011 à 21:56:29
esox_ch a écrit : Montre la structure de ton code, tu dois avoir loupé une étape. |
Ouais, montre-nous ton code entre deux balises de [ code=php ] ... [ /code ] (sans les espaces à l'intérieur des [ ])
Marsh Posté le 03-01-2011 à 23:11:57
ReplyMarsh Posté le 04-01-2011 à 13:18:51
bonjour esox_ch et cuberdenix
Voici mes codes :
1) d'abord le controleur
Code :
|
2) l'accés à la bdd
Code :
|
3) extrait du modele
Code :
|
Mon pb est que si j'enlève ces 2 lignes duscript de la requete (cf point 4), alors ça n emarche plus :
include_once('class/outils_bd.class.php');
$bdd = Outils_Bd::getInstance()->getConnexion();
Et pourtant ces 2 lignes sont déjà dans le point 1)
J'espère avoir réussi les insertions de code dans ce message....
Merci d'avance pour vos réflexions. En tout cas j'ai bien compris le principe du singleton et ainsi je n'ouvre plus des dizaines de connexions. Rien que pour ça : merci.
Dominique
Marsh Posté le 04-01-2011 à 13:35:13
Oui mais non
$bdd = Outils_Bd::getInstance()->getConnexion(); n'a rien à faire dans ton contrôleur, c'est dans le modèle que ça doit se faire.
Ensuite, tu fais une classe genre "modeleBDD", dans le contructeur tu mets l'appel au singleton qui te prépare ton lien vers la base de donnée. Ensuite, soit tu le mets en protected et tu l'hérites dans tes classes du modèle (et tu fais tes $bdd->prepare comme maintenant), soit tu "surcharges" tes méthodes "prepare & co" (en gros, tu transformes modeleBDD en interface) comme le font certains FrameWorks (mais c'est plus compliqué à faire).
Aussi, ton singleton me semble foireux, parce que si tu fais :
Code :
|
Tu auras créé 2 connexions de bdd, là où tu devrais en avoir qu'une seule ... À mon sens faut cacher le fonctionnement du singleton à l’intérieur de la classe => faire les checks de l'unicité de l'instance dans le constructeur, et après l'utiliser comme un objet normal (sans le getInstance)
Marsh Posté le 04-01-2011 à 20:37:14
Bah non, son constructeur est en privé, de fait sa classe ne peut être instanciée. C'est un des principes de base du singleton.
Marsh Posté le 04-01-2011 à 20:41:03
T1 c'est la 2ème connerie de suite que je dis sur ce thread aujourd'hui (loupé le "private" ). Je vais aller me coucher
Marsh Posté le 03-01-2011 à 11:20:32
bonjour
je galère depuis plusieurs jours sur un sujet : comment faire proprement sa connexion sql en objet, dans le cadre d'un modéle MVC ?
J'ai une classe "connectionBDD.class" qui fait la connection à la bdd avec un $bdd = new PDO ('etc.....').
J'ai ensuite d'autres classes qui pointent toutes vers cette classe pour faire des requetes sql.
Tout fonctionne.
Mais j'aimerai optimiser tout cela car actuellement en fait je fais une création de connection à chaque requete. Je pense que c'est pas terrible. Car ça fait des dizaines de connection créées inutilement.
J'ai donc créé un fichier "controleur" qui appelle la classe de création de la connection. Et j'aimerai que cette connexion puisse me servir pour toutes les requetes à réaliser. Et j'ai supprimé la création de la connexion dans la classe qui fait la requete (pour l'instant je fais le test sur une seule classe, avant de généraliser aux autres).
Et là ça ne fonctionne plus , j'ai le message Undefined variable: bdd in C:\wamp\www\mvc\class\etc....
Plusieurs questions :
- devant les difficultés à faire ceci je me demande si finalement ma volonté d'optimiser tout cela en vaut il le coup ?
- comment faites vous pour déclarer cette connexion , de manière unique , pour toutes les requetes ?
Vos avis l'intéressent.
Dominique
Message édité par domi_bu le 05-01-2011 à 13:35:20