8348 sujets

Développement web côté serveur, CMS

Bonjour, comme le titre l'indique je me pose la question suivante : quand dois-je ouvrir une connexion vers la base de données ?

Je m'explique, je suis en train de coder un blog et dès l'appel d'une page je me connecte à la BD, et garde la connexion ouverte tant que la page n'est pas chargée. Le souci est que je dois me trimballer mon objet qui me permet d'appeler des fonctions telle que setQuery(), countRow()... Ce qui m'ennuie assez n'ayant pas trouver de moyen plus facile.

Je me demande donc s'il est préférable de faire ainsi (se trimballer avec "mon PDO") ou bien de se connecter juste avant d'exécuter une requête et de refermer ensuite cette connexion. Le souci avec cette dernière méthode est la perte de performance/rapidité.

J'utilise globalement PDO, mais cela s'applique pour toutes les méthodes j'imagine. Cette question a sûrement déjà été posé et je m'excuse de ne pas vraiment chercher mais l'excédant de café que j'ai bu m'en empêche. J'espère que mes phrases ont un minimum de sens...

D'avance, merci.

Edit : Ce qui serait pas mal, je pense, serait peut-être d'avoir "mon PDO" en global ou quelquechose comme ça, non ?
Modifié par kurt11 (15 Apr 2009 - 12:14)
Salut,

kurt11 a écrit :
Je me demande donc s'il est préférable de faire ainsi (se trimballer avec "mon PDO") ou bien de se connecter juste avant d'exécuter une requête et de refermer ensuite cette connexion. Le souci avec cette dernière méthode est la perte de performance/rapidité.
Qu'est-ce que tu veux dire par se trimballer avec "mon PDO" ?

Quoi qu'il en soit, si tu as besoin de te connecter à chaque page ça ne changera pas grand chose même s'il semble plus logique de se connecter juste avant la première requête (de façon classique ou en instanciant PDO)...
Salut,

Je suis assez d'accord avec le commentaire de Heyoan, néanmoins le jour ou tu vas vouloir, par exemple, implémenter un système de cache, ta connexion au serveur va devenir inutile. Ce qui entraine de revoir une partie de l'architecture de ton script.

Perso, j'ai créé une classe singleton inspiré de ce tutoriel. Mon premier objet crée la connexion au serveur, les suivants récupèrent l'instance de connexion.

Je préfère me connecter à l'instant où c'est nécessaire et je ferme lorsque toutes les requêtes sont terminées.
Heyoan a écrit :
Salut,

Qu'est-ce que tu veux dire par se trimballer avec "mon PDO" ?

Quoi qu'il en soit, si tu as besoin de te connecter à chaque page ça ne changera pas grand chose même s'il semble plus logique de se connecter juste avant la première requête (de façon classique ou en instanciant PDO)...


Ce que je faisais était quelque chose comme ceci.

/* Dans la classe page */
$PDO = new PDO;
$PDO->openBD();

$article = new Article;
$article->getArticleTpl($PDO);

/* Dans la classe article */
...
public function getArticleTpl($PDO) {... $articleCtrl = new articleCtrl; $articleCtrl->getArticleInfo($PDO) ...}


Le souci est que je n'utilisais pas $PDO dans la classe Page ou Article mais seulement dans ArticleCtrl et MenuCtrl.
En revoyant une vidéo j'ai vu que ce que je faisait est contre la Loi de Déméter, du coup je pense que ce n'est pas vraiment la meilleur méthode.

bzh a écrit :
Salut,
[...]
Perso, j'ai créé une classe singleton inspiré de ce tutoriel. Mon premier objet crée la connexion au serveur, les suivants récupèrent l'instance de connexion.

Je préfère me connecter à l'instant où c'est nécessaire et je ferme lorsque toutes les requêtes sont terminées.


