Système de commentaires

Résolu
Bonjour,
voila je voudrais insérer une zone dans laquelle les visiteurs de mon site pourraient laisser leurs commentaires.
je vous explique un peu: sur mon site on peut retrouver les valeurs de 265 actions!

Il s'agit d'un bête système en php:

pour la page de l'action AXA par exemple, l'adresse est la suivante: ?page=action&action=AXA (CS)
pour la page FORTIS: ?page=action&action=FORTIS (FORB)
...

J'aimerais faire en sorte que chaque utilisateur puisse laisser son commentaire et que ceux-ci soient stockés dans une base de donnée, donc l'id du com sera, je pense, lié avec l'id de l'action!

Avez-vous une idée de comment je pourrais faire cela?

Merci,

John
Configuration: Windows 7
Firefox 3.5.6

28 réponses

Résumé de la discussion

Le sujet porte sur l'ajout d'une zone de commentaires sur un site PHP, dont chaque message doit être lié à une action via son identifiant et stocké dans une base de données. Des propositions visent à créer une colonne action dans la table, utiliser l'identifiant de l'action et des requêtes INSERT/SELECT sécurisées, et corriger les noms de champs et les valeurs postées. Plusieurs réponses évoquent des erreurs possibles comme des noms de champs incohérents, des redirections après envoi, ou des erreurs d'en-têtes, et préconisent l'usage de fetch et de PDO. En cas de besoin, il convient d'harmoniser les noms des champs (pseudo, commentaire, action_id, date), d'utiliser une date calculée et d'afficher les commentaires par emplacement tout en sécurisant le contenu.

