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 :

un objet peut t'il se connecter quand il est en PDO? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut un objet peut t'il se connecter quand il est en PDO?
    bonsoir a tous,

    j'essaye de faire discuter une connection PDO avec un objet mais plusieurs problème se pose, je ne sais pas comment m'y prendre
    voici le PDO de connextion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    voici un objet moteur par exemble
    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
     
    <?php
    class Moteur
    {
      private $find_mot;//mot a rechercher qui a été traiter
      private $req_article="SELECT * FROM table ORDER BY ID";//requet du mot a chercher
      private $in_article;//query $req_article 
     
    	public function __construct($find_mot)
    	{
        $this->find_mot=$find_mot;
        $this->in_article=
      }
     
       // Retourne la requet
    	public function getReq() 
      {
    		return $this->req_article;
    	}
       	 // Retourne la requet
    	public function mot_rech() 
      {
    		return $this->find_mot;
    	}
     
    }
     
    ?>
    comment fait ton pour dire à l'objet va chercher tous ce qu'il y a dans ma table avec cette histoire de PDO
    j'avais songé à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    private req_article= (reponse = $bdd->query('SELECT * FROM table orderby id'));
    mais des erreurs apparraîse, je pense les flèche doivent pertuber php
    comment fait ton pour faire une relations entres cette objet et cette connection?
    c'est peut être pas possible?

    si vous avez une idée merci de la réponses

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Il y a deux "erreurs" ici :
    1. L'initialisation même de l'attribut :
      Citation Envoyé par documentation
      Cette déclaration peut être une initialisation, alors elle doit être initialisée à une valeur constante, c'est à dire que cette valeur doit pouvoir être évaluée durant la compilation et ne pas dépendre de l'exécution du code pour pouvoir être évaluée.
      L'initialisation d'un attribut ne peut être réalisée directement s'il ne s'agit pas d'une valeur constante. A défaut, il faut procéder à celle-ci dans le constructeur (ou ailleurs éventuellement).

      Cela dit un objet PDOStatement ne présente guère d'intérêt en lui-même (obtenu de l'exécution de la requête).
    2. Une question de portée : la variable $bdd ne sera pas connue de votre classe. Il faut la passer en paramètre (conseillé) ou bien la déclarer global.


    Plus d'informations :
    1. Les propriétés
    2. La portée des variables


    Eventuellement, pour garder votre orientation :
    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
    <?php
    class Bidule {
        protected $mesDonnees;
     
        public function __construct(PDO $bdd) {
            $stmt = $bdd->query('SELECT ...');
            $this->mesDonnees = $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
    }
     
    try {
        $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $machin = new Bidule($bdd);
        // ...
    } catch (Exception $e) {
        // ...
    }

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci de la réponses tulp

    comment explique ton

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public fonction __construct(PDO $bdd)
    peut t'on l'écrire autrement j'ai du mal a comprendre
    d'habitude on met que des variable entre parenthèse?
    public finction __construct($serveur,$bdd)

    sinon pour essayer de simplifier la chose j'avais penser a faire 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
    36
    37
    38
    39
    40
     
    <?php
    try
    {
      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
    }
    catch (Exception $e)
    {
      die('Erreur : ' . $e->getMessage());
    }
     
     
    class Fruit
    {
     
       private $nom_fruit;//l'attribut le nom du fruit
       private $fruit_ok;//reponse si il est dans la base
       private $serveur;//ici tous les éléments pour la connextion bdd
       private $req_champ_fruit;//requete du champs fruit
     
       //retourne le fruit a chercher
       public function __construct($nom_fruit,$bdd)
       {
        $this->nom_fruit=$nom_fruit;//dès que l'objet est crée on met la variable dans $nom_fruit
        $this->req_champ_fruit= $bdd->query('SELECT * FROM table');
     
     
     
     
       }
       	 // Retourne le fruit rechercher
    	public function getFruit() 
       {
    		return $this->nom_fruit;
       }
    }
     
     
     
    $fruit=new Fruit('cerise',$bdd);
    maitenant je veux mettre la boucle while dois je l'a mettre dans le constructeur et comment je la met à la suite?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $this->req_champ_fruit= $bdd->query('SELECT * FROM table');
    $this->req_champ_fruit=while($reponse=$bdd['lefruit']);

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Non, attention, PDO $bdd, n'est bien qu'un seul paramètre. Sauf, qu'ici, est utilisé la possibilité de typer le paramètre (introduit par la version 5.1). Cela force l'appelant à nous fournir un paramètre de type PDO (la connexion à la base). PHP générant, dans le cas contraire, une erreur.

    Plus d'informations : Typage objet.

    En ce qui concerne la suite, comme dit plus haut, récupérer un objet PDOStatement résultant de l'exécution d'une requête n'a guère d'intérêt car d'une part il doit être utilisé comme tel et d'autre part il ne pourra être parcouru en tout et pour tout qu'une seule fois. Ce n'est donc pas propice à une méthode getter notamment voir autre. C'est pour cela, que je vous suggérais plus haut la méthode fetchAll, qui vous évite par ailleurs d'avoir à vous-même créer une itération pour mettre vos résultats dans un tableau puisque PDO vous en propose déjà une implémentation.

  5. #5
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    peut t'on l'écrire autrement j'ai du mal a comprendre
    d'habitude on met que des variable entre parenthèse?
    C'est une notion que Php a implémenté il y a peu, c'est de pouvoir "typer" un peu.

    Je dis un peu car, (si je ne dis pas trop de bêtises) le typage peut se faire que dans un contexte Objet (une classe), et uniquement pour un Objet ou un tableau.
    C'est pas grand chose, mais c'est déjà un (bon) début.

    Le PDO qui précède la variable $bdd est là pour imposer que le paramètre $bdd soit un objet PDO, et pas autre chose, sinon ça va retourner une erreur.
    Cependant, le typage n'est pas obligatoire.
    C'est plus contraignant au 1er abord, mais c'est fait pour rendre plus stable un projet.

    maitenant je veux mettre la boucle while dois je l'a mettre dans le constructeur et comment je la met à la suite?
    C'est comme pour ton problème de moteur de recherche, si on ne sait pas ton besoin, on pourra difficilement te conseiller.
    Rien ne dis ici qu'on doit faire la requête dans le constructeur ou pas.

    Puis ton exemple est un peu déroutant, car d'une part tu passe comme paramètre le nom d'un fruit.
    Un ID de fruit n'aurait il pas été préférable ? Car un ID est unique, alors qu'un nom, c'est pas si évident que ça.
    Puis on s'attend aussi que la requête serait là pour récupérer les informations du fruit en question, alors que là, ça sélectionne tout dans une table nommée "data_cofiem". On ne sait pas se qui se cache derrière cette table.

    Vois tu, c'est difficile de conseiller, voir impossible même.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  6. #6
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci de ces réponses

    je sais que c'est un mauvais exemple mais ce que je shouaite c'est de savoir comment faire pour que le constructeur sache faire une requête et de me donner un résultat.

    mon exercice était de prendre la classe objet fruit, avec cette objet fruit je chercher si le fruit est dans la ma bdd voici comment est stucturer ma bdd:
    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
     
    //une bdd toutes simple que j'ai refait car je travailler sur une autre donc embrouille
    --
    -- Structure de la table `lefruit`
    --
     
    CREATE TABLE IF NOT EXISTS `lefruit` (
      `ID_fruit` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `nom_fruit` varchar(10) NOT NULL,
      PRIMARY KEY (`ID_fruit`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
     
    --
    -- Contenu de la table `lefruit`
    --
     
    INSERT INTO `lefruit` (`ID_fruit`, `nom_fruit`) VALUES
    (1, 'cerise');
    dans cette bdd il n'y a qu'une seul donnée
    ID_fruit=0
    lefruit=cerise

    donc avec ma classe Fruit , je crée un nouvelle instance Fruit et avec ca je veux savoir si elle est dans ma bdd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $fruit=new Fruit('cersise','$bdd');
    echo "le fruit a chercher est".GetFruit();
    /:si le fruit est ici on  on indique qu'elle dans ma base;
    voici ce que j'essaye d'obtenir, je pense que c'est un bon exercice pour commencer.
    voici ce que j'avais essayer:
    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
     
    <?php
    //connection de la base
    //le table s'appelle fruit, le champs s'appelle lefruit 
    try
    {
      $bdd = new PDO('mysql:host=localhost;dbname=fruit', 'root', '');
    }
    catch (Exception $e)
    {
      die('Erreur : ' . $e->getMessage());
    }
     
    //creation de la class Fruit
    class Fruit
    {
     
       private $nom_fruit;//l'attribut le nom du fruit
       private $fruit_ok;//reponse si il est dans la base
       private $serveur;//ici tous les éléments pour la connextion bdd
       private $req_champ_fruit;//requete du champs fruit
     
       //construction de l'instance de l'objet fruit
     
         public function __construct($nom_fruit,$bdd)
        {
          $this->nom_fruit=$nom_fruit;
          $this->serveur = $bdd; //login,mot de passe....
        }
     
          try
          {
            $result=$this->serveur->query('SELECT *FROM fruit');
          }
     
      public function GetFruit()
      {
        return $this->nom_fruit;
      }
    }     
     
    $fruit=new Fruit('cerise',$bdd);
    mais ici php n'a pas apprécier le try
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Parse error: syntax error, unexpected T_TRY, expecting T_FUNCTION in C:\Program Files\EasyPHP-5.3.2\www\Nouveau3.php on line 30
    je vais lire le type de l'objet ca doit être cela qui me manque
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     	Non, attention, PDO $bdd, n'est bien qu'un seul paramètre. Sauf, qu'ici, est utilisé la possibilité de typer le paramètre (introduit par la version 5.1). Cela force l'appelant à nous fournir un paramètre de type PDO (la connexion à la base). PHP générant, dans le cas contraire, une erreur.
    je vais essayer le code de tulp et de mieux le comprendre
    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
     
    <?php
    class Bidule {
        protected $mesDonnees;
     
        public function __construct(PDO $bdd) {
            $stmt = $dbh->query('SELECT ...');
            $this->mesDonnees = $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
    }
     
    try {
        $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $machin = new Bidule($bdd);
        // ...
    } catch (Exception $e) {
        // ...
    }

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Hum, sans vouloir être méchant, il faudrait déjà maitriser la "syntaxe" de PHP avant de se lancer dans PDO.

    Ceci, déjà, devrait mieux fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $fruit=new Fruit('cersise', $bdd);
    On ne quote pas les variables, sinon ce sont de simples chaînes.

    Ensuite, le bloc try n'a aucun sens seul (implique au moins un catch) et il doit être placé au sein d'une méthode (ou dans la portée principale).

    Et après, le reste ne s'emboîte pas au niveau des attributs ou encore de la méthode getFruit utilisée comme une fonction

  8. #8
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    ca ne me gène pas pour les critiques, je suis débuant donc je suis la pour apprendre, j'ai un peut tapez sans réfléchire

    sur cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       $stmt = $dbh->query('SELECT ...');
    d'ou vien t'il ceui-là provient t'il de la classe PDO?

    sinon j'ai essayé le scipt complet:
    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
     
    <?php
    try
    {
      $bdd = new PDO('mysql:host=localhost;dbname=fruit', 'root', '');
    }
     
    catch (Exception $e)
    {
      die('Erreur : ' . $e->getMessage());
    }
     
    class Fruit
    {
       private $nom_fruit;//l'attribut le nom du fruit
       private $fruit_ok;//reponse si il est dans la base
       private $serveur;//element du serveur
     
       public function __construct($nom_fruit,$bdd)
        {
          $this->serveur = $bdd; // Si j'ai bien compris c'est ici que tu stock ta connection à la bdd
     
          try
          { 
             $result = $this->serveur->query('SELECT lefruit FROM fruit WHERE lefruit=\''.$nom_fruit.'\';');
                     var_dump($result);
            exit(); 
          }
     
          catch(Exception $e)
          {
            die('Erreur dans la requête de recherche du fruit : '.$e->get_message());
          } 
          // on attend maximum 1 résultat, donc inutile de traiter la réponse MySQL dans une boucle.
          if($a = $result->fetch()) // Si 0 résultat, $a vaut false ou Null, je ne sais plus, mais l'un comme l'autre empêcheront le if() de se valider
          {
     
            $this->nom_fruit = $a['lefruit']; // le fruit est dans la bdd, on peut le stocker dans l'objet
            $resultat->closeCursor(); // il faut fermer le résultat une fois qu'il n'est plus à utiliser, sinon la requête suivante va foirer
          }
            else
          {
             trigger_error('Le fruit '.$nom_fruit.' n\'est pas reconnu !',E_USER_ERROR); // Si le fruit n'est pas trouvé dans la bdd, on pond une erreur fatale. Enfin c'est ma touche personnelle ça. :p
          } 
        }
     
      public function GetFruit()
      {
        return $this->nom_fruit;
      }
    }     
     
    $fruit=new Fruit('cerise',$bdd);
    ?>
    le var dump m'indique false , donc ma requête a échoué mais pourquoi?
    il n'a pas pu se connecté correctement ou comme vous me l'avez préciser que ce n'est pas le bon emboitement?

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 778
    Points
    17 778
    Par défaut
    Oups, désolé, erreur d'adaptation : $dbh est à remplacer par $bdd effectivement.

    Pourquoi l'exécution de la requête vous renvoie FALSE ? Visiblement elle est erronée donc vous renvoie cette valeur (on remarquera qu'elle ne correspond pas à la description de la table fournie plus tôt). Et, à défaut, d'avoir redéfini l'attribut PDO::ATTR_ERRMODE pour une gestion des erreurs par exception (valeur PDO::ERRMODE_EXCEPTION), PDO ne lèvera alors aucune exception en cas d'erreur et c'est alors à vous que revient la charge de les gérer en testant vos valeurs de retour de méthodes et d'aller en chercher l'explication auprès de la méthode errorInfo.

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 191
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 191
    Points : 595
    Points
    595
    Par défaut
    merci julp tout a fait j'ai fait une erreur sur champs fruit car le champs fruit s'appelle nom_fruit et pas fruit

    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
     
    <?php
    try
    {
      $bdd = new PDO('mysql:host=localhost;dbname=fruit', 'root', '');
    }
     
    catch (Exception $e)
    {
      die('Erreur : ' . $e->getMessage());
    }
     
    class Fruit
    {
       private $nom_fruit;//l'attribut le nom du fruit
       private $fruit_ok;//reponse si il est dans la base
       private $serveur;//element du serveur
     
       public function __construct($nom_fruit,$bdd)
        {
          $this->serveur = $bdd; // Si j'ai bien compris c'est ici que tu stock ta connection à la bdd
     
          try
          { 
            $result = $this->serveur->query('SELECT * FROM lefruit WHERE nom_fruit=\''.$nom_fruit.'\';');
                     var_dump($result);
     
          }
     
          catch(Exception $e)
          {
            die('Erreur dans la requête de recherche du fruit : '.$e->get_message());
          } 
          // on attend maximum 1 résultat, donc inutile de traiter la réponse MySQL dans une boucle.
          if($a = $result->fetch()) // Si 0 résultat, $a vaut false ou Null, je ne sais plus, mais l'un comme l'autre empêcheront le if() de se valider
          {
     
            $this->nom_fruit = $a['nom_fruit']; // le fruit est dans la bdd, on peut le stocker dans l'objet
            $result->closeCursor(); // il faut fermer le résultat une fois qu'il n'est plus à utiliser, sinon la requête suivante va foirer
          }
            else
          {
             trigger_error('Le fruit '.$nom_fruit.' n\'est pas reconnu !',E_USER_ERROR); // Si le fruit n'est pas trouvé dans la bdd, on pond une erreur fatale. Enfin c'est ma touche personnelle ça. :p
          } 
     
        }
     
      public function GetFruit()
      {
        return $this->nom_fruit;
      }
     
      public function GetOkFfruit()
      {
        return $this->fruit_ok;
      }
    }     
     
    $fruit=new Fruit('cerise',$bdd);
    ?>
    maintenant que se script fonctionne je vais essayer d'adapter avec (valeur PDO::ERRMODE_EXCEPTION)

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

Discussions similaires

  1. [PC portable] mon laptop plante plante quand il est connecté à son chargeur
    Par pro132000 dans le forum Ordinateurs
    Réponses: 12
    Dernier message: 13/07/2011, 11h14
  2. Se connecter au net quand PHP est derrière un proxy
    Par FireCracker dans le forum Langage
    Réponses: 8
    Dernier message: 16/04/2010, 14h17
  3. Réponses: 3
    Dernier message: 22/10/2009, 17h30
  4. [POO] Un objet peut-il se détruire lui-même
    Par raoulchatigre dans le forum Langage
    Réponses: 2
    Dernier message: 23/10/2007, 16h58

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