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

PHP & Base de données Discussion :

Fatal error: Uncaught TypeError: must be an instance of, array given


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de Projet et futur développeur web qui s'entraîne dur
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de Projet et futur développeur web qui s'entraîne dur

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 30
    Points
    30
    Par défaut Fatal error: Uncaught TypeError: must be an instance of, array given
    Bonjour,

    Je rencontre un problème avec la suppression de mes commentaires signalés. Je n'arrive pas a trouver de solution par mes propres moyens...
    C'est mon premier 'gros' projet en PHP, et je ne suis pas encore très à l'aise avec la résolution des différents problèmes qui font surface.

    Voici le message d'erreur exact :
    Fatal error: Uncaught TypeError: Argument 1 passed to CommentaireManager::delete() must be an instance of Commentaire, array given
    Voici les lignes concernées :
    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 function supprimerCommentaireSignale() {
            if (isset($_REQUEST['idCommentaire'])) {
                $com = $_REQUEST['idCommentaire'];
            }
            $com = $this->commentaireManager->getTableauCommentairesSignales();
            $supprimeCommentaireSignale = $this->commentaireManager->delete($com);
            if ($supprimeCommentaireSignale == true) {
                header('Location: index.php?action=pageCommentairesSignales');
                exit();
            }
            $this->pageCommentairesSignales();
        }
    Modèle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        public function getTableauCommentairesSignales() {
            $commentairesSignales = [];
            $bdd = $this->getBdd();
            $getCommentairesSignales = $bdd->query('SELECT * from commentaires WHERE signalement_commentaire > 0');
            while ($commentaireSignale = $getCommentairesSignales->fetch(PDO::FETCH_ASSOC)) {
                $commentairesSignales[] = new Commentaire($commentaireSignale);
            }
            return $commentairesSignales;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        public function delete(Commentaire $com) {
            // Exécute une requête de type DELETE
            $bdd = $this->getBdd();
            $bdd->exec('DELETE FROM commentaires WHERE id_commentaire = ' . $com->id());
        }

    J'ai à peu près le même mode de fonctionnement pour la suppression de mes chapitres, et celui-ci fonctionne sans aucun problème.

    Par ailleurs, j'ai quelque peu trouvé un moyen de gérer ça mais ça fonctionne seulement lorsqu'il y a qu'un seul commentaire signalé grâce à un rowCount() == 1, mais dès qu'il y en a plusieurs forcément ça coince...

    Merci beaucoup pour vos retours

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Bonsoir,
    traduit littéralement, le message d’erreur dit :
    Erreur fatale : TypeError non interceptée : Argument 1 passé à CommentaireManager::delete() doit être une instance of Commentaire, un array a été donné
    C’est dû à deux choses :
    1. la contrainte de type que tu as placée sur l’argument de delete() : public function delete(Commentaire $com)
    2. le tableau (array) que tu passes ici :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $com = $this->commentaireManager->getTableauCommentairesSignales();
      $supprimeCommentaireSignale = $this->commentaireManager->delete($com);

    La méthode ne comprend pas toute seule qu’elle doit boucler sur les éléments du tableau. Le plus simple est de faire une boucle sur $com et d’appeler delete() pour chaque commentaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $array_com = $this->commentaireManager->getTableauCommentairesSignales();
    $nb_succes = 0;
    $nb_erreur = 0;
    foreach ($array_com as $com) {
        $supprimeCommentaireSignale = $this->commentaireManager->delete($com);
        if ($supprimeCommentaireSignale === true) {
            $nb_succes++;
        }
        else {
            $nb_erreur++;
        }
    }
    // Que faire ensuite ?
    Je te laisse le soin de décider comment signaler à l’utilisateur ou à l’utilisatrice que plusieurs commentaires ont été supprimés, ou qu’il y a eu une ou plusieurs erreurs, le cas échéant. Peut-être que l’action pageCommentairesSignales devra être modifiée.

    Une solution plus complexe serait de donner un comportement différent à la méthode delete() en fonction du type de l’argument reçu. Mais ça t’oblige à retirer l’indication de type dans la définition de la fonction, c’est un peu dommage. Tu peux toujours la laisser en commentaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function delete(/* Commentaire | array<Commentaire> */ $arg) {
        if (is_array($arg)) {
            foreach ($arg as $item) {
                $this->delete($item);
            }
        }
        else {
            // Exécute une requête de type DELETE
            $bdd = $this->getBdd();
            $query = $bdd->prepare('DELETE FROM commentaires WHERE id_commentaire = :com_id');
            $query->execute([ ':com_id' => $com->id() ]);
        }
    }
    À ma connaissance, PHP ne permet pas de déclarer plusieurs fois la même fonction avec différentes signatures, comme on pourrait le faire par exemple en C++.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Chef de Projet et futur développeur web qui s'entraîne dur
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de Projet et futur développeur web qui s'entraîne dur

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 30
    Points
    30
    Par défaut
    Bonjour,

    Merci beaucoup pour ton retour !

    Alors effectivement, ta solution avec la boucle fonctionne bien, mais à pour seul problème qu'il me supprime tous mes commentaires signalés d'un coup
    J'ai oublié de préciser que j'aurais souhaité supprimer selon l'"idCommentaire" sur lequel je clique, donc les supprimer ou autoriser un par un selon si c'est jugé nécessaire ou non.

    Parce que dans le cas contraire j'ai la possibilité d'"autoriser" les commentaires et dans ce cas, c'est simplement le champ signalement_commentaire de ma BDD passe à 0 et le commentaire n'est pas supprimé.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Dans ce cas il y a un problème de conception dans ton code, car la fonction supprimeCommentaireSignale() ne devrait pas récupérer une liste de plusieurs commentaires.

    D’ailleurs ce if entier ne sert à rien, puisque tu redéfinis $com juste après.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (isset($_REQUEST['idCommentaire'])) {
        $com = $_REQUEST['idCommentaire'];
    }
    $com = $this->commentaireManager->getTableauCommentairesSignales();
    Je pense qu’il faudrait que tu ajoutes un paramètre à supprimerCommentaireSignale() pour spécifier de quel commentaire il s’agit.

    Je reste vague volontairement, désolé, mais il y a mille façons de faire et ça dépend de la structure de ton site, notamment le concept d’action que tu sembles utiliser. Personne ne peut savoir mieux que toi le meilleur scénario à mettre en œuvre. Mais dans tous les cas, il me semble qu’il y a minimum deux étapes nécessaires :
    1. l’utilisateur ou l’utilisatrice voit une liste des commentaires signalés ;
    2. il ou elle choisit les commentaires à supprimer, et ce choix est alors transmis au serveur.

    À toi de voir si la réception des données doit se faire dans le même script (ou dans la même action), si la requête doit être faite via ajax ou via un formulaire classique, ou autre technique, etc.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2011, 18h32
  2. [MySQL] Fatal error: Uncaught exception 'MySQLExeption'
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 06/12/2010, 02h34
  3. [Smarty] Fatal error: Uncaught exception 'SmartyException'
    Par Invité dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 20/11/2010, 12h24
  4. [Web Service] Fatal error: Uncaught SoapFault exception: [Client]..
    Par rosita dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 02/04/2010, 11h16
  5. Réponses: 1
    Dernier message: 16/02/2009, 15h00

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