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 :

POO, questions ... [Débutant(e)]


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut POO, questions ...
    Bonjour,

    J'ai une petite question d'organisation.
    J'ai 2 tables :
    Utilisateur(idUtilisateur, xpUtilisateur, statutUtilisateur, idNiveau#)
    Niveau(idNIveau, libNiveau, palierNiveau, gradeNiveau, forceNiveau)

    Un utilisateur à un Niveau.

    J'ai donc une classe Utilisateur et Niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    class Utilisateurs {
     
    	protected $idUtilisateur;
    	protected $xpUtilisateur;
    	protected $statutUtilisateur;
    	protected $niveau;
     
    	public __construct($idUtilisateur,$xpUtilisateur,$statutUtilisateur,$niveau){
    			$this->idUtilisateur = $idUtilisateur;
    			$this->xpUtilisateur = $xpUtilisateur;
    			$this->statutUtilisateur = $statutUtilisateur;
    			$this->niveau = $niveau;
    		}
    J'ai donc deux questions :
    Au niveau du $this->niveau = $niveau, est-ce correct ? Vu que c'est un lien sachant retourner le niveau de l'Utilisateur. Comment retourner le bon idNiveau ?

    Comment construire l'objet à partir d'une base de donnée?

  2. #2
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Citation Envoyé par drYouz Voir le message
    Vu que c'est un lien sachant retourner le niveau de l'Utilisateur.
    Tu peux expliquer un peu plus ta notion de lien sachant retourner un niveau, stp.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Disons que j'arrive pas à créer mes objet depuis la bdd

  4. #4
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Ok, postes ton code d'extraction de données pour ta classe Utilisateur

  5. #5
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bon ça semble bloqué.
    Tu utilises PDO ou mysql_ ?

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Je souhaite utiliser PDO.

    Pour l'instant j'ai le fichier que je vous ai déjà mis.
    Et config_sql.php ou j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    define('HOST','localhost');
    define('USER','root');
    define('PASS','root');
    define('DB','f');
     
    try{
    	$connection = new PDO('mysql:host='.HOST.';dbname='.DB, USER, PASS);
    	}
    catch(Exception $e){
    	echo 'Erreur de connection à Mysql :'.$e->getMessage().'<br/>';
    	echo 'N° du code de l\'erreur : '	.$e->getCode();
    	}
    ?>
    C'est faire le lien entre ma class et ma table pour charger les objets ou je bloque.

  7. #7
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Quand tu dis que tu bloques : ça veut dire que tu ne sais pas comment faire un SELECT et rappatrier le résultat ou tu ne sais pas comment instancier des classes directement avec PDO ?

  8. #8
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Voila je n'arrive pas a faire ces choses.
    Je connais le sql et le php mais j'ai des difficultes avec la poo/bdd

  9. #9
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Il y a plein de manières différentes pour attaquer la base : soit tu regroupes tes ressources DB au même endroit, soit tu les écris à la volée dans tes scripts, soit tu utilise un ORM, bref l'embarras du choix...
    Dans tous les cas, il va falloir te créer un Singleton de la connexion à la base de données, sinon, tu vas en ouvrir à coup sûr une nouvelle à chaque appel d'une ressource DB.
    A savoir que les contraintes en matières de sécurité diffèrent en fonction du choix.
    Je t'invite d'abord à lire un peu sur PDO et ensuite sur la POO
    En t'inspirant des exemples tu devrais t'en sortir par analogie
    Bon courage

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2007
    Messages
    748
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 748
    Points : 1 022
    Points
    1 022
    Par défaut
    tiens, question qui n'a pas avoir avec le sujet, mais qui concerne PDO

    L'API supporte les commandes préparées côté client!

    Des infos la dessus ?

  11. #11
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Je te remercie pour tes réponses ça m'aide bien

    Bien j'avance un peu, je pense avoir réussis à faire ma connection PDO en Singleton.

    Cependant j'ai des erreurs quand j'utilises certaines méthodes de PDO:

    PDOconnect.php
    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
     
    <?php
     
    class PDOconnect{
     
        private static $instance = null;
     
        public function __construct() {
     
        }
        public static function getInstance() {
            if (!self::$instance) {
               require_once('/config/config_bdd.php');
                self::$instance = new PDO('mysql:host=' . $PARAM_hote . ';dbname=' . $PARAM_nom_bd, $PARAM_utilisateur, $PARAM_mot_passe);
                self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            return self::$instance;
        }
     
        private function __clone() {
            /* interdiction de cloner l'instance */
        }
        public static function disconnect() {
            if (!self::$instance){
                return false;
            }
            self::$instance = NULL;
            return true;
        }
     
    }
    ?>
    Utilisateur.class.php
    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
    <?php
     
    class Utilisateur {
     
        private $idUtilisateur;
        private $xpUtilisateur;
        private $statutUtilisateur;
        private $idNiveau;
     
    //   function __construct($idUtilisateur, $xpUtilisateur, $statutUtilisateur, $idNiveau) {
    //       $this->idUtilisateur = $idUtilisateur;
    //       $this->xpUtilisateur = $xpUtilisateur;
    //       $this->statutUtilisateur = $statutUtilisateur;
    //       $this->idNiveau = $idNiveau;
    //   }
     
        public function readUtilisateurs() {
     
            $DB = PDOconnect::getInstance();
     
            foreach ($DB->query("SELECT * FROM Utilisateurs") as $row) {
                echo '<pre>';
                echo $row['idUtilisateur']." " ;
                echo $row['xpUtilisateur']." ";
                echo $row['statutUtilisateur']." ";
                echo  $row['idNiveau'] ;
                 echo '</pre>';
            }
        }
     
        public function findUtilisateur($idUtilisateur) {
            $data = array(($idUtilisateur));
            $db = PDOconnect::getInstance();
     
            $db->prepare( "SELECT * FROM utilisateurs WHERE idUtilisateur= ? ");
            $db->execute($data);
            $res = $db->fetch(PDO::FETCH_OBJ);
           echo $res->gradeUtilisateur;
        }
     
    }
     
    ?>
    Enfin mon index où je test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    require_once('/class/PDOconnect.php');
    require_once('/class/Utilisateur.class.php');
     
    $utilisateur = new Utilisateur();
    $utilisateur->readUtilisateurs();
    $utilisateur->findUtilisateur(2);
     
    ?>
    $utilisateur->findUtilisateur ne fonctionne pas:
    Cela me retourne cet erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Fatal error: Call to undefined method PDO::execute() in C:\wamp\www\feedgamer\class\Utilisateur.class.php on line 77
    Je comprends pas pourquoi, je pensais qu'il fallait extends sur PDO ou PDOstatement, mais ça change rien..

    Voilà j'ai besoin d'aide...

  12. #12
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    C'est pas mal du tout,
    j'ai repris ta classe Utilisateur :
    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
    <?php
     
    class Utilisateur {
     
       private $idUtilisateur;
       private $xpUtilisateur;
       private $statutUtilisateur;
       private $idNiveau;
     
       public function readUtilisateurs() {
          /** @var PDO */
          $db   = PDOconnect::getInstance();
          $sql  = "SELECT * FROM Utilisateurs";
          $data = $db->query($sql);
     
          foreach($data as $row) {
             echo "<pre>{$row['idUtilisateur']}. {$row['xpUtilisateur']}. {$row['statutUtilisateur']}. {$row['idNiveau']}</pre>"; 
          }
       }
     
       public function findUtilisateur($idUtilisateur) {
          /** @var PDO */
          $db   = PDOconnect::getInstance();
          $sql  = "SELECT * FROM Utilisateurs WHERE idUtilisateur = :id";
          $stmt = $db->prepare($sql);      // PDOStatement
          $stmt->bindValue(':id', (int) $idUtilisateur, PDO::PARAM_INT);
          $db->execute();
          $res = $db->fetch(PDO::FETCH_OBJ);
          echo $res->gradeUtilisateur;
        }
    }
    ?>
    Ton problème vient du fait que le champ idUtilisateur doit être en integer dans ta base et avec ton code le $db->execute($data); le passe par défaut en string (à vrai dire je cherche la ligne 77 de ta classe comme indiqué dans le message d'erreur).
    Tu es bien sûr que ta table Utilisateurs contient un champ intitulé gradeUtilisateur ?

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Merci pour ta réponse rapide , j'ai remplacé ce que tu as modifié.

    Tu es bien sûr que ta table Utilisateurs contient un champ intitulé gradeUtilisateur ?
    Effectivement je m'étais planté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public function findUtilisateur($idUtilisateur) {
        /** @var PDO */
          $db   = PDOconnect::getInstance();
          $sql  = "SELECT * FROM Utilisateurs WHERE idUtilisateur = :id";
          $stmt = $db->prepare($sql);      // PDOStatement
          $stmt->bindValue(':id', (int) $idUtilisateur, PDO::PARAM_INT);
          $db->execute();
          $res = $db->fetch(PDO::FETCH_OBJ);
          echo $res->statutUtilisateur;
        }
    Par contre j'ai toujours la même erreur...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Fatal error: Call to undefined method PDO::execute() in C:\wamp\www\feedgamer\class\Utilisateur.class.php on line 76
    Je ne peux pas utiliser les méthodes de PDOStatement j'ai l'impression...
    Je vois pas le problème.

  14. #14
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Ah j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     public function findUtilisateur($idUtilisateur) {
        /** @var PDO */
          $db   = PDOconnect::getInstance();
          $sql  = "SELECT * FROM Utilisateurs WHERE idUtilisateur = :id";
          $stmt = $db->prepare($sql);      // PDOStatement
          $stmt->bindValue(':id', (int) $idUtilisateur, PDO::PARAM_INT);
          $stmt->execute();
          $res = $stmt->fetch(PDO::FETCH_OBJ);
          echo $res->xpUtilisateur;
        }
    Voilà, on peut dire que ce problème est réglé

    Maintenant, pour mes fonctions, quelle est la meilleur façon de retourner les résultats, par exemple pour readUtilisateurs, qui me retourne toute la table?

  15. #15
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Tu retourneras dans tous les cas un tableau : soit un tableau de tableaux soit un tableau d'objets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC); // array([] => array(field => value))
    $data = $stmt->fetchAll(PDO::FETCH_CLASS, 'Utilisateur'); // array([] => Utilisateur())

  16. #16
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     public function readUtilisateurs() {
     
            $db = PDOconnect::getInstance();
            $sql = "SELECT * FROM Utilisateurs";
            $data = $db->query($sql);
            $stmt = $data->fetchAll(PDO::FETCH_OBJ);
     
            return $stmt;
    Ce qui me retourne ça ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => stdClass Object ( [idUtilisateur] => 1 [xpUtilisateur] => 32 [statutUtilisateur] => [idNiveau] => 1 ) [1] => stdClass Object ( [idUtilisateur] => 2 [xpUtilisateur] => 60 [statutUtilisateur] => lol [idNiveau] => 2 ) [2] => stdClass Object ( [idUtilisateur] => 3 [xpUtilisateur] => 20 [statutUtilisateur] => troll [idNiveau] => 2 ) )

  17. #17
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Oui PDO::FETCH_OBJ te renvoie une classe standard.
    PDO::FETCH_CLASS te renvoie l'instance d'une classe particulière. Il faut juste bien comprendre le mécanisme utilisé par PDO pour définir les propriétés d'une classe spécifique : un peu de lecture ici. (Les commentaires sont très utiles)

  18. #18
    Membre à l'essai
    Inscrit en
    Janvier 2011
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 24
    Points : 12
    Points
    12
    Par défaut
    C'est avec ça que je remplis mes privates, les getters et les setters ?

  19. #19
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Cette classe devrait pouvoir t'aider: https://github.com/bdelespierre/php-...ject.class.php

    Tu as également besoin de celles-là pour que ça fonctionne:
    - https://github.com/bdelespierre/php-...base.class.php
    - https://github.com/bdelespierre/php-...odel.class.php
    - https://github.com/bdelespierre/php-...ator.class.php

    Usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $user = new MySQLObject('users', 1);
    $user->surname = "Robert";
    $user->name = "Paulson";
    var_dump( $user->update() );
     
    // Get all users
    $users = MySQLObject::getAll('users');
    foreach ($users as $user) {
      var_dump( $user->getData() );
    }

  20. #20
    Expert éminent sénior
    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
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Citation Envoyé par drYouz Voir le message
    C'est avec ça que je remplis mes privates, les getters et les setters ?
    C'est pas toi qui va les remplir, mais PDO avec un mécanisme spécifique. Lis bien le lien que je t'ai donné, il aborde la problématique de la présence d'un constructeur.

Discussions similaires

  1. [POO] Question d'organisation
    Par micfrip dans le forum Langage
    Réponses: 6
    Dernier message: 28/08/2006, 01h39
  2. [POO] question sur les interfaces
    Par root76 dans le forum Débuter avec Java
    Réponses: 3
    Dernier message: 20/05/2006, 17h12
  3. [POO] Question POO
    Par shadeoner dans le forum Langage
    Réponses: 1
    Dernier message: 10/04/2006, 14h51
  4. [POO]Question sur les constructeurs
    Par Burinho dans le forum Langage
    Réponses: 16
    Dernier message: 08/04/2006, 21h56
  5. [POO] Question class php=>javascript
    Par jeff_! dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2006, 15h10

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