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

PHP & Base de données Discussion :

Classe de connexion [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier Avatar de lesitadom39
    Homme Profil pro
    Retraité
    Inscrit en
    Août 2015
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Jura (Franche Comté)

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

    Informations forums :
    Inscription : Août 2015
    Messages : 112
    Points : 82
    Points
    82
    Par défaut Classe de connexion
    Bonjour ,
    J'ai récupéré un tuto ave une connexion à une base de données
    Code : 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
     
    <?php
    namespace App;
    use \PDO;
    class Database
    {
        private $db_name;
        private $db_user;
        private $db_pass;
        private $db_host;
        private $pdo;
        public function __construct($db_name, $db_user = "machin", $db_pass = "truc", $db_host = "chose")
        {
            $this->db_name = $db_name;
            $this->db_user = $db_user;
            $this->db_pass = $db_pass;
            $this->db_host = $db_host;
        }
        private function getPDO()
        {
            if ($this->pdo === null) {
                $pdo = new PDO('mysql:dbname=machin;host=truc', 'chose', 'bidule');
                $pdo->exec('SET NAMES utf8');
                $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
                $this->pdo = $pdo;
            }
            return $this->pdo;
        }
        public function query($statements)
        {
            $req   = $this->getPDO()->query($statements);
            $datas = $req->fetchAll(PDO::FETCH_OBJ);
            return $datas;
        }
    }
    ma question est de savoir comment se débarrasser du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $datas = $req->fetchAll(PDO::FETCH_OBJ);
    pour pouvoir passer des requêtes avec des fetchColumn() par exemple
    Merci d'avance

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

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 221
    Points : 15 512
    Points
    15 512
    Par défaut
    je n'utilise par fetchColumn pour le moment donc je ne peux pas vous aider pour ça.
    vous avez peut-être un autre exemple de modification ?

  3. #3
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 396
    Points : 4 825
    Points
    4 825
    Par défaut
    Bonjour,

    Tu peux par exemple ajouter un 2éme paramètre dans la méthode query puis tu récupères le résultat de la requête en fonction de ce dernier :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function query($statements,$count=false)
        {
            $req   = $this->getPDO()->query($statements);
            if($count===true) $datas=$req->fetchColumn();
            else $datas = $req->fetchAll(PDO::FETCH_OBJ);
            return $datas;
        }
    Comme ça quand tu veux utiliser fetchColumn() tu n'as qu'à appeler la méthode query avec le paramètre true :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $db=new Database(......);
    $db->query("requête",true);

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    fetchAll remonte tous les résultats d'un coup. fectchColumn (ou autre méthode fetch) remonte les informations d'une seule ligne de résultat. Il faut donc une boucle si tu as plusieurs résultats à traiter.

    Si tu veux utiliser fetchColumn dans le cas particulier d'une requête SELECT COUNT(*) FROM..., tu peux ajouter une méthode à ta classe du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public function queryCount($statements)
        {
            $req   = $this->getPDO()->query($statements);
            $res=$req->fetchColumn();
            return $res;
        }
    Citation Envoyé par Toufik83 Voir le message
    Bonjour,

    Tu peux par exemple ajouter un 2éme paramètre dans la méthode query puis tu récupères le résultat de la requête en fonction de ce dernier :
    Attention avec cette technique : Le principe de base fonctionne, mais il faut faire attention à ne pas partir dans tous les sens en ajoutant des paramètres pour tous les cas possibles et imaginables et finir avec un énorme tas de if/elseif illisible.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 396
    Points : 4 825
    Points
    4 825
    Par défaut
    Bonjour,

    Citation Envoyé par Celira Voir le message
    Attention avec cette technique : Le principe de base fonctionne, mais il faut faire attention à ne pas partir dans tous les sens en ajoutant des paramètres pour tous les cas possibles et imaginables et finir avec un énorme tas de if/elseif illisible.
    Je suis d'accord, mais pour la lisibilité on peut passer par un switch au lieu des if else, puis je me suis appuyé sur le principe de n'utiliser qu'une seule méthode de sélection au lieu d'en créer plusieurs.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par lesitadom39 Voir le message
    Bonjour ,
    J'ai récupéré un tuto avec une connexion à une base de données
    Une variante est d'utiliser une classe de connexion statique distincte. Par exemple :

    Code : 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
    class C_PDO
    {
    	private static $connexion;
     
    	private static function newC_PDO() 
    	{
                    // A renseigner :
                    $hostname = '';
                    $database = '';
                    $username = '';
                    $password = '';
     
    		// Options de configuration PDO 
    		$pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;		
    		$pdo_options[PDO::ATTR_EMULATE_PREPARES] = false;
    		$pdo_options[PDO::ATTR_DEFAULT_FETCH_MODE] = PDO::FETCH_OBJ;
     
    		self::$connexion  = new PDO('mysql:host='.$hostname.';dbname='.$database.';charset=utf8', $username, $password, $pdo_options);
    	}
     
    	public static function getC() 
    	{
    		if(self::$connexion == NULL) {self::newC_PDO();}
    		return self::$connexion;
    	}	 
    }
    L'avantage est que cela te permet d'appeler cette connexion depuis n'importe où dans ton code, fonction ou classe, sans te préoccuper de savoir combien de fois tu l'appelleras puisqu'elle ne sera instanciée qu'une seule fois.

    Code : 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
    function queryCount($statements)
    {
         $req   = C_PDO::getC()->query($statements);
         $datas = $req->fetchColumn();
         return $datas;
    }
     
    function upddateItem($a,$b)
    {
        $stm = C_PDO::getC()->prepare("UPDATE matable SET x = ? WHERE y = ?"); 
        $stm->execute([$a,$b]);
        return $stm->rowCount();
    }
     
    function deleteItem()
    {
        //...
     
    }
     
    $statements = "SELECT COUNT(*) FROM...,";
     
    $result= queryCount($statements);
     
    // Ou directement sans passer par une fonction
    $req   = C_PDO::getC()->query($statements);
    $datas = $req->fetchColumn();
    Je trouve cette solution plus souple. Paradoxalement l'inconvénient est que c'est tellement souple que cela n'incite pas toujours à avoir une structure de code générique standard. Cela dit fonctionnellement c'est très pratique car on peut appeler la connexion depuis n'importe où et sans compter, sans faire de connexion redondante au niveau du serveur sql.

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

Discussions similaires

  1. [Cookies] Classe de connexion à l'admin
    Par gtraxx dans le forum Langage
    Réponses: 17
    Dernier message: 24/01/2008, 00h41
  2. [POO] Classe de connexion à une base de données
    Par iwf-fr dans le forum Langage
    Réponses: 3
    Dernier message: 13/11/2007, 14h55
  3. pb de creation de classe de connexion
    Par oceane751 dans le forum JDBC
    Réponses: 2
    Dernier message: 30/07/2007, 16h37
  4. [MySQL] Classe database + connexion multiple + principe mal compris
    Par Rodrigue dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/08/2006, 15h06
  5. Petit souci JSP et class de connexion a BdD
    Par LeXo dans le forum Servlets/JSP
    Réponses: 13
    Dernier message: 07/06/2006, 01h57

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