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 :

controleur : erreur renvoi fonction


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut controleur : erreur renvoi fonction
    Bonsoir à tous,
    Voila, j'ai un contrôleur et une classe news. Mon contrôleur permet de récupérer une liste de news et ceci grâce à un tableau, mais j'aurais voulu passer les paramètres 1 par 1.
    Je m'explique :
    Mon contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      public static function chercher() {
            donnees::connexion();
            $r= donnees::cherchertout(get_called_class());
            $nb = donnees::count(get_called_class());
            $c= get_called_class();
            $res = array();
    
            for($i = 0 ; $i < $nb[0] ; $i++) {
                array_push($res, new $c($r[$i]));
            }
            return $res; --> c'est ici que j'obtiens mon tableau d'éléments.
        }
    Ma classe news:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      public function __construct($id,$titre){
            $this->_id = $id;
            $this->_titre = $titre;
        }
    J'obtiens cette erreur qui m'explique que il ne trouve pas les arguments :
    Warning: Missing argument 2 for news::__construct(), called in ../../controleur.php on line 77 and defined in ../.././news.php on line 21.

  2. #2
    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

    Je me suis jamais frotté au MVC, j'en connais juste le concept ... un peu compliqué je trouve

    Mais à voir ton message, ça serait lié à la classe News, du constructeur qui attend 2 paramètres : un id et un titre

    Faudrait rechercher qui, quelle page, quel code instancie cette classe News, et voir si les 2 paramètres sont bien passés en argument.

    A quelle code correspond la ligne 21 de news.php ?
    Mais surtout la ligne 77 de controleur.php ?

    Enfin, à vu d'nez.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Exactement, ma classe news a deux paramètres et c'est ces 2 paramètres que je veut retourner dans ma liste de news au lieu de mon tableau $res, mais je ne sais pas comment procéder.

  4. #4
    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
    Nos réponse ont dues se croisées.

    Mais à quoi correspond, quel code a exactement la ligne 77 de controleur.php ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    La ligne 77, c'est :
    array_push($res, new $classe($resultat[$i]));
    J'ai également un autre message qui dit :

    Notice: Undefined variable: titre in D:\../../news.php on line 24

    ligne 24 : $this->_titre = $titre ;

  6. #6
    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
    Citation Envoyé par RomJo Voir le message
    La ligne 77, c'est :array_push($res, new $classe($resultat[$i]));
    Et bien je dirais que c'est là qu'est instancié la classe news.
    En faisant un echo $c tu devrais en avoir le coeur net.

    Puis tu fais une boucle for sur $nb[0], mais là, ça m'intrigue.
    $nb est obtenue par : donnees::count(get_called_class());
    C'est un tableau qui est retourné ? Pas un nombre ? Bizarre.

    Puis dans cette boucle for, il faudrait exploiter $r normalement, non ? Car c'est lui qui contient toutes les news, non ?
    Ce $r devrait contenir au moins les couple id-titre des news, du coup, faudrait les exploiter pour les passer en argument ici : new $classe($r[$i]['id'], $r[$i]['titre'])

    Toujours à vu d'nez.


    Remarque à 2 balles.
    Change ces noms $r, $c, etc ... on comprend pas grand chose.
    Le nom d'une variable doit être explicite, un coup d'oeil devrait suffire pour savoir ce quelle contient.
    A l'inverse, faut suivre toute la logique ... C'est pas logique

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Merci de ta réponse, mais j'ai trouvé comment faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static function chercher() {
            donnees::connexion();
            $r= donnees::cherchertout(get_called_class());
            $nb = donnees::count(get_called_class());
            $c= get_called_class();
            $res = array();
     
            for($i = 0 ; $i < $nb[0] ; $i++) {
                array_push($res, new $c($r[$i]['id'], $r[$i]['titre']);
            }
            return $res;    }
    Seulement je veut que cette méthode soit "générique".
    Ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($res, new $classe($ligne));
    ne peut pas aller, car la variable $ligne n'est pas dans le contrôleur et dans ma classe donnees, il n'y a pas la variable $classe.
    Comment faire pour généraliser cette méthode?

  8. #8
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Oui donc là tu as simplement rajouté un second paramètre comme te l'avais précisé RunCodePHP.

    Pour que la méthode soit générique, il faut justement utiliser le code que je t'ai donné par exemple.

    Evidemment il faut déclarer les attributs qui vont bien.

    ne peut pas aller, car la variable $ligne n'est pas dans le contrôleur et dans ma classe donnees, il n'y a pas la variable $classe.
    Comment faire pour généraliser cette méthode?
    Je ne comprends pas ce que tu veux dire par là, pourquoi devrais-tu avoir une variable ligne dans le controleur ? C'est juste un tableau que tu passes en paramètre $ligne.

    Dans ton cas c'est $r[$i] je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    array_push($res, new $classe($r[$i]));
    avec un constructeur qui prend un tableau en paramètre comme décrit dans les posts ci-dessous.

    À bientôt,

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Effectivement, j'ai simplement rajouté un second paramètre.
    Je ne comprend pas trop ce que tu veux dire, même si je mets un tableau en paramètre, j'aurais quand même besoin d'écrire id et titre dans la méthode.
    Ce que j'aurais voulu faire c'est a peu près comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($res, new $classe($r[$i], $r[$j]));
    Je pensait mettre une autre boucle for pour $j.

  10. #10
    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
    Citation Envoyé par RomJo
    Ce que j'aurais voulu faire c'est a peu près comme sa :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array_push($res, new $classe($r[$i], $r[$j]));
    Ce que te propose ThomasR c'est de ne plus se préoccuper du nombre de paramètres à renseigner lorsque tu appel Document::fromArray car c'est intégralité du tableau $resultat qui est "passé". Donc 1 seul paramètre -> 1 tableau

    On délèguerait cette tâche de savoir combien de champs/valeurs renvoie la requête dans la méthode fromArray.
    Ici ce serait la classe news, mais en passant par une autre méthode static fromArray.
    La boucle devrait ce faire dans fromArray, mais ça change un peu la conception.
    Mais il n'a pas opté pour une boucle, mais une vérification des 2 nom théoriquement attendus (id et titre).
    Faudrait d'ailleurs savoir si toutes les autres classes (et constructeurs) susceptibles d'être instancié dans ce cadre là attendent ces 2 paramètes id et titre.

    C'est pas mal imaginé, et abstrait, faut le reconnaitre, mais ça devrait fonctionner si les classes respectent le même concept.

    Enfin, si j'ai bien suivie ... et j'en suis pas sûr.


    Ceci dit, je ne vois pas trop le but de cette partie de code, j'ai comme l'impression qu'on y stock 2 fois les même données, d'un coté dans un tableau ($res) et de l'autre $classe.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 60
    Par défaut
    Ce que te propose ThomasR c'est de ne plus se préoccuper du nombre de paramètres à renseigner lorsque tu instancie new $classe car c'est intégralité du tableau $resultat qui est "passé". Donc 1 seul paramètre -> 1 tableau
    C'est bien ce que je veut faire.
    J'ai enlever $res, elle réécrivait les données je pense, et j'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return new $classe($r);
    J'essaie bien de retourner le tableau $r complet, mais il me faut quand meme mon erreur de paramètres
    Warning: Missing argument 2 for news::__construct(), called in ../../controleur.php on line 77 and defined in ../../news.php on line 21

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

Discussions similaires

  1. [VBA] Erreur avec fonction Dcount
    Par Virgile59 dans le forum Access
    Réponses: 6
    Dernier message: 15/06/2006, 10h56
  2. Erreur 3388: fonction inconnue
    Par flukie dans le forum Access
    Réponses: 1
    Dernier message: 09/05/2006, 11h51
  3. Erreur appel fonction java d'une jsp
    Par itachi38 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 29/04/2006, 17h51
  4. Erreur de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 29/11/2005, 21h56
  5. Erreur de fonction
    Par Anduriel dans le forum Langage
    Réponses: 15
    Dernier message: 26/11/2005, 15h49

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