IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Bon Usage de PDO / singleton [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Par défaut Bon Usage de PDO / singleton
    Bonjour,
    Je suis apprenti en programmation et on m'a demandé de réaliser une application en PHP (elle sera utilisée par une seule personne par la suite).
    Après beaucoup de recherches sur le net et de bidouilles dans mon code je m'en remet à vous !
    J'ai un souci sur l'utilisation de PDO, j'ai mis ce code dans un fichier connect.php dont je fait un include avant mes requêtes :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php	try
    		{
    			$db_host = "localhost";
    			$db_user = "xxx"; 
    			$db_pass = "xxx"; 
    			$db_name = "xxx";
     
    			$bdd = new PDO("mysql:host=$dbhost;dbname=$db_name;charset=utf8", $db_user, $db_pass);
    			$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		}
    		catch (Exception $e)
    		{
    			die('Erreur : ' . $e->getMessage());
    		}?>

    Cela fonctionne mais je me demande si c'est une bonne pratique à adopter (étant apprenti autant commencer correctement...!)
    Le fait de se connecter à chaque requête peut-il poser des problèmes de performance et/ou de sécurité ?
    J'ai cru comprendre que les variables globales et la persistance du PDO étaient à proscrire, donc je me suis renseigné sur le singleton qui semble être plus "propre" mais je ne parvient pas à utiliser ma classe de connexion et plus précisément à appeler ses fonctions par la suite...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php
    class Connexion
    {
    	private static $connect = null;
    	private $bdd;
     
     
    	private function __construct()
    	{
    		try
    		{
    			$db_host = "localhost";
    			$db_user = "xxxx"; 
    			$db_pass = "xxxx"; 
    			$db_name = "xxxx";
     
    			$bdd = new PDO("mysql:host=$dbhost;dbname=$db_name;charset=utf8", $db_user, $db_pass);
    			$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    			return $bdd;
    		}
    		catch (Exception $e)
    		{
    			die('Erreur : ' . $e->getMessage());
    		}
    	}
     
     
    	public static function getInstance() 
    	{
    		if(is_null(self::$connect)) 
    		{
    			self::$connect = new Connexion(); 
    		}
    		return self::$connect;
    	}
     
    	public function requete($req)
    	{
    		$query = $this->bdd->query($req);
    		return $query;
    	}
     
     
    	public function preparation($req)
    	{
    		$query = $this->bdd->prepare($req);
    		return $query;
    	}
     
     
    	public function execution($query, $tab)
    	{
    		$req = $query->execute($tab);
    		return $req;
    	}
    }
    ?>

    Donc ma grande question dans tout ça : Inclure le PDO dans la page ou se servir d'une classe singleton (ou autre) ??

    Merci d'avance de votre aide et de votre temps !

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 563
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 563
    Par défaut
    La classes que vous nous présentez à l'air d'être très proche de ce qui se fait le plus souvent, c'est à dire une seul connexion au début de l'appel en ensuite on utilise cette connexion pour toutes les requête de la page.

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Il n'y a pas d'intérêt à utiliser un singleton, ça n'apporte strictement rien par rapport au simple fait de créer la variable $bdd dans ton fichier inclus.

    Il faut comprendre comment fonctionne PHP, qui est différent de la manière dont Java, Ruby, Python ou Node.js fonctionne: quand tu fais une requête pour ouvrir une page, une instance de PHP est crééé par le serveur, et cette instance exécute le script PHP. Le serveur détruit cette instance une fois la page servie. Ça veut dire que tous les objets, variables, etc... utilisés par le script sont détruits une fois la page servie. Il n'y a donc pas de persistance de processus au sens habituel.

    Donc, quand ton script se lance, la variable $bdd dans le fichier inclus est créé. Tu utilises ensuite cette variable dans ton script (à une ou plusieurs reprises), et à la fin elle est détruite. Le singleton subit exactement le même sort. C'est pour ça que le singleton est très utilisé en Java (avant qu'on se rende compte qu'un singleton était également mauvais pour d'autres raisons), mais en PHP il n'y a pratiquement aucune raison de l'utiliser: en Java, le singleton peut être persistant dans le serveur pendant des semaines ou des mois, alors qu'en PHP il disparait au bout de quelques millisecondes.

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2015
    Messages : 9
    Par défaut
    MERCI beaucoup de vos réponse et surtout pour ton explication Tsilefy qui m'a fait comprendre ce que je n'ai pas pu trouver sur le sujet ! Cela va me permettre de répondre aux questions qu'on me posera quand je présenterais le projet. Je passe le sujet en résolu
    Merci encore !

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    1 576
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 1 576
    Par défaut
    Just un petit complément: si tu écris "global $bdd" une seule fois dans ton code, c'est mauvais. Mais le singleton n'est pas la solution dans ce cas, c'est la manière dont le code est organisé qui n'est pas bonne.

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    le seul intérêt du singleton c'est dans le cas où tu aurais lors d'une même requête au serveur à exécuter plusieurs appels à la base de données sur plusieurs scripts.
    Cela t'évite de devoir rouvrir à chaque fois la connexion avec la base de données pour chaque script.
    Mais si t'es dans le cas où une action = un script, dans ce cas, le singleton ne t'est d'aucune utilité.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bon usage du Singleton
    Par aristeas dans le forum Langage
    Réponses: 5
    Dernier message: 16/07/2009, 20h38
  2. [Delphi - Firebird] Comment faire bon usage des transactions?
    Par Lili21 dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 07/05/2007, 20h59
  3. [PDO] usage de PDO - Php 5.1.6 et Mysql 5 ?
    Par rolandcire dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/11/2006, 09h59
  4. Quel est le bon usage des fichiers "*.bpk" ?!
    Par bnadem35 dans le forum C++Builder
    Réponses: 3
    Dernier message: 12/09/2006, 17h31
  5. [xml] bon usage du xml
    Par Jeddo dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 02/05/2005, 16h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo