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 :

[PHP 5.2.6] Problème sur le 'return' d'une fonction [PHP 5.2]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut [PHP 5.2.6] Problème sur le 'return' d'une fonction
    Bonjour/Bonsoir à tous !
    Je me présente, je m'appelle Arnaud, étudiant en BTS IG et je viens quérir votre aide.
    En effet, je suis actuellement en train de développer un service web mais qui n'utilise pas le WSDL ou SOAP. C'est un service web réalisé à partir d'une étude de cas tombé à l'examen du BTS IG.
    C'est un service web en PHP5, et débutant sur la POO, je bloque sur quelques points que je n'arrive pas à comprendre/corriger.

    Tout d'abord, pour me connecter à ma base de donnée, j'utilise PDO en respectant le Singleton :

    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
    class PersistanceSQL
    {
     
        private $type = 'xx';
        private $serveur = 'xx';
        private $nomBaseDonnee = 'xx';
        private $user = 'xx';
        private $password = 'xx';
        private $PDOConnexion;
        private static $instance;
        private $instance2;
     
        private function __construct()
        {
            try
            {
                // Connexion à la base de données.
                $this->PDOConnexion = new PDO($this->type.':host='.$this->serveur.';dbname='.$this->nomBaseDonnee, $this->user, $this->password);
                // Configuration du pilote pour obtenir des exceptions.
                $this->PDOConnexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            }
            catch(Exception $e)
            {
                echo 'Erreur : ' . $e->getMessage();
            }
        }
    // Regarde si un objet connexion a déjà été instancier, si c'est le cas alors il retourne l'objet déjà existant.
        // Sinon il en créer un autre.
        public static function GetInstance()
        {
            // La commande self fait référence à la classe actuelle.
            // Instanceof permet de savoir si un objet est d'une certaine classe.
            if (!self::$instance instanceof PersistanceSQL)
            {
                self::$instance = new PersistanceSQL();
            }
            return self::$instance;
        }
        // Permet de récuprer l'objet PDO permettant de manipuler la base de donnée.
        public function GetPDOConnexion()
        {
            return $this->PDOConnexion;
        }
    La connection est bien établit, sa, il n'y a pas de soucis, la ou il y a un problème c'est ici :

    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
    public function ChargerDepuisBase($idDistributeur = null, $nomClasse)
        {
            $this->idDistributeur = $idDistributeur;
            $objet = PersistanceSQL::GetInstance();
            $connexion = $objet->GetPDOConnexion();
            $requete = $connexion->query('SELECT
                                            *
                                          FROM
                                            distributeur, commande, produit
                                          WHERE
                                            commande.IDDISTRIBUTEUR = "' . $this->idDistributeur . '"
                                          AND
                                            commande.IDDISTRIBUTEUR = distributeur.IDDISTRIBUTEUR
                                          AND
                                            commande.IDPRODUIT = produit.IDPRODUIT');
            while ($donnees = $requete->fetch(PDO::FETCH_ASSOC))
            {
                if (!($instance2 instanceof $nomClasse))
                {
                    $instance2 = new $nomClasse($this->idDistributeur, $donnees['NOM']);
                }
                    $instance2->NOM = $donnees['NOM'];
                    $instance2->IDCOMMANDE = $donnees['IDCOMMANDE'];
                    $instance2->IDDISTRIBUTEUR = $donnees['IDDISTRIBUTEUR'];
                    $instance2->IDPRODUIT = $donnees['IDPRODUIT'];
                    $instance2->PRIXHT = $donnees['PRIXHT'];
                    $instance2->CONDITIONNEMENT = $donnees['CONDITIONNEMENT'];
                    $instance2->QUANTITE = $donnees['QUANTITE'];
                    $instance2->DATECONDITIONNEMENT = $donnees['DATECONDITIONNEMENT'];
                    $instance2->DATEENVOI = $donnees['DATEENVOI'];
                    $instance2->VARIETE = $donnees['VARIETE'];
                    $instance2->TYPEPRODUIT = $donnees['TYPEPRODUIT'];
                    $instance2->CALIBRE = $donnees['CALIBRE'];
            }
            return $instance2;
        }
    Cette fonction retourne un objet chargé depuis ma base de donnée, tout marche, seulement,
    j'appelle cette fonction dans une autre fonction et là, je n'arrive pas à récuperer l'objet retourner et en plus de cela, je n'arrive pas à le re-retourner encore une fois cette objet (ceci est mon problème >_<),
    comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function GetDistributeur($idDistributeur)
        {
            return PersistanceSQL::ChargerDepuisBase($idDistributeur, 'Distributeur');
        }
    Puis cette fonction est appelée par un objet comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $objet = PersistanceSQL::GetInstance();
    $connexion = $objet->GetPDOConnexion();
    $gestCmd = new GestionCommandes($connexion);
    $leDistributeur = new Distributeur(1, 'carreclerc');
    $leDistributeur = $gestCmd->GetDistributeur(1);
    echo $leDistributeur;
    Cependant, rien ne s'affiche et je ne sais pas d'où proviens mon erreur (ou mes erreurs), c'est pourquoi je vous demande votre aide.

    J'espère avoir été assez clair et que vous pourrez m'aider à résoudre ce problème qui dure depuis plusieurs jours déjà >_<

    Je vous remercie par avance et je vous souhaite de passer une très bonne journée !
    Très cordialement,
    Habuu.

  2. #2
    Membre averti
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    Bonjour,

    Juste une petite remarque,

    Évitez l'utilisation du mot-clé $this dans une méthode statique,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->idDistributeur = $idDistributeur;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public function GetDistributeur($idDistributeur)
        {
            return PersistanceSQL::ChargerDepuisBase($idDistributeur, 'Distributeur');
        }
    Donc là vous appelez cette méthode statique alors que le mot-clé $this utilisé dans cette méthode PersistanceSQL::ChargerDepuisBase( ) est l'objet créer à partir de la classe GestionCommandes dans ce cas c'est $gestCmd.

  3. #3
    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
    Par défaut
    Salut

    La façon dont tu as conçu le singleton PDO me semble un peu étrange, et c'est du faite qu'il faille appeler la méthode GetPDOConnexion() qui m'intrigue.

    Normalement il n'y a pas à faire ainsi, un simple PersistanceSQL
    ::getInstance() devrait suffire.
    De plus, du faite que la méthode GetPDOConnexion() et la proprité PDOConnexion ne sont pas statiques ça va te causer des problèmes de portée (visibilité) dans toutes tes autre classes.

    A la limite, rend cette proprité GetPDOConnexion statique et dans celle ci renvoie $instance qui est statique.
    Du coup, faudrait aussi initialiser $instance aussi en lui affectant l'Objet PDO, ce qui au bout doit faire supprimer la propriété PDOConnexion qui fait doublon si on regarde bien.


    Pourquoi ne pas créer une classe étendue de PDO ?
    class PersistanceSQL extends PDO { ... }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function GetDistributeur($idDistributeur) {
        return PersistanceSQL::ChargerDepuisBase($idDistributeur, 'Distributeur');
    }
    Tu appel une méthode PersistanceSQL::ChargerDepuisBase() de manière statique alors que cette méthode n'est pas statique.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ($donnees = $requete->fetch(PDO::FETCH_ASSOC))
    {
        if (!($instance2 instanceof $nomClasse))
        {
            $instance2 = new $nomClasse($this->idDistributeur, $donnees['NOM']);
        }
     
        $instance2->NOM = $donnees['NOM'];
        $instance2->IDCOMMANDE = $donnees['IDCOMMANDE'];
        ... etc ...
    Je ne parviens pas à comprendre cette partie ?
    Si la requête retourne plusieurs résultats (plusieurs commande pour 1 distributeur), on instancie $instance2 uniquement lors du 1ère passage de la boucle.
    On se demande pourquoi uniquement le 1er et pourquoi pas le 2ème ?
    Puis lors des autres passages de la boucle, on ne fera que réinitilaiser les attributs NOM, etc ..., les "écraser" à chaque tour de boucle, non ?
    N'y a t-il pas un problème à ce niveau ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    Salut et merci de vos réponses si rapide !

    J'ai lu attentivement vos réponses et en effet, j'ai rencontre les problèmes que vous soulevés. Je vous remercie vivement de vos conseils et j'espère que ce que je vous soumets ci-dessous permettra de corriger mon problème ^^

    Citation Envoyé par RunCodePhp Voir le message
    ça va te causer des problèmes de portée (visibilité) dans toutes tes autre classes.
    A la limite, rend cette proprité GetPDOConnexion statique et dans celle ci renvoie $instance qui est statique.
    Tu veux dire comme ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public static function GetPDOConnexion()
    	{
    		return self::$instance;
    	}
    Citation Envoyé par RunCodePhp Voir le message
    Du coup, faudrait aussi initialiser $instance aussi en lui affectant l'Objet PDO, ce qui au bout doit faire supprimer la propriété PDOConnexion qui fait doublon si on regarde bien.
    Ce qui nous donne donc 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
    class PersistanceSQL
    {
     
    	private $type = 'xx';
    	private $serveur = 'xx';
    	private $nomBaseDonnee = 'xx';
    	private $user = 'xx';
    	private $password = '';
    	private static $instance;
    	private $instance2;
     
    	private function __construct()
    	{
    		try
    		{
    			// Connexion à la base de données.
    			$this->instance = new PDO($this->type.':host='.$this->serveur.';dbname='.$this->nomBaseDonnee, $this->user, $this->password);
    			// Configuration du pilote pour obtenir des exceptions.
    			$this->instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		}
    		catch(Exception $e)
    		{
    			echo 'Erreur : ' . $e->getMessage();
    		}
    	}

    Citation Envoyé par RunCodePhp Voir le message
    Pourquoi ne pas créer une classe étendue de PDO ?
    class PersistanceSQL extends PDO { ... }
    J'y ai pensé seulement lorsque j'avais essayé de le faire, cela ne marché pas, donc j'avais arrêté de le faire.
    Une étendue de PDO sur notre classe PersistanceSQL serait donc plus approprié ? mais comment ? à travers une classe mysql classique ? ou conserver ce que j'ai déjà ? Je ne vois pas bien comment le faire désolé ^^'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public function GetDistributeur($idDistributeur) {
        return PersistanceSQL::ChargerDepuisBase($idDistributeur, 'Distributeur');
    }
    Citation Envoyé par RunCodePhp Voir le message
    Tu appel une méthode PersistanceSQL::ChargerDepuisBase() de manière statique alors que cette méthode n'est pas statique.
    Je sais mais je n'arrivais pas à l'appeler depuis un objet PersistanceSQL puisque celui-ci construit un objet PDO et j'obtenais alors l'erreur suivante :

    PDO ne connaît pas la méthode ChargerDepuisBase()


    Comment corriger cette erreur ? Grâce à PersistanceSQL extends PDO ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while ($donnees = $requete->fetch(PDO::FETCH_ASSOC))
    {
        if (!($instance2 instanceof $nomClasse))
        {
            $instance2 = new $nomClasse($this->idDistributeur, $donnees['NOM']);
        }
     
        $instance2->NOM = $donnees['NOM'];
        $instance2->IDCOMMANDE = $donnees['IDCOMMANDE'];
        ... etc ...
    Citation Envoyé par RunCodePhp Voir le message
    Je ne parviens pas à comprendre cette partie ?
    Si la requête retourne plusieurs résultats (plusieurs commande pour 1 distributeur), on instancie $instance2 uniquement lors du 1ère passage de la boucle.
    On se demande pourquoi uniquement le 1er et pourquoi pas le 2ème ?
    Il faudrait donc faire comme cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (!($instance2 instanceof $nomClasse))
    		{
    			$instance2 = new $nomClasse($idDistributeur, NOM);
    		}
    		while ($donnees = $requete->fetch(PDO::FETCH_OBJ))
    		{
    				$instance2 = $donnees;
    				return $instance2;
    		}
    Citation Envoyé par RunCodePhp Voir le message
    Puis lors des autres passages de la boucle, on ne fera que réinitilaiser les attributs NOM, etc ..., les "écraser" à chaque tour de boucle, non ?
    N'y a t-il pas un problème à ce niveau ?
    Si, je m'en rend compte, seulement, je ne vois pas comment sauvegarder les données de mon objet lors de son 1er passage dans la boucle puis ensuite lors de son 2ème passages dans la boucle (pour ne pas écraser les données) etc ...

    Vos réponses m'ont éclairés de nombreux points que je n'avais pas vu, et dont je pensais "ok" (fonctionnel).
    Je vous remercie énormément pour vos réponses.
    Très cordialement,
    Habuu.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 4
    Par défaut
    Si je me permet de répondre à mon propre message, c'est pour signaler que j'ai réussi grâce à vos éclaircissements à faire une connexion propre est qui ne pose plus de problème

    class mysql extends PDO marche très bien.

    Le seul problème qui persiste à présent c'est le faite de pouvoir retourner un objet Distributeur qui possède plusieurs commandes dans la boucle while ...
    Je suis preneur de toutes remarques !

    Encore merci beaucoup à vous !

  6. #6
    Membre averti
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    40
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 40
    Par défaut
    Bonsoir,

    La meilleure façon est de définir un tableau comme propriété du distributeur ensuite enregistrer les commandes (relation d'agrégation) .

    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
    class Distributeur 
    {
     
         private $_commandes = array();
     
        /* ................ */
     
       public function ajouterCommande($commande)
       {
              $key = $commande->id;
              $this->_commandes[$key] = $commande;
       }
     
      public function getCommande(/*...*/)
      {
         // .....
      }
      /* .................*/
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
           /* ...................... */
           // C'est un bon choix le nom instance2  !!?
           $instance2 = new $nomClasse($idDistributeur,$nom); 
            while ($donnees = $requete->fetch(PDO::FETCH_OBJ))
            {
                 $instance2->ajouterCommande($donnees);
            }
            return $instance2;
           /* ....................... */
        }

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

Discussions similaires

  1. [GD] [imagettfbbox & imagettftext - PHP 5.2.13]Problème sur les polices inclinées
    Par Lianodel dans le forum Bibliothèques et frameworks
    Réponses: 0
    Dernier message: 20/05/2010, 09h46
  2. [MySQL] exécuter un script php en commande linux : problème sur les fonctions mysql
    Par dr_octopus74 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/03/2007, 16h34
  3. Encore un problème sur le format d'une date!
    Par bygui dans le forum Langage
    Réponses: 1
    Dernier message: 26/06/2006, 08h41
  4. problème sur l'enregistrement d'une instance
    Par Génie dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 12/05/2006, 10h48
  5. Problème sur la réalisation d'une requête
    Par soso78 dans le forum Access
    Réponses: 1
    Dernier message: 06/10/2005, 13h17

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