Bobot (l’IA à votre service)
  1. <?php
    try
    {
    $bdd->query('SELECT * FROM comment WHERE action_id= '.$bdd->quote($action_id));
    while($donnees = $requete->fetch(PDO::FETCH_OBJ))
    {
    echo $donnees->pseudo;
    echo '<p>'.$donnees->comment.'</p>';
    }

    } catch(PDOException $e)
    {
    echo 'Erreur N°'.$e->getCode().'<br/>'.$e->getMessage();
    }

    ?>

    ai essayé avec try et il ne me renvoi aucune erreur non plus...

    Quelqu'un a une idée?
    1. $bdd->query('SELECT * FROM comment WHERE action_id= '.$bdd->quote($action_id));
      while($donnees = $requete->fetch(PDO::FETCH_OBJ))
      {
      echo $donnees->pseudo;
      echo '<p>'.$donnees->comment.'</p>';
      }

      Voila ca ca marche, du moins cela s'exécute mais il ne m'affiche rien au final.
      1. Ca ne fonctionne pas non plus, alors j'ai essayé çà:

        <?php //ici j'affiche les commentaires, ou du moins, j'essaye de les afficher :D
        $bdd->query('SELECT * FROM comment WHERE action_id= '.$bdd->quote($action_id));
        while($donnees = $requete->fetch(PDO::FETCH_OBJ)
        {
        echo $donnees->pseudo;
        echo '<p>'.$donnees->comment.'</p>';
        }
        ?>

        Mais pareil, ca ne va pas.
        1. Contributeur
          enleve le ;

          $req = mysql_query($sql) or die ('Erreur SGL ! <br />'.$sql.'<br />'.mysql_error());
          1. Me revoila :s

            Voila j'ai essayer de faire l'affiche avec ec qui avait été dit tout au début de ce topic, mais cela ne fonctionnait pas; j'ai donc essayé ceci:

            <?php //ici j'affiche les commentaires, ou du moins, j'essaye de les afficher :D
            $sql="SELECT * FROM comment WHERE action_id=$action_id";
            $req = mysql_query($sql) or die ('Erreur SGL ! <br />'.$sql.'<br />'.mysql_error());
            while ($data=mysql_fetch_assoc($req);){
            echo $data["pseudo"];
            echo <p>{$data["comment"]} </p>;
            }
            ?>

            Merci
            1. Un grand merci :D
              C'est nickel!

              Merci à vous pour votre aide :)
              1. PDO n'est pas très bavare, essaye en affichant proprement les erreurs avec la structure "try { .... } catch() { ... }"
                try {
                	$sql = 'INSERT INTO `comment` SET '.
                		'pseudo = :pseudo, '.
                		'comment = :comment, '.
                		'action_id = :action_id, '.
                		'date = :date';
                
                	$requete = $bdd->prepare($sql);
                	$requete->execute(array(
                		':pseudo' => $pseudo,
                		':comment' => $comment,
                		':action_id' => $action_id,
                		':date' => $date
                	));
                } catch(PDOException $e) {
                	echo 'Erreur N°'.$e->getCode().'<br/>'.$e->getMessage();
                }
                header('Location: ' . $_SERVER['HTTP_REFERER']);;
                1. graffix: Fatal error: Call to a member function prepare() on a non-object on line 3

                  avion-f16: c'est bien le problème, il ne me signifie aucune erreur. Ca se passe exactement comme si le script avait fonctionné, mais il n'y a rien d'enregistré dans la table.
                  1. Contributeur
                    t' es dur avec moi avion, j' essayais de t' impressionner la XD
                    1. ;-)
                      T'inquiètes, je ne connaisssais pas cette technique, mais j'ai vite demander à mon pote Google et il m'a dit que cette technique existe :)
                  2. Contributeur
                    $requete = "INSERT INTO 'comment' (pseudo,comment,action_id,date) VALUES (:pseudo,:comment,:action_id,:date)";
                    $q = $conn->prepare($requete);
                    $q->execute(array(':pseudo'=>$pseudo, ':comment'=>$comment, ':action_id'=>$action_id, ':date'=>$date));

                    essaie comme ca
                  3. Tu as quelle erreur ?
                    Quelque-chose du style "The headers are already sent" ?
                    1. <?php

                      $requete = $bdd->prepare('INSERT INTO `comment` SET pseudo = :pseudo, comment = :comment, action_id = :action_id, date = :date')or die(mysql_error());

                      header('Location: ' . $_SERVER['HTTP_REFERER'] );

                      ?>

                      Pareil avec ce script.
                      je suis désolé de vous embêter avec çà, mais je comprend vraiment pas ce qui cloche.

                      J'ai également changé le "name" de mon formulaire pour le contenu qui est devenu comment au lieu de contenu.
                      1. En passant, ça fait plaisir de voir PDO :)
                        Les espaces étaient sans doute pour la lisibilité du script.
                        1. Contributeur
                          C' est normal tout ces ecart de ligne???

                          T' a plein de petites fautes, pas de virgules apres :date par exemple, enfin tiens.

                          <?php
                          $requete = $bdd->prepare('INSERT INTO `comment` SET pseudo = :pseudo, comment = :comment, action_id = :action_id, date = :date')or die(mysql_error());
                          1. Ok, maintenant il ne me met plus d'erreur et me redirige correctement vers la page précédente sauf qu'il n'a pas enregistrer les infos dans la table!

                            Bon vais essayer d'être un peu plus clair :)

                            J'ai un formulaire sur ma page A:

                            <form action="addcom.php" method="post"></p>
                            <div align="justify">Pseudo:
                            <input type="text" name="pseudo" value=" <?php echo $_SESSION['pseudo'] ?>" readonly="readonly" />
                            <br />
                            <br />
                            <textarea aligne="center" name="contenu" style="width:97%; height:150px"></textarea>
                            <input type="submit" value="Envoyer mon commentaire." />
                            <input type="hidden" name="date" value="on s'en fout pour le moment">
                            <input type="hidden" name="action_id" value="<?php echo $donnees->action_id; ?>">
                            </form>

                            Voici le script de addcom.php:

                            <?php
                            $requete = $bdd->prepare('
                            INSERT INTO `comment` SET

                            pseudo = :pseudo,
                            comment = :comment,
                            action_id = :action_id,
                            date = :date,
                            ');

                            $requete->bindValue(':pseudo', $_POST['pseudo']);
                            $requete->bindValue(':comment', $_POST['comment']);
                            $requete->bindValue(':action_id', $_POST['action_id']);
                            $requete->bindValue(':date', $_POST['date']);

                            $requete->execute();

                            header('Location: ' . $_SERVER['HTTP_REFERER'] );
                            ?>

                            Donc il me redirige correctement mais ne m'enregistre rien dans la table.
                            1. <?php
                              $requete = $bdd->prepare('
                              INSERT INTO `comment` SET
                              
                              pseudo = :pseudo,
                              comment = :comment,
                              action_id = :action_id,
                              date = :date,
                              ') <= ICI
                              1. Bien vu, j'ai corrigé mais le problème se situait au niveau de la ligne 12, donc la ligne juste au dessus!
                                1. $requete->bindValue(':comment', $_POST['comment'])); 

                                  Il y a une parenthèse ")" de trop.
                                  1. <?php
                                    $requete = $bdd->prepare('
                                    INSERT INTO `comment` SET

                                    pseudo = :pseudo,
                                    comment = :comment,
                                    action_id = :action_id,
                                    date = :date,

                                    ')

                                    $requete->bindValue(':pseudo', $_POST['pseudo']);
                                    $requete->bindValue(':comment', $_POST['comment']));
                                    $requete->bindValue(':action_id', $_POST['action_id']);
                                    $requete->bindValue(':date', $_POST['date']);

                                    ?>

                                    Voila ce que contient ma page addcom.php
                                    A savoir que les paramètres de connexion sont automatiquement pris en compte grace à une page index.php

                                    Lorsque j'écris mon commentaire et que je clique sur le bouton envoyer, il me met:

                                    Parse error: syntax error, unexpected T_VARIABLE on line 12
                                    • 1
                                    • 2