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] appel d'une methode par une autre dans une même classe


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut [POO] appel d'une methode par une autre dans une même classe
    bonjour,

    j'ai un petit soucis concernant l'appel d'une methode par une autre.

    voici mon code :
    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
     
    class MaClasse{
    public $getDataSql, $resultSQL, $table;
     
    function func2($dbCxn)
    {
    $this->getDataSql = " SELECT ch1, ch2 FROM maTable";
    $this->resultSQL  = $dbCxn->query($this->getDataSql) or trigger_error (E_USER_ERROR);
     
    if (count($this->resultSQL) > 0 )
      {
        while ($this->table = $this->resultSQL->fetch(PDO::FETCH_ASSOC)
         {
           echo "les resultats sont:".$this->table['ch1'];
           $this->func1 ($dbCxn, $this->table['ch2']);
         }
      }
    }
     
    function func1($dbCxn,$idChamps)
    {
      $this->getDataSql = " SELECT ch3 FROM table2 WHERE id ='".$idChamps."'";
      $this->resultSQL   = $dbCxn->query($this->getDataSql) or trigger_error(E_USER_ERROR);
     
    if (count($this->resultSQL) > 0 )
      {
        while ($this->table = $this->resultSQL->fetch(PDO::FETCH_ASSOC)
         {
           echo "les resultats sont:".$this->table['ch3'];
         }
      }
    }
    }
    lors de l'execution du code, j'obtiens une notice correspondant a la ligne d'appel de la func1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     $this->func1 ($dbCxn, $this->table['ch2']);
    notice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal Error:Call a member function fetch() on a non-object
    Si quelqu'un pouvait m'expliquer ( en espérant avoir été assez clair dans mes explications )ce que je dois changer, parce que la je ne vois pas trop.


    Par avance merci pour votre aide , conseils...

    A++

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    C'est normal qu'il manque une parenthese fermante au while ?
    Que dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "les resultats sont:".$this->table['ch1'];
    ?

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    heu... concernant la parenthèse c juste un oubli lors de la redaction du post...

    Pour la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     echo "les resultats sont:".$this->table['ch1'];
    et bien elle affiche bien le resultat souhaité. en fait cette ligne doit afficher un titre par exemple, et l'appel de la fonction doit normalement afficher une liste de caratértistiques en fonction de ce même titre... mais ca ne marche pas

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    salut,

    ton problème semble venir de l'utilisation de pdo avec la méthode query() qui renvoie directement un résultat sans avoir à passer par un fetch :

    http://fr.php.net/manual/fr/function.pdo-query.php

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    merci pour ta réponse.

    malheureusement, je ne suis pas certain d'avoir tout saisis parce que en suivant ce paragraphe ( par rapport a la doc ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Si vous ne récupérez pas toutes les données du jeux de résultats avant d'exécuter le prochain appel à PDO::query(), votre appel peut échouer. Appeler PDOStatement::closeCursor() pour libérer les ressources de la base de données associées à l'objet PDOStatement avant d'exécuter votre prochain appel à la fonction PDO::query().
    j'ai rajouter la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $this->resultSQL->closeCursor();
    avant l'appel de la deuxième fonction, mais maintenant je n'ai plus d'erreur mais je n'ai toujours pas les resultats souhaités de cette fonction.
    je crois que j'ai raté un point....

    merci encore d'avance pour votre aide.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    147
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2005
    Messages : 147
    Points : 165
    Points
    165
    Par défaut
    si tu fais deux requêtes qui se chevauchent il faut stocker l'ensemble du résultat de la première dans un tableau avant d'exécuter la seconde.

    il y a une méthode toute faite :
    http://fr.php.net/manual/fr/function...t-fetchall.php

    sinon en utilisant query() il faut le faire manuellement (je crois).

  7. #7
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    malheureusement, je n'arrive vraiment pas a obtenir ce que je veux...je m'en reviens pour vous demander une nouvelle fois votre aide.

    je vais en parallèle chercher une solution alternative à mon problème (peut-être une fonction recursive), si vous aviez des suggestions

    merci encore pour votre aide.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    bonjour,

    je reviens de nouveau car malheureusement, je n'ai pas réussi a résoudre mon probleme

    j'ai essayer de tester le $this->resultSQL, et voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    en fait si je fais un var_dump($this->resultSQL) à la fonction func2 il m'affiche: 
     
    Code: 
     
    object(PDOStatement)#3(1) 
    { 
    ["querystring"]=>string(96) 
    "SELECT ch1, ch2 FROM maTable"} 
     
     
     
    mais à la fonction func1 il ne m'affiche que " bool(false)".
    Seulement, je ne vois pas ce que je peux faire maintenant.

    Si quelqu'un pouvait m'éclairer sur la démarche à suivre afin d'accéder à une méthode par une autre.

    Encore Merci d'avance pour toute aide
    A++

  9. #9
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Il y a visiblement un problème dans ton code.
    1. Tu es dans la méthode func2 (au passage tu aurais pu trouver un nom plus explicite)
    2. Tu affectes une variable d'instance ($this->resultSQL)
    3. Tu fais une jolie boucle (while ...) qui se base sur cette variable d'instance
    3.1 Dans cette boucle, tu appelle la méthode func1 (idem, nom à changer)
    3.2 Dans la méthode func1 tu modifie la variable d'instance $this->resultSQL alors que tu es en train de boucler dessus dans func2

    Je ne sais pas si c'est voulu mais en tout cas le code n'est pas très clair.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    en fait les noms des méthodes, champs, et tables n'ont été utilisés que pour la rédaction du post, ils ne sont pas définitifs.

    j'ai essayer de renommer la variable d'instance $this->resultSQL, afin d'en avoir deux distinctes, mais l'erreur est toujours la même.

    sinon la démarche est effectivement celle-la:

    1- je recupère un resultat ( un titre par exemple ) grace a la methode func2.
    2- Pour ce titre et avec son identifant, je récupère d'autres résultats provenant de la methode func1.

    je suis désolé si ce n'est pas très clair...

  11. #11
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Si tu mets en commentaire l'appel à func1 est-ce que tu as un résultat correct ?

  12. #12
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    oui, les deux méthodes prises séparément me retournent les résultats souhaités sans problème, c'est bien pour ca que je ne comprends pas trop bien comment faire.

    séparement c'est ok, mais même en changeant les noms, ca me colle une erreur.

Discussions similaires

  1. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  2. Réponses: 11
    Dernier message: 13/03/2008, 11h06
  3. Remplacer un caractère par un autre dans une String
    Par djack44 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 12/03/2008, 15h16
  4. Réponses: 1
    Dernier message: 27/02/2008, 10h24
  5. Réponses: 3
    Dernier message: 21/07/2007, 01h48

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