Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment modifier un commentaire ??!!

perdu dans le MVC POO...

Sujet résolu
    10 décembre 2018 à 9:38:08

    Bonjour à tous,

    Je cherche désespéramment à modifier le commentaire d'un article/billet via un formulaire(tout ça en respectant la structure MVC et la POO). j'arrive à récupérer le commentaire et à l'afficher dans le champs de formulaire pour pouvoir le modifier, mais une fois submit, c'est page blanche et rien ne s'est modifié dans la base de donnée. Ici mon formulaire dans le fichier View :

    <form action="billetsindex.php?action=changeComment&amp;id=<? $comment['id']?> " method="post">
    
                
                <div>
    
                    <label for="comment">Commentaire</label><br />
    
                    <textarea id="comment" name="comment"><?= nl2br(htmlspecialchars($comment['comment'])) ?></textarea>
    
                </div>
    
                <div>
    
                    <input type="submit" />
    
                </div>
    
            </form>

    Là le contrôleur :

    function changeComment($commentId,$comment,$postId)
    
    {
    
        $commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
        $affectedLines = $commentManager->updateComment($commentId,$comment,$postId); 
    
        if ($affectedLines === false) {
            // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
            throw new Exception('Impossible de modifier le commentaire !');
    
        }
    
        else {
    
            header('Location: billetsindex.php?action=post&id=' . $postId);
    
        }
        
    
    
    }
    

    le model :

    public function updateComment($commentId,$comment,$postId)
    
        {
            $db = $this->dbConnect();
            $comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?'); 
            $affectedLines = $comments->execute(array($commentId,$comment,$postId));
    
            return $affectedLines;
        }
        

    et enfin le routeur :

    elseif ($_GET['action'] == 'changeComment') {
    
            if (isset($_GET['id']) && $_GET['id'] > 0) {
    
                if (!empty($_POST['comment'])) {
    
                    changeComment($_GET['id'],$_POST['comment'],$_GET['postId']);
    
                }
    
                else {
    
                        // Autre exception
    
                        throw new Exception('Tous les champs ne sont pas remplis !');
    
                }
    
            }
        }
    
       
    }



    Help :o



    -
    Edité par MohammedHsein 10 décembre 2018 à 9:40:02

    • Partager sur Facebook
    • Partager sur Twitter
      10 décembre 2018 à 9:59:52

      Tu prends trois paramètres dans ton modèle mais tu en utilises que deux, je pense que tu dois avoir une erreur PDO au passage.
      • Partager sur Facebook
      • Partager sur Twitter
        10 décembre 2018 à 10:15:51

        salut,

        je croyais qu'un form ne pouvait pas être GET et POST en même temps ?

        peut-être que ça vient de là...

        • Partager sur Facebook
        • Partager sur Twitter
        Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
          10 décembre 2018 à 10:24:14

          xoxotf a écrit:

          Tu prends trois paramètres dans ton modèle mais tu en utilises que deux, je pense que tu dois avoir une erreur PDO au passage.

          Au niveau PDO il se connecte bien (l'ajout de commentaire se fait sans soucis)

          Oui je sais que c'est les paramètres transmis qui posent problème et ça là où je m'égare mais je vois pas par quel bout le prendre ? je transmet bien l'id du commentaire, donc en principe le champs "comment" devrait être modifié dans la bdd?? :euh:

          j'essaie également de récupérer le postId (qui correspond au billet commenté) pour pouvoir repointer vers la page d'affichage du billet en question et de ses commentaires (pour vérifier si ceux ci ont bien été modifié) mais là je vois pas trop comment le transmettre au routeur??o_O



          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2018 à 10:39:02

            Pour éditer un commentaire en règle générale tu es dans cette situation:

            • Tu as l'ID de l'article que tu visionnes.
            • Tu as des commentaires dont un qui t'appartient que tu souhaites modifier, chaque commentaire à un ID et sont lié par l'ID de l'article.
            • En éditant ton message tu envoies une requête en POST ou PUT contenant l'id du commentaire ainsi que l'id de l'article.
            • Tu modifies dans la BDD en recherchant le commentaire indiquer dans l'article id X avec un id Y.
            • Si ta modification est sans erreur tu renvoies sur la page de l'article id X.

            rga a écrit:

            salut,

            je croyais qu'un form ne pouvait pas être GET et POST en même temps ?

            peut-être que ça vient de là...

            Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.

            -
            Edité par xoxotf 10 décembre 2018 à 10:43:47

            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2018 à 11:46:50

              xoxotf a écrit:

              rga a écrit:

              salut,

              je croyais qu'un form ne pouvait pas être GET et POST en même temps ?

              peut-être que ça vient de là...

              Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.

              -
              Edité par xoxotf il y a 44 minutes

              ça me fait bizarre, en même temps jamais vraiment fait comme ça ;)

              Sinon, concernant la requête et les paramètres, il y a un souci d'ordre, je pense, en plus du nombre différent.
              Il faut que les paramètres suivent les "?" de la requête.
              Dans ton cas, tu en as 3 : post_id (d'ailleurs, peut-être un oubli dans ton post initial ici car je ne le vois pas), comment_id, comment_text.
              Sauf que dans ta requête MAJ, tu fais (je résume) :

              <?php
                  $sql = "UPDATE maTable SET comment = ? WHERE post_id = ?"; /* Ici, 2 paramètres attendus, comment_text et post_id */
                  $req = $sql->execute(array($comment_id, $comment, $post_id)); /* un en trop, du coup ordre non respecté => Attendu : comment_text et post_id */
              ?>

              Tu dois donc : replacer dans le bon ordre les paramètres transmis (text, post_id, comment_id) ET dans la clause WHERE, ajouter le "comment_id = ?" à la fin

              • Partager sur Facebook
              • Partager sur Twitter
              Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
                10 décembre 2018 à 15:18:34

                Bonjour,

                Qu'avez-vous dans l'url de votre page blanche ?

                Je pense que l'identifiant n'est pas transmis car dans action de votre form sur votre fichier View, ne serait-ce pas id=<?= comment['id'] ?> au lieu de id=<? comment['id'] ?> ?

                Cordialement.

                • Partager sur Facebook
                • Partager sur Twitter
                  10 décembre 2018 à 18:29:31

                  rga a écrit:

                  xoxotf a écrit:

                  rga a écrit:

                  salut,

                  je croyais qu'un form ne pouvait pas être GET et POST en même temps ?

                  peut-être que ça vient de là...

                  Si tu observes bien il récupère l'id de l'article qui se situe dans l'URL donc tout à fait normal. Tu peux très bien effectuer une requête POST sur une URL qui contient des paramètres.

                  -
                  Edité par xoxotf il y a 44 minutes

                  ça me fait bizarre, en même temps jamais vraiment fait comme ça ;)

                  Sinon, concernant la requête et les paramètres, il y a un souci d'ordre, je pense, en plus du nombre différent.
                  Il faut que les paramètres suivent les "?" de la requête.
                  Dans ton cas, tu en as 3 : post_id (d'ailleurs, peut-être un oubli dans ton post initial ici car je ne le vois pas), comment_id, comment_text.
                  Sauf que dans ta requête MAJ, tu fais (je résume) :

                  <?php
                      $sql = "UPDATE maTable SET comment = ? WHERE post_id = ?"; /* Ici, 2 paramètres attendus, comment_text et post_id */
                      $req = $sql->execute(array($comment_id, $comment, $post_id)); /* un en trop, du coup ordre non respecté => Attendu : comment_text et post_id */
                  ?>

                  Tu dois donc : replacer dans le bon ordre les paramètres transmis (text, post_id, comment_id) ET dans la clause WHERE, ajouter le "comment_id = ?" à la fin

                  En fait l'id en question est le comment_id (c'est le post_id qui manque) ... mais comment rajouter celui-ci? un where supplementaire ? and where ???



                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 décembre 2018 à 22:36:21

                    Salut,

                    ton problème c'est que tu modifies une données dans une table qui as 2 identifants (PK sur 2 id):

                    Voilà une syntaxe beaucoup plus simple à prendre en main:

                    <?php
                        $sql = "UPDATE maTable SET comment = :comment WHERE post_id = :post_id and comment_id = :comment_id";
                    	$stmt = $bdd->prepare($sql);
                    	$stmt->bindValue('comment', $comment);
                    	$stmt->bindValue('comment_id', $comment_id);
                    	$stmt->bindValue('post_id', $post_id);
                        $req = $sql->execute(); 

                    Sinon va apprendre les syntaxes de base car là tu fais une exécution sans préparation OU query(), voir cours et doc

                    • Partager sur Facebook
                    • Partager sur Twitter
                      10 décembre 2018 à 23:48:53

                      Bon j'ai essayé de suivre vos conseils : j'ai changé le lien "modifier" pour essayer de transmettre l'id du billet (postId) comme ceci :

                      <p><strong><?= htmlspecialchars($comment['author']) ?></strong> le <?= $comment['comment_date_fr'] ?>&nbsp;<a href="billetsindex.php?action=comment&amp;commentId=<?php echo 
                                  $comment['id']; ?>&amp;postId=<?php echo $post['id']; ?>">(modifier)</a></p>
                                  <p><?= nl2br(htmlspecialchars($comment['comment'])) ?></p>

                      par ailleurs j'ai respecté l'ordre dans la transmission des paramètres comme suit :

                      public function updateComment($commentId,$postId,$comment)
                      
                          {
                              $db = $this->dbConnect();
                              $comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?'); 
                              $affectedLines = $comments->execute(array($commentId,$postId,$comment));
                      
                              return $affectedLines;
                          }
                          

                      Mais toujours cette page blanche et rien de changé dans la bdd :colere2:


                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 décembre 2018 à 9:37:32

                        Tu as toujours le même problème, trois arguments alors que tu en utilises uniquement deux et toujours dans le mauvaises ordres... est-ce que tu as vu le message de @JohanVallon ? Tu POST sur une URL où tu attends un id en paramètre sauf que ça ne marchera pas puisqu'il y a une erreur de syntaxe dans ta form, tu n'as pas du débug ta requête tu t'en serais rendu compte.

                        -
                        Edité par xoxotf 11 décembre 2018 à 9:39:34

                        • Partager sur Facebook
                        • Partager sur Twitter
                          11 décembre 2018 à 11:19:55

                          christouphe a écrit:

                          Salut,

                          ton problème c'est que tu modifies une données dans une table qui as 2 identifants (PK sur 2 id):

                          Voilà une syntaxe beaucoup plus simple à prendre en main:

                          <?php
                              $sql = "UPDATE maTable SET comment = :comment WHERE post_id = :post_id and comment_id = :comment_id";
                          	$stmt = $bdd->prepare($sql);
                          	$stmt->bindValue('comment', $comment);
                          	$stmt->bindValue('comment_id', $comment_id);
                          	$stmt->bindValue('post_id', $post_id);
                              $req = $sql->execute(); 

                          Sinon va apprendre les syntaxes de base car là tu fais une exécution sans préparation OU query(), voir cours et doc


                          :-°
                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 décembre 2018 à 12:30:07

                            faisons simple et reprenons :

                            Formulaire,
                            pour éviter de te mélanger entre GET et POST (au moins pour ce sujet), utilises du type="hidden" :

                            <form action="billetsindex.php" method="post">
                                <div>
                                    <label for="comment">Commentaire</label><br />
                                    <textarea id="comment" name="comment_text"><?= nl2br(htmlspecialchars($comment['comment'])) ?></textarea>
                                </div>
                                <div>
                                    <input type="hidden" name="action" value="changeComment" />
                                    <input type="hidden" name="comment_id" value="<?php echo $comment['id']; ?>" />
                                    <input type="hidden" name="post_id" value="<?php echo $post['id']; ?>" />
                                    
                                    <input type="submit" />
                                </div>
                            </form>

                            Contrôleur  :

                            <?php var_dump($_POST); exit; ?>

                            tu dois voir apparaître tous tes champs nécessaires remplis, même les "hidden".
                            si c'est le cas, vires cette ligne et passes à la suite.

                            Model :

                            MohammedHsein a écrit:

                            par ailleurs j'ai respecté l'ordre dans la transmission des paramètres comme suit :

                            public function updateComment($commentId,$postId,$comment)
                            
                                {
                                    $db = $this->dbConnect();
                                    $comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ?'); 
                                    $affectedLines = $comments->execute(array($commentId,$postId,$comment));
                            
                                    return $affectedLines;
                                }
                                

                             As-tu fait la même modif d'ordre des paramètres dans le contrôleur qui appelle cette fonction ? 

                            Regardes la réponse de @christouphe et comment il construit la requête.

                            Là, je réécris la tienne en texte brut (au lieu de la requête mais en conservant ton ordre de transmission entre sql et array()) :

                            Modifier      `maTable` 
                            En remplaçant `comment` avec '$comment_id'
                            Où            `post_id` vaut '$post_id'
                            /*et j'ai un '$comment' à utiliser */

                            Vois-tu ton erreur ?

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
                              11 décembre 2018 à 16:35:06

                              J'ai refait la requête en essayant de suivre cet ordre de parametres et j'ai l'erreur suivante :

                              Erreur : Impossible de modifier le commentaire !

                              la requête en question :

                              public function updateComment($comment,$commentId)
                              
                                  {
                                      $db = $this->dbConnect();
                                      $comments = $db->prepare('UPDATE comments SET comment = $comment WHERE id = $commentId'); 
                                      $affectedLines = $comments->execute(array($comment,$commentId));
                              
                                      return $affectedLines;
                                  }

                              le contrôleur :

                              function changeComment($comment,$commentId)
                              
                              {
                              
                                  $commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
                                  $affectedLines = $commentManager->updateComment($comment,$commentId); 
                              
                                  if ($affectedLines === false) {
                                      // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
                                      throw new Exception('Impossible de modifier le commentaire !');
                              
                                  }
                              
                                  else {
                              
                                      header('Location: billetsindex.php?action=post&id=' . $postId);
                              
                                  }

                              Le form :

                              <form action="billetsindex.php?action=changeComment&amp;commentId=<?=$comment['id']?> " method="post">
                              
                                          
                                          <div>
                              
                                              <label for="comment">Commentaire</label><br />
                              
                                              <textarea id="comment" name="comment"><?= nl2br(htmlspecialchars($comment['comment'])) ?></textarea>
                              
                                          </div>
                              
                                          <div>
                              
                                              <input type="submit" />
                              
                                          </div>
                              
                                      </form>
                              

                              J'ai le tournis là>_<


                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 décembre 2018 à 17:30:31

                                y a du mieux.

                                maintenant, c'est juste la requête qui plante, et c'est normal.

                                Il faut que tu mettes la requête dans une variable à part, très utile en test et en prod. 

                                vu que tu galères à fond je fais simple (et pourtant c'est la base) :

                                <?php 
                                 $a = 5;
                                 echo '$a'; // quote simple => $a
                                 echo '
                                '; echo "$a"; // double quote => 5 ?>

                                Imagines que $a = '$taRequête '. Que penses-tu afficher ?

                                -
                                Edité par rga 11 décembre 2018 à 17:31:21

                                • Partager sur Facebook
                                • Partager sur Twitter
                                Winter Is Coming - Explorez le forum : votre problème a déjà dû être traité ailleurs
                                  11 décembre 2018 à 17:34:37

                                  Il binde des paramètres qui n'existent pas non plus déjà (parce des variables injectées directement dans une requête, ce n'a jamais été bon)

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    13 décembre 2018 à 12:49:54

                                    rga a écrit:

                                    y a du mieux.

                                    maintenant, c'est juste la requête qui plante, et c'est normal.

                                    Il faut que tu mettes la requête dans une variable à part, très utile en test et en prod. 

                                    vu que tu galères à fond je fais simple (et pourtant c'est la base) :

                                    <?php 
                                     $a = 5;
                                     echo '$a'; // quote simple => $a
                                     echo '
                                    '; echo "$a"; // double quote => 5 ?>

                                    Imagines que $a = '$taRequête '. Que penses-tu afficher ?

                                    -
                                    Edité par rga 11 décembre 2018 à 17:31:21

                                    Re,

                                    J'ai enfin pu récupérer ce fameux postId pour le transmettre : je le vois bien dans l'url (En fait il y avait  une omission de ce champs dans la requête sql :waw:). et réorganisé mon routeur...

                                    HALLELUYA!!!Le diable était dans le détail


                                    mon form :


                                    <form action="billetsindex.php?action=changeComment&amp;commentId=<?php echo $comment['id'] ?>&amp;postId=<?php echo $comment['post_id'] ?>" method="post">
                                    
                                                
                                                <div>
                                    
                                                    <label for="comment">Commentaire</label><br/>
                                    
                                                    <textarea id="comment" name="comment"><?= nl2br(htmlspecialchars($comment['comment'])) ?></textarea>
                                                    
                                    
                                                </div>
                                    
                                                <div>
                                    
                                                    <input type="submit" />
                                     

                                    Contrôleur :

                                    function changeComment($comment,$commentId,$postId)
                                    
                                    {
                                    
                                        $commentManager = new \OpenClassrooms\Blog\Model\CommentManager();
                                        $affectedLines = $commentManager->updateComment($comment,$commentId,$postId); 
                                    
                                        if ($affectedLines === false) {
                                            // Erreur gérée. Elle sera remontée jusqu'au bloc try du routeur !
                                            throw new Exception('Impossible de modifier le commentaire !');
                                    
                                        }
                                    
                                        else {
                                    
                                            header('Location: billetsindex.php?action=post&id=' . $postId);
                                    
                                        }
                                    
                                    
                                    



                                    model :

                                    public function updateComment($comment,$commentId,$postId)
                                    
                                        {
                                            $db = $this->dbConnect();
                                            $comments = $db->prepare('UPDATE comments SET comment = ? WHERE id = ? and post_id = ?'); 
                                            $affectedLines = $comments->execute(array($comment,$commentId,$postId));
                                    
                                            return $affectedLines;
                                        }
                                        
                                    
                                    
                                    



                                    et enfin le routeur :

                                    elseif ($_GET['action'] == 'changeComment') {
                                    
                                            if (isset($_GET['commentId']) && $_GET['commentId'] > 0) {
                                    
                                                if (!empty($_POST['comment'])) {
                                    
                                                    changeComment($_POST['comment'],$_GET['commentId'],$_GET['postId']);
                                    
                                                }
                                    
                                                else {
                                    
                                                        // Autre exception
                                    
                                                        throw new Exception('Tous les champs ne sont pas remplis !');
                                    
                                                }
                                    
                                            }
                                        }
                                    
                                    
                                    
                                    

                                    Un grand merci à ceux qui ont pu prendre le temps de poster des réponses constructives. (Ceux qui s'adressent à moi à la troisième personne ne devraient pas se donner cette peine :zorro:)



                                    -
                                    Edité par MohammedHsein 13 décembre 2018 à 13:11:57

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    comment modifier un commentaire ??!!

                                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                    • Editeur
                                    • Markdown