Bonsoir,

J'ai passé ma soirée/nuit à essayé de mettre en place un système me permettant de répondre au commentaire d'un internaute (un peut comme le système de réponse de grafikart).

J'ai une table commentaires contenant plusieurs champs dont "l'id" general (en auto-incrementation), l'id article (correspondant à l'article auquel le commentaire est associé), et id_reponse (qui est égal à "l'id" general).

J'ai déjà paramétré toute mes conditions et fais les bonnes requetes sql comme ceci:

<!-- On sélectionne les commentaires depuis la bdd -->
    <?php 
        $req = $bdd->prepare('SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse=0 ORDER BY commentaires.id DESC');
        $req->execute();
        while($data = $req->fetch()):
        $reponse = $data'id'];
    ?>
                <!-- Partie HTML -->
                <COMMENTAIRE PRINCIPALE <?php echo $reponse ?> >

            <!-- On selectionne les réponses depuis la bdd et on les place au bon endroit -->
            <?php 
                $req2 = $bdd->prepare('SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse='.$data'id'].' ORDER BY commentaires.id');
                $req2->execute();
                while($data2 = $req2->fetch()):
            ?>
            <!-- Partie HTML -->
            <REPONSE COMMENTAIRE...>
            <?php
            endwhile;
            $req2->closeCursor();
            ?>

    <?php
    endwhile;
    $req->closeCursor();
    ?>

Lorsque je change manuellement les valeurs de

commentaires.id_articles

en dur, exemple:

commentaires.id_articles=63

et que je rédige une réponse, ça fonctionne, cette réponse est placé sous le commentaire principale et j'ai bien tout les id de tout les commentaires qui s'affiche.

Ceci étant, j'aimerais que la valeur (ici pour l'exemple: '63') soit rajoutée de façon dynamique, lorsque je click sur un lien "répondre" (donc sans rechargement de page, pouvoir stocker quelques part l'id puis l'inséré dans le champs id_article au submit du formulaire...

J’espère avoir été clair...
Pourriez-vous éclairer ma lanterne? merci

Sur ce je vais dodo je n'en peux plus ><

6 réponses


Shakuro
Auteur
Réponse acceptée

Merci beaucoup pour tes réponses elles m'ont aidés à me mettre sur la bonne voie.

J'ai fais comme ceci:

<a href="#label_input" onclick="replycomment('<?php echo $data'id'];?>');>Repondre</a>

Je déclare une fonction "replycomment" avec pour objet l'id du commentaire principale.

function replycomment(obj){
        $reply = $("#reply").val(obj);
    };

J'appel la fonction qui rajoute à #reply la valeur de l'objet (soit l'id du commentaire).

<input type="hidden" name="reply" value="0" id="reply">

Cette valeur est stockée dans un input type hidden qui est par défaut à "0".

$reply = strip_tags($_POST'reply']);

Je fais passer par POST ma valeur lors du submit.

if($valid)
    {
        if ($_POST'reply'] = 0) 
        {
            $req2 = $bdd->prepare('INSERT INTO commentaires (pseudo, email, website, contenu, id_articles) VALUES (:pseudo, :email, :website, :commentaire, :idarticles)');
            $req2->execute(array(':pseudo'=>$pseudo, ':email'=>$email, ':website'=>$web, ':commentaire'=>$commentaire, ':idarticles'=>$idarticles));
            $req2->closeCursor();

            unset($pseudo);
            unset($commentaire);

            echo '<script language="Javascript">document.location.replace("...");</script>';
        }
        else 
        {
            $req2 = $bdd->prepare('INSERT INTO commentaires (pseudo, email, website, contenu, id_articles, id_reponse, pseudo_reponse) VALUES (:pseudo, :email, :website, :commentaire, :idarticles, :idreponse, :pseudoreponse)');
            $req2->execute(array(':pseudo'=>$pseudo, ':email'=>$email, ':website'=>$web, ':commentaire'=>$commentaire, ':idarticles'=>$idarticles, ':idreponse'=>$reply, ':pseudoreponse'=>$pseudoreply));
            $req2->closeCursor();

            unset($pseudo);
            unset($commentaire);

            echo '<script language="Javascript">document.location.replace("...");</script>';        
        }
    }
}

