Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/01/2012, 14h34   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
Par défaut POO, questions d'un noob..

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 :
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?
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h40   #2
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h47   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
Disons que j'arrive pas à créer mes objet depuis la bdd
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 14h53   #4
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Ok, postes ton code d'extraction de données pour ta classe Utilisateur
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 15h31   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Bon ça semble bloqué.
Tu utilises PDO ou mysql_ ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 16h00   #6
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
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 :
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.
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 16h13   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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 ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 16h24   #8
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
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
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 16h36   #9
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/01/2012, 22h24   #10
Membre éclairé
 
Inscription : juin 2007
Messages : 337
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 337
Points : 393
Points : 393
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 ?
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 23h03   #11
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
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 :
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 :
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 :
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 :
 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...
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2012, 23h29   #12
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
C'est pas mal du tout,
j'ai repris ta classe Utilisateur :
Code :
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 ?
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/01/2012, 23h58   #13
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
Merci pour ta réponse rapide , j'ai remplacé ce que tu as modifié.

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

Code :
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 :
 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.
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 00h20   #14
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
Ah j'ai trouvé :

Code :
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?
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 10h10   #15
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
Tu retourneras dans tous les cas un tableau : soit un tableau de tableaux soit un tableau d'objets :
Code :
1
2
$data = $stmt->fetchAll(PDO::FETCH_ASSOC); // array([] => array(field => value))
$data = $stmt->fetchAll(PDO::FETCH_CLASS, 'Utilisateur'); // array([] => Utilisateur())
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 10h28   #16
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
Comme ceci ?

Code :
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 :
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 ) )
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h12   #17
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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)
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/01/2012, 11h45   #18
Invité de passage
 
Inscription : janvier 2011
Messages : 24
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 24
Points : 4
Points : 4
C'est avec ça que je remplis mes privates, les getters et les setters ?
drYouz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h57   #19
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 999
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 999
Points : 5 049
Points : 5 049
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 :
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() );
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 13h18   #20
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 462
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 462
Points : 2 552
Points : 2 552
Envoyer un message via Skype™ à rawsrc
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.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h51.


 
 
 
 
Partenaires

Hébergement Web