Mais est-ce vraiment nécessaire d'avoir une classe singleton ? Je crois que PDO ne permet qu'une requête à la fois si on utilise une transaction (si je me rappelle bien, mais impossible de retrouver la phrase en question sur php.net). Ne serait-il pas possible par hasard de faire une fonction getPDO() (ou mieux __get($PDO)), quoique au fond ça revient un peu au même, non ?

Le truc c'est que j'avais essayé ça rapidement (ajouter une fonction getPDO()) qui me retournait "mon PDO" instancié quelques classes avant et ça n'avait pas fonctionné.

Encore merci d'avance, s'il vous faut le code de ma classe PDOCtrl pour y voir un peu plus clair pas de souci.
Modifié par kurt11 (05 Apr 2009 - 14:52)
Salut, j'ai pas tout lu ... mais il me semble qu'il y a un point qui peu t'aider :



$pdo = new PDO();

$class = new Maclass($pdo);

lorsque tu déclare ta classe :

class Maclass {

protected $pdo;

function __construct($pdo){
  $this->pdo = $pdo;
}
function ....

}


Ainsi, tu ne te "trimbale rien, ta connexion est incluse dans l'objet ... elle est accessible de toutes tes fonctions facilement ...

Sinon, tu as aussi une autre possibilité, ayant d'autres avantages ::



$class = new Maclass();

class Maclass extends Controller {
  function __construct(){
    parent :: __construct();
  }
...
}

class Controller {

  protected $pdo;

  function __construct($pdo){
    $this->pdo = new PDO()  ;
  }
}



ces Deux méthodes sont différentes mais ont le meme effet, tout dépend de l'utilisation que tu fait de ton objet ...

Voila, en espérant que ça puisse t'etre utile !! BonCode Smiley cligne
kurt11 a écrit :
Mais est-ce vraiment nécessaire d'avoir une classe singleton ? Je crois que PDO ne permet qu'une requête à la fois si on utilise une transaction (si je me rappelle bien, mais impossible de retrouver la phrase en question sur php.net). Ne serait-il pas possible par hasard de faire une fonction getPDO() (ou mieux __get($PDO)), quoique au fond ça revient un peu au même, non ?

Je ne suis pas spécialiste en design pattern, mais l'avantage du singleton n'est pas d'éxecuter une seule transaction à la fois, mais d'avoir une seule instance de la classe durant toute l'execution du script. Donc une seule connexion.
Bonjour,

Grosse bêtise écrite la-dessous, je n'étais pas assez réveillé et lisait le mauvais fichier :s
/*J'ai testé quelques méthodes et je viens de comprendre un truc. En appelant ma classe "PDO" au début de ma "page factory" ("constructeur de page") et que appelant ma classe "ArticleTemplate" qui implemente "ArticleController" qui implement à son tour "PDO" je n'ai pas besoin de garder ma variable "pdo" ou de rappeler ma classe "PDO". Je n'ai qu'à faire
parent::setQuery("SELECT...");


Cela à l'air de bien fonctionner, maintenant je me dis qu'implementer à "tout-va" n'est peut-être pas non plus la meilleure des solutions, enfin je vais encore chercher.
*/
(mon but étant de faire du code "Don't repeat yourself" et "Do more with less")

Encore merci, si quelqu'un a une bonne explication du "implements" je suis preneur, surtout pour connaître l'effet nocif qu'il peut avoir, s'il en a un.
Modifié par kurt11 (08 Apr 2009 - 06:44)
La solution que j'utilise constament, dans un pur esprit "don't repeat yourself", c'est singleton et autoload. Ainsi toute requete sql à n'importe quel endroit du projet se fait en une ligne.


maclassemysql::getInstance()->query('ma requete');


La connexion se faisant automatiquement dans le méthode query s'il n'est pas déjà ouverte, ainsi pas de requete, pas de connexion, à la première requete, la connexion s'ouvre.
J'ai opté pour la méthode singleton (avec autoload bien sûr), pour l'instant tout va bien. Smiley smile

"J'upperai" si je trouve mieux.