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 :

Singleton de connexion et Le R du CRUD [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut Singleton de connexion et Le R du CRUD
    Bonjour et Salutations

    Bon, j'ai réaliser un singleton pour la connexion de base de données, le tout fonctionne bien pour cette partie.

    Pour le R du CRUD, aussi. Cependant, j'aimerais bien savoir si c'est fait correctement et si je peux le rendre plus portable.

    Le paramètre de ma fonction est $id et j'aimerais si c'est adéquat de mettre $id au
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bindValue(':id', $id, PDO::PARAM_INT);
    Contexte:

    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
    <?php
     
    require_once 'pdo_mysql.php';
     
    class Categorie extends pdo_mysql {
     
        private $conn;
        private $id;
     
        public function __construct() {
            $this->conn = pdo_mysql::pdo_connection();
        }
     
        public function select($id) {
            $stmt = $this->conn->prepare("SELECT * FROM categorie WHERE id=:id");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
            return $rows;
        }
    }
     
    $test = new Categorie(); 
    $c = $test->select(170);
     
    foreach ($c as $v) {
        echo $v['cat'] .'<br>';
    }
     
    ?>
    Je sais que je peux ajouter des "setter" et des "getter" mais je verrai pour aller plus loin. Le $id fait référence au paramètre de ma fonction et me semble que c'est supposé être comme cela. J'ai tors? Si oui pourquoi.

    S'il y a lieu de rendre la chose portable, j'aimerais bien avoir un exemple puisque je n'ai aucune idée comment chercher dans les recherches.

    Ça serait vraiment apprécié, ça fait un bout que je suis sur le même genre de problématique.

  2. #2
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    Bonjour,
    je n'ai pas grande idée de ce que tu désires faire

    Mais pour avoir une classe + générale :
    1) mettre le nom de la table en propriété

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    protected $tableName='tablename';
    stmt = $this->conn->prepare('SELECT * FROM '.$this->tablename.' WHERE id=:id');
    2) renommer ta classe Categorie en Model
    3) créer classe Categorie extend de Model
    dans lea nouvelle classe juste changer le nom de la classe
    protected $tableName='categorie';

    ---------------------------
    dans methode select()
    retourner un objet ! pourquoi un array
    return $stmt->fetch(PDO::FETCH_OBJ);

    ---------------------------
    un select + général
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public function select(array $conditions) { ... } // declaration
    $c= $test->select( array('id'=>44) ); // utilisation
    $c= $pizza->select( array('prix'=>4) );

  3. #3
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Pour le 1 et 2, j'ai bien compris.

    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
    class Model extends pdo_mysql {
     
        private $conn;
        private $id;
     
        public function __construct() {
            $this->conn = pdo_mysql::pdo_connection();
        }
    }
     
     
    class Categorie extends Model {
     
        protected $table='categorie';
     
        public function select($id) {
            $stmt = $this->conn->prepare("SELECT * FROM $this->table WHERE id=:id");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $rows = $stmt->fetchAll(PDO::FETCH_OBJ);
            return $rows;
        }
    }
    Ça deviendrait quelque chose du genre?

    J'ai compris que select() change mais je n'ai pas compris de quelle manière.

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    J'ai compris que select() change mais je n'ai pas compris de quelle manière.

    1) mettre la methode select() dans la classe Model() car maintenant elle est commune a tous tes futurs modèles.

    en poo il faut etre le + général possible pour aller vers le cas particulier, et toi, ta requete est un cas particulier
    --------- aucune obligation ----------
    2) ici tu passes comme requete sql WHERE id=XXX
    moi je te propose de passer la chaine 'id' en parametre pour avoir une méthode select() plus générique ("WHERE prix=44")

    3) apres tu peux donc ecrire une methode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    selectID($id) { return $this->select('id'=>$id); }

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut abstract
    note :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abstract class Model { ... }
    Il faut mettre ta classe Model en abstraite :

    new Model() provoquera alors une erreur

    -------------------------
    abstract class Model extends pdo_mysql ????
    pourquoi ?

  6. #6
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Je le comprends comme cela :

    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
     
    require_once 'pdo_mysql.php';
     
    abstract class Model extends pdo_mysql {
     
        private $conn;
        protected $table='categorie';
        private $id;
     
        public function __construct() {
            $this->conn = pdo_mysql::pdo_connection();
        }
     
        public function select($id) {
            $stmt = $this->conn->prepare("SELECT * FROM $this->table WHERE id=:id");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $rows = $stmt->fetchAll(PDO::FETCH_OBJ);
            return $rows;
        }
    }
     
    class Categorie extends Model {
     
        public function selectID($id) { 
            return $this->select('id'=>$id); 
        }
     
    }
     
    $test = new Categorie(); 
    $c = $test->selectID(170);
     
    ?>
    ps :
    Parse error: syntax error, unexpected T_DOUBLE_ARROW in line 27

  7. #7
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    protected $table='categorie';
    quelle TRES TRES mauvaise idée de la déplacer !

    alors que c'est la seule chose pour l'instant qui devrait être dans categorie !!!!
    On met dans la classe abstraite tout ce qui est commun et justement la seule chose non commune ici, c'est le nom de la table


    ------------------------
    pour select(), laisse tombé si il est trop difficile pour toi de réécrire complètement cette méthode. C'est juste passer un tableau en parametre et reutiliser ce tableau pour générer une requete : que du pur php (rien a voir avec la poo)

  8. #8
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    PS, ta dernière réponse, je ne l'avais pas vue...

    Si j'enlève le dans select(), ça m'affiche qqchose.

    On dirait comme une étape de plus pour afficher. A moins que ça me permettrait d'afficher un id ou juste tout afficher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Categorie extends Model {
     
        public function selectID($id) { 
            return $this->select($id); 
        }
    }
     
    $test = new Categorie(); 
    $c= $test->selectID(170);
     
    foreach ($c as $a) {
        echo $a->cat;    
    }

  9. #9
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Tiens, au final, j'ai fait comme ceci :
    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
     
    require_once 'pdo_mysql.php';
     
    abstract class Model extends pdo_mysql {
     
        private $conn;
        private $id;
     
        public function __construct() {
            $this->conn = pdo_mysql::pdo_connection();
        }
     
        public function select($id) {
            $stmt = $this->conn->prepare("SELECT * FROM $this->table WHERE id=:id");
            $stmt->bindValue(':id', $id, PDO::PARAM_INT);
            $stmt->execute();
            $rows = $stmt->fetchAll(PDO::FETCH_OBJ);
            return $rows;
        }
    }
     
    class Categorie extends Model {
        protected $table='categorie';
    }
     
    $test = new Categorie(); 
    $c= $test->select(170);
     
    foreach ($c as $a) {
        echo $a->cat;    
    }
     
     
    ?>
    ça marche. mais est-ce suffisamment portable?

    PS, ça aurait été bien de tout afficher sans spécifier le id dans la même requête.

  10. #10
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    PS, ça aurait été bien de tout afficher sans spécifier le id dans la même requête.
    a toi de faire la methode getAll()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /* Modele */
    public function getAll() {
            $stmt = $this->conn->prepare("SELECT * FROM $this->table");
            $stmt->execute();
            return $stmt->fetchAll(PDO::FETCH_OBJ);
        }
    Citation Envoyé par dancom5 Voir le message
    ça marche. mais est-ce suffisamment portable?
    en fonction de ton cahier des charges ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Pizza extends Model {
        protected $table='pizzas';
        public function getAllByCategorie($categorie) { }
    }

  11. #11
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    Le tout dernier:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Pizza extends Model {
        protected $table='categorie';
        public function getAllByCategorie($categorie) { }
    }
     
    $test = new Pizza();
    $c = $test->getAllByCategorie("cat");
    Celui-là, je ne sais pas. Dans ma base c'est id et cat que j'ai seulement
    avec la table categorie. Je comprends pas vraiment le sens de l'utilité.

  12. #12
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    J'ai compris que dans le fond, c'est ajouter une fonction pour tout afficher.

    Mais le cahier des charges, celui-la, je le comprends pas.

  13. #13
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

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

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 206
    Points : 4 680
    Points
    4 680
    Par défaut
    lol
    je te parlais de portable vers d'autres tables, ici tu utilises Categorie avec que 2 champs donc tres tres limité. peut-être ajouter un ORDER BY ..

    le cahier des charges : avec mon exemple :
    afficher toutes les pizzas d'une catégorie particulière ...

  14. #14
    Membre actif Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Points : 241
    Points
    241
    Par défaut
    ha ok. Je vais regarder plus en profondeur sur le sujet de abstract PHP.

    Hey, Merci pour ton aide bien apprécié.

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

Discussions similaires

  1. [Framework] Remplacer Singleton de connexion à la bdd
    Par chewing-gum dans le forum Spring
    Réponses: 4
    Dernier message: 16/01/2012, 00h03
  2. Connexion à une base de données avec un singleton
    Par slake13 dans le forum Bases de données
    Réponses: 6
    Dernier message: 18/11/2008, 17h26
  3. Singleton de connexion à la base de données
    Par Gunny dans le forum ASP.NET
    Réponses: 4
    Dernier message: 21/08/2008, 13h25
  4. Réponses: 1
    Dernier message: 04/07/2008, 14h53
  5. Applet, Servlet et Connexion BDD singleton
    Par Predator79 dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/06/2008, 16h13

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