Et enfin je vérifie que le champ dont le nom est "reply" (input hidden) n'est pas de valeur égal à 0 (soit la valeur par défault), si c'est le cas je lance une requête qui poste un commentaire standard. Sinon, c'est une autre requête qui elle poste la réponse du commentaire dont l'id à été inséré dans le champs id_reponse.

Pour ce qui est de l'affichage :

<!-- On sélectionne les commentaires standards depuis la bdd -->
    <?php 
        $req = $bdd->prepare('SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse=0 ORDER BY commentaires.id DESC');
        $req->execute();
        while($data = $req->fetch()):
        $avatar = "http://www.gravatar.com/avatar/".md5($data'email'])."?s=64&d=http://peexstudio.fr/perso/notation/img/avatar.gif";
    ?>      
<STRUCTURE HTML DU COMMENTAIRE>
            <!-- On selectionne les réponses des commentaires depuis la bdd et on les place au bon endroit -->
            <?php 
                $req2 = $bdd->prepare('SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse='.$data'id'].' ORDER BY commentaires.id');
                $req2->execute();
                while($data2 = $req2->fetch()):
                $avatar = "http://www.gravatar.com/avatar/".md5($data2'email'])."?s=64&d=http://peexstudio.fr/perso/notation/img/avatar.gif";
            ?>
<STRUCTURE HTML DE LA REPONSE DU COMMENTAIRE>
            <?php
            endwhile;
            $req2->closeCursor();
            ?>
    <?php
    endwhile;
    $req->closeCursor();
    ?>

Je parcours ma table commentaire avec des boucles, l'une des requêtes vérifie la présence de "0" dans le champ: id_reponse et génère du contenu html.
Et l'autre vérifie le contenu de id_reponse, et génère aussi du contenu html en comparant id_reponse et id; les deux doivent correspondre sinon la requête ne génère rien.

Enfin j'ai un peut détailler, cela pourra peut être aider certaines personnes :)

Bonne nuit et merci!

Hello :)

Pour ton cas, je mettrais un champ de type "hidden" avec l'id_commentaire au chargement du commentaire (ou en session etc etc)...

et quand tu fais ton insert, tu récupères la valeur de ton champ "hidden" et basta :)

Shakuro
Auteur

Salut Vash,

Merci d'avoir prit le temps de répondre à mon problème. Je n'ai pas été très clair donc je vais réitéré ma question.

J'ai deux requetes SQL différentes:

SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse=0 ORDER BY commentaires.id DESC
  • L'une vérifie que le champs id_reponse soit égale à 0 si telle est le cas, c'est considéré comme un commentaire standard (non une réponse).

    SELECT * FROM commentaires WHERE commentaires.id_articles='.$id_article_get.' AND commentaires.id_reponse='.$data'id'].' ORDER BY commentaires.id

  • L'autre fait la même vérification de id_reponse mais que ce champ est une valeur égale à l'id principale du commentaire qui s'y raccorde (qui s'auto-incrémente), si ce cas se présente, c'est considéré comme une réponse et le bloc html est inséré sous le commentaire standard (voir code du poste précédent).

La petite subtilité, *j'ai oublié de le précisé* c'est que j'ai un bouton du type: "repondre" sur chaque commentaire qui se trouve dans la boucle parcourant toute ma table "commentaires", donc un id différent par commentaire, et ce bouton ne me sert pas qu'à "répondre" à proprement parlé mais il dispose aussi d'une redirection de type #ancre qui mène sur le formulaire.

Mon raisonnement actuelle :

Il faudrait que je puisse injecter dans un champs caché la valeur de l'id (venant du bouton répondre). Ensuite au "submit" je fais une vérification par condition du type si la variable $reply est vide alors tu me lance une requête sinon tu m'en lance une autre.

Exemple, dans le champ input:

<input type="hidden" name="reply" value="<?php echo $reply;?>" >

Dans la partie php au submit du formulaire:

if($valid)
    {
        if ($reply == '') 
        {
            $req2 = $bdd->prepare('INSERT INTO commentaires (pseudo, email, website, contenu, id_articles) VALUES (:pseudo, :email, :website, :commentaire, :idarticles)');
            $req2->execute(array(':pseudo'=>$pseudo, ':email'=>$email, ':website'=>$web, ':commentaire'=>$commentaire, ':idarticles'=>$idarticles));
            $req2->closeCursor();

            unset($pseudo);
            unset($commentaire);

            echo '<script language="Javascript">document.location.replace("...");</script>';
        }
        else 
        {
            $req2 = $bdd->prepare('INSERT INTO commentaires (pseudo, email, website, contenu, id_articles, id_reponse) VALUES (:pseudo, :email, :website, :commentaire, :idarticles, :reply)');
            $req2->execute(array(':pseudo'=>$pseudo, ':email'=>$email, ':website'=>$web, ':commentaire'=>$commentaire, ':idarticles'=>$idarticles, ':reply'=>id));
            $req2->closeCursor();

            unset($pseudo);
            unset($commentaire);

            echo '<script language="Javascript">document.location.replace("...");</script>';        
        }
    }

Ici la deuxieme requête INSERT aussi dans le champs "id_reponse" l'id du commentaire auquel il se raccorde, comme ça il sera placé correctement.

Voila comment je raisonne c'est peut être pas la bonne technique, probablement car je ne parviens pas à faire cela étant donné qu'on demande à ce que des valeurs soit récupérés dynamiquement alors qu'il s'agit là de php... J'ai bien essayé avec AJAX mais en vain, je ne m'y connais pas trop :(

Salut,
si j'ai bien compris, tu veux changer la valeur d'un champ hidden name="reply" selon le bouton que l'on a cliqué.
je pense qu'une tite fonction javascript ferait l'affaire onclick="changereplyvalue(valeur_a_transmettre)"
dans ton formulaire, tu donne un id a ton champ hidden (ex : idreplyinput).
et dans ta fonction javascript, utilise un getelementbyid, pour assigner une nouvelle valeur.

par aillleurs, j'ai deux remarques:
ligne 6, tu fais $reponse = $data'id']; et tu utilise un coup $reponse (ligne9) et un coup $data'id'] (ligne 13).
ca marche, c'est sur, mais autant utiliser partout la meme variable, c'est plus simple a relire

l'autre chose : tu dois pouvoir regrouper tes deux requetes en une seule avec une jointure . ca évite de faire une requête pour les commentaires qui n'ont pas de reponse.
Eric

Shakuro
Auteur

Coucou erfou merci pour ta réponse,

Erfou à dit :

Si j'ai bien compris, tu veux changer la valeur d'un champ hidden name="reply" selon le bouton que l'on a cliqué.

Les boutons sont tous les mêmes, ils sont créés autant de fois qu'il y a de commentaire (boucle while qui parcours ma table), si je place un <?php echo $data'id']; ?> dans le bouton, je vais avoir l'id sur chaque bouton:

exemple: ICI

sur mon exemple on voit clairement les id au niveau des boutons et une réponse en bas, j'ai inséré manuellement la valeur de l'id du commentaire du dessus ( 69 ). Et ça ma correctement placé le commentaire en tant que réponse (grâce à ma requête qui vérifie que id_reponse = id).

Le problème c'est que j'aimerais récupéré l'id au clic, et l’insérer dans ma table au submit uniquement... Sachant que chaque bouton correspond à un champ de ma table et donc un id différent !

sur chaque bouton, tu peux mettre une fonction javascript qui va modifier la valeur du champ input
qqc du style

<input type="submit" value="Repondre " onClick="document.getElementById(\'id_du_champ_hidden\').value = '.$value.';">

ou alors j'ai pas compris ta question