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 :

Écrire une donnée en objet avec pdo [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 Écrire une donnée en objet avec pdo
    Bonjour la communauté.

    J'arrive à faire des requêtes en utilisant PDO mais en Objet, j'ai quelques difficultés avec insert.

    Ma class:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    <?php
     
    require_once './DBConnect.php';
    //require_once './Customers.php';
     
    class Customers extends DBConnect {
     
        protected $customer_id;
        protected $first_name;
        protected $last_name;
        protected $email;
        protected $active;
     
        public function __construct() {
            parent::connect();
        }
     
        public function setFirstName($first_name) {
            $this->first_name = $first_name;
        }
     
        public function setLastName($last_name) {
            $this->last_name = $last_name;
        }
     
        public function setEmail($email) {
            $this->email = $email;
        }
     
        public function setStatus($status) {
            $this->last_name = $status;
        }
     
        public function getAll() {
            $sth = $this->DBH->prepare('SELECT customer_id,first_name,last_name,email,active FROM customers');
            $sth->execute();
     
            $data = $sth->fetchAll();
            return $data;
        }
     
        public function get($customer_id) {
            $sth = $this->DBH->prepare('SELECT customer_id,first_name,last_name,email,active FROM customers WHERE customer_id = ?');
            $sth->execute(array($customer_id));
     
            $data = $sth->fetchAll();
            return $data;
        }
     
        public function insert() {
            $sth = $this->DBH->prepare('INSERT INTO customers ( first_name,last_name,email,active) VALUES (?,?,?,?)');
            $sth->execute(array($this->first_name, $this->last_name, $this->email, $this->active));
        }
     
        public function update() {
            $sth = $this->DBH->prepare('UPDATE customers SET first_name = ?,last_name = ?,email = ?,active = ? WHERE customer_id = ?');
            $sth->execute(array($this->first_name, $this->last_name, $this->email, $this->active, $this->customer_id));
        }
     
        public function delete() {
            $sth = $this->DBH->prepare('DELETE FROM customers WHERE customer_id = ?');
            $sth->execute(array($this->customer_id));
        }
     
    }
     
    ?>
    Mais, c'est ici que j'ai de la difficulté: Je sais comment afficher mais pas faire une insertion.
    Si quelqu'un peut m'aide à comprendre et à me donner un exemple pour insérer une donnée:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $customers = new Customers();
    $data = $customers->insert();
     
    $customers->insert("Joe","Blo","email@gmail.com",1);
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    salut

    ça m'a l'air bien ton code, c'est quoi la question, tu as une erreur à l'execution?

    la seule réserve que l'on peut faire et tu t'es fait avoir tout seul, c'est que tu crees un objet via ton constructeur qui n'initialise pas tout.
    tu as fait des set pour finir le travail. conceptuellement c'est tellement discutable que tu as oublié de faire les set dans ton propre code d'appel.

    vu que tu as probablement pensé qu'il manquait quelque chose, alors tu as ajouter des arguments qui sont ignorés par ta fonction insert.
    Est ce que PHP fait une erreur dans ce cas? non parce que l'avenir est le droit à un nombre d'argument variables en PHP, un compil C t'aurai pondu une erreur, PHP a essayé d'être accommodant.

    Pour revenir sur le sujet, en programmation objet plus ton objet est immuable mieux c'est pour toi, developpeur.

    ton constructeur devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function __construct($nom,$prenom,$mail, $actif=1){
      parent::__construct(); //c'est moche mais c'est ça.
      $this->last_name=$nom; // j'ai la fleme d'ecrire la fin.
    }
    apres tu peux faire des methodes statiques qui initie un object par lecture de la base

    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
    static function createFromDatabaseByEmail( $mail){
     
    //la c'est pas pratique parce que ton object base de donnée est un parent de ton enregistrement, c'est conceptuellement une erreur pour moi
    //pour moi vaut mieux un object abstrait du genre "record" avec des fonctionnalités insertOne SelectOne UpdateOne  DeleteOne en publiques abstraites et pourquoi pas une gestion archaïque des collections (et surtout pas select sans quoi ya un grand risque de ne selectionner qu'un seul pour plusieurs ou inversement).
    // et un objet qui en découle qui se diversifie en Customer, Prospect, Fournisseur... 
     
      $me = new Customer( null,null,null,null);
     
      $data = $me->getByEmail($mail);
      $me ->mail = $data['email'];
      //et caetera
      //et maintenant le plus important
     
      return $me;
    }
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  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
    Bonjour gene69. Je ne maitrise pas tout à fait le sujet. Alors, j'ai fait une révision sur l'orienté objet à partir d'un exemple pour étudier un peu plus.

    Dans cet exemple qui marche bien que voici:

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    class db {
      private $conn;
      private $host;
      private $user;
      private $password;
      private $baseName;
      private $port;
      private $Debug;
     
        function __construct($params=array()) {
        $this->conn = false;
        $this->host = 'localhost'; //hostname
        $this->user = 'asdf'; //username
        $this->password = 'asdf'; //password
        $this->baseName = 'asdf'; //name of your database
        $this->port = '3306';
        $this->debug = true;
        $this->connect();
      }
     
      function __destruct() {
        $this->disconnect();
      }
     
      function connect() {
        if (!$this->conn) {
          try {
            $this->conn = new PDO('mysql:host='.$this->host.';dbname='.$this->baseName.'', $this->user, $this->password, array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));  
          }
          catch (Exception $e) {
            die('Erreur : ' . $e->getMessage());
          }
     
          if (!$this->conn) {
            $this->status_fatal = true;
            echo 'Connection BDD failed';
            die();
          } 
          else {
            $this->status_fatal = false;
          }
        }
     
        return $this->conn;
      }
     
      function disconnect() {
        if ($this->conn) {
          $this->conn = null;
        }
      }
     
      function getOne($query) {
        $result = $this->conn->prepare($query);
        $ret = $result->execute();
        if (!$ret) {
           echo 'PDO::errorInfo():';
           echo '<br />';
           echo 'error SQL: '.$query;
           die();
        }
        $result->setFetchMode(PDO::FETCH_ASSOC);
        $reponse = $result->fetch();
     
        return $reponse;
      }
     
      function getAll($query) {
        $result = $this->conn->prepare($query);
        $ret = $result->execute();
        if (!$ret) {
           echo 'PDO::errorInfo():';
           echo '<br />';
           echo 'error SQL: '.$query;
           die();
        }
        $result->setFetchMode(PDO::FETCH_ASSOC);
        $reponse = $result->fetchAll();
     
        return $reponse;
      }
     
      function execute($query) {
        if (!$response = $this->conn->exec($query)) {
          echo 'PDO::errorInfo():';
           echo '<br />';
           echo 'error SQL: '.$query;
           die();
        }
        return $response;
      }
    }
    A l'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    include('db.class.php'); // call db.class.php
    $bdd = new db(); // create a new object, class db()
     
    $UserOne = $bdd->getOne('SELECT customer_id, first_name, last_name, email, active FROM customers WHERE customer_id = 5'); // select One from users
     
    echo '<br/>'.$UserOne['customer_id'].' - '.$UserOne['first_name'].' - '.$UserOne['last_name'].'<br/>';
    Tout ça marche bien MAIS: les BindParam ou BindValue, je me demandait où les mettres; dans la classe à getOne ou dans l'extentiation et comment le mettre pour être portable? Les bindparam me permettrait de filtrer.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    salut

    la classe db n'est malheureusement pas équipée pour faire des bindParam. au minimum il faut ajouter un 2e parametre à tes getOne()/getAll() que tu passerais à PDOStatement::bindParam() ou PDOStatement::bindValue().

    Cette façon d'integrer dans la base de donnée (la composition pour parler savament) c'était pas mal avant qu'on invente PDO. PDO étant suffisament bien faite, je préfère maintenant hériter de celle-ci. essaye les deux, tu verras.

    Ps: on ne parle pas d'extenciation, on dit soit "étendre la classe" soit héritage de classe. On parle aussi d'instanciation c'est a dire créer une instance, un objet, faire un new quoi ... mais ce n'est pas la meme chose.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    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
    Merci gene69.

    J'ai suivi plusieurs cours sur l'orenté objet mais je fini par perdre mon latin quand j'essaie de trouver des modèles d'exemples sur les requêtes CRUD basé sur PDO avec Orienté Objet. Faudrait que je trouve le moyen d'ajouter les bindparms ou bindblues dans le genre de crud que je veux faire.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  6. #6
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    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
    function getOne($query, $bindParam = null ) {
        $stmt = $this->conn->prepare($query);
        if ( is_array($bindParam ) ){
            foreach ( $bindParam as $key => $val ){
                $stmt -> bindValue ($key, $val);
            }
        }
     
        $stmt->setFetchMode(PDO::FETCH_ASSOC);
     
        $ret = $stmt->execute();
        if (!$ret) {
           echo 'PDO::errorInfo():<br />error SQL: ',$query,PHP_EOL;
           print_r( $stmt->errorInfo());
           throw new Exception('Erreur sur une requete '.$query ); // tu peux configurer PDO pour que l'exception soit générée directement sans devoir la faire toi meme. Pitié pas de die(), l'exception pourra aussi faire mourir ton code mais en plus te dira ou est-ce qu'elle était sur la pile d'execution.
        }
        return $stmt->fetch();
        //oubien on peut renvoyer $stmt comme ça tu peux le réutiliser
       }
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  7. #7
    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 commencer Gene69, un gros merci et aussi mes salutations

    Je vais faire des exemples différents pour appliquer votre méthodologie.

    Ma méthode execute(...) dans ma classe en bas, je vais aussi l'adapter puisque ça prends aussi idéalement des Binds... pour les INSERT et UPDATE.

    En ce moment, j'utilise ça comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $UserOne = $bdd->getOne('SELECT customer_id, first_name, last_name, email, active FROM customers WHERE customer_id = 5'); // select One from users
    echo '<br/>'.$UserOne['customer_id'].' - '.$UserOne['first_name'].' - '.$UserOne['last_name'].'<br/>';
    Il va falloir que je modifie l'argument dans getOne() avec toutes les virgules dans () déjà, vous pourriez me donner un exemple comment je peux le faire? Actuellement, j'applique sans changer mais ça va pas appliquer les bindParam.
    On oublie souvent la simplicité ou la base dans la vie: Maslow

  8. #8
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    Il va falloir que je modifie l'argument dans getOne() avec toutes les virgules dans () déjà, vous pourriez me donner un exemple comment je peux le faire?
    je peux pas t'aider pour écrire des paramètres supplémentaires dans ton appel de la méthode DB->getOne($squey,$array). C'est au dessus de mes forces dsl.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  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
    Citation Envoyé par gene69 Voir le message
    je peux pas t'aider pour écrire des paramètres supplémentaires dans ton appel de la méthode DB->getOne($squey,$array). C'est au dessus de mes forces dsl.
    J'avais pas pensé à ça le array et de séparer le contenu de getOne en utilisant des variable.

    Ok. Merci, vous m'avez mis sur de bonnes piste. :-)
    On oublie souvent la simplicité ou la base dans la vie: Maslow

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

Discussions similaires

  1. [PDO] récupérer données en objet avec PDO
    Par laurentSc dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 11/12/2013, 17h08
  2. Réponses: 4
    Dernier message: 11/05/2009, 15h59
  3. Réponses: 1
    Dernier message: 23/04/2009, 11h42
  4. Erreur lors du marshalling d'une grappe d'objet avec Castor XML
    Par mbinte dans le forum Persistance des données
    Réponses: 2
    Dernier message: 29/08/2008, 17h07
  5. Table lié à une liste d'objet avec reclassement
    Par backseatgreg dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 10/03/2007, 08h41

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