Problème d'ajout de commentaires PHP/mysql

Par Guizmo, il y a 6 ans


Bonjour,

Je rencontre un petit problème avec mon code car lorsque je poste un commentaire sur ma page celui-ci s'ajoute parfaitement dans ma base de données, seulement il ne s'affiche pas directement sur ma page. Est-ce que quelqu'un aurait une solution ? merci d'avance

        <?php if(isset($_SESSION['id']))
        {

            if(isset($_POST['submit_commentaire'])) {
                if(isset($_SESSION['pseudo'], $_POST['commentaire']) AND !empty($_POST['commentaire']
                )) {
                $pseudo = ($_SESSION['pseudo']);
                $commentaire = htmlspecialchars($_POST['commentaire']);

                $inserer = $bdd->prepare('INSERT INTO commentaires (pseudo, commentaire) VALUES (?,?)');
                $inserer->execute(array($pseudo,$commentaire));
                $erreur = "<span style='color: green'> Votre commentaire a bien été posté !</span>";

                } else {
                $erreur = "Tous les champs doivent être complétés !";
            }
        }

        $commentaires = $bdd->prepare('SELECT id FROM commentaires WHERE commentaire = ? ORDER BY id DESC');
        $commentaires->execute(array($_SESSION['pseudo']));

        ?>

            <form method= "POST">
            <div id="pseudo"><?php echo '<b>Pseudo : </b>' . $_SESSION['pseudo'] ?></div><br />
                <textarea name="commentaire" id="commentaire" placeholder=" Taper votre commentaire..."cols="50"rows="5"></textarea><br />
                <input type="submit" id="poster" value="Poster" name="submit_commentaire" /><br />
            </form>

            <?php
            if (isset($erreur))
            {
                ?><div id="erreur"><?php echo '<font color="red";>' . $erreur . "</font>";?></div><?php
            }?>
            <br />
            <?php while($c = $commentaires->fetch()) { ?>
                <b><?= $c = ($_SESSION['pseudo'])?>:</b> <?= $c['commentaire']; ?><br />
            <?php } ?>
        <?php } else 
        {
            ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p><?php
        }
            ?>

46 réponses

Carouge10, il y a 5 ans

il faut débugguer le cheminement et comprendre d'où viens cette boucle de redirection

Guizmo, il y a 6 ans

Le session_start(); est bien rajouté plus haut seulement j'ai fait copier/coller le code ou doit se trouver l'erreur.
Tu as sans doute raison pour la requête >>> $commentaires->execute(array($_SESSION[pseudo'])); J'avais également remplacé par [id] mais rien ne change

Carouge10, il y a 6 ans

Bonjour,
Tu fais un SELECT id mais en dessous tu demandes à afficher le champs "commentaires" or si tu ne le demandes pas dans ta requête, tu ne peux pas l'avoir, là tu as seulement l'id

Guizmo, il y a 6 ans

Salut,
Bah écoute j'ai beau bidouiller ce jolie code, c'est galère pour savoir qu'est ce qui faut rajouté..

        $commentaires = $bdd->prepare('SELECT * FROM commentaires WHERE commentaire = ? ORDER BY id DESC');
        $commentaires->execute(array($_SESSION['id']));
Carouge10, il y a 6 ans

si c'est pour afficher tour les commentaires, pas besoin de condition

Guizmo, il y a 6 ans

Tu veux dire que je dois retirer cette condition sans effacer ce qu'il y a à l'interieur ?

<?php if(isset($_SESSION['id']))
{
....
}

Guizmo, il y a 6 ans

Ah d'accord oui en effet je comprend mieux !
Super cela s'affiche maintenant sur ma page mais avec une erreur qui m'indique ! "Warning: Illegal string offset 'commentaire' dans ma ligne 123 qui correspond à : <b><?= $c = ($_SESSION['pseudo'])?>:</b> <?= $c ['commentaire']; ?><br />

Carouge10, il y a 6 ans

tu écrases ta varaibles $c avec le pseudo donc $c ne contient plus le contenu de ta table commentaires
enlèves $c = avant $_SESSION et les paranthèses autour de ce dernier

Guizmo, il y a 6 ans

Nickel merci !! J'ai retiré tout les $c et en ajoutant $_POST à [commentaire] sur ma page plus aucune erreur !
<b><?= $_SESSION['pseudo']?>:</b> <?= $_POST['commentaire']; ?><br />

Par contre un dernier soucis si je veux poster 1 commentaire différent à chaque fois cela remplace le dernier posté par la même phrases à chaque fois sur les anciens coms

Guizmo, il y a 6 ans
           D'accord j'ai pris en compte ce que tu m'as dit et j'ai rajouté le closeCursor();  
        Voilà :
            <?php while($c = $commentaire->fetch()) { ?>
                <b><?= $_SESSION['pseudo']?>:</b> <?= $c ['commentaire']; ?><br />
                <?php $commentaire->closeCursor();
             } ?>

Je peux poster un seul commentaire à la fois et a chaque fois cela le remplace

Carouge10, il y a 6 ans

bah non pas le closeCursor dans la boucle
et il faut afficher $c['pseudo'] et $_SESSION['pseudo']
et enlève ce htmlspecialchar qui devrait être dans la boucle sur $c['commentaire']. Il sert UNIQUEMENT à l'affichage

Guizmo, il y a 6 ans

Ahhh d'accord :D C'est parfait ça affiche les commentaires sans ecraser les précédents !

Guizmo, il y a 6 ans

Merci beaucoup de ton aide vraiment ça fait plaisir ! Surtout pour un débutant :)

Carouge10, il y a 6 ans

avec plaisir

Guizmo, il y a 5 ans

Bonjour, J'essaie de faire en sorte d'afficher les commentaires avec un "else" pour que la personne qui n'est pas connecté sur la page puisse voir quand même les commentaires s'afficher, seulement cela ne marche pas, j'ai quelques erreurs dans mon code et je comprend pas pourquoi.. merci si quelqu'un a quelques indices ;)

       <?php while($c = $commentaire->fetch()) { ?>
                <div class="informations_commentaires">
                    Posté par <b><?= $_SESSION['pseudo']?> </b> le <?= $c['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $c['commentaire'];?><br />
               </div>

                <?php   
             } ?>
        <?php } else 
        {
            ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p>
            <?php while($c = $commentaire->fetch()) { ?>
                <div class="informations_commentaires">
                    Posté par <b><?= ['pseudo']?> </b> le <?= $c['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $c['commentaire'];?><br />
               </div><?php
            }
        }
Carouge10, il y a 5 ans

bonjour,
il te manque rien entre = et ['pseudo']
et si le gars est connecté, tout les commentaires précédents seront écris par lui ?
du quoi c'est quoi l'intérêt de la conditon si tu affiches forcément les commentaires ?

Guizmo, il y a 5 ans

Biensur que non tout les commentaires ne seront pas écris par lui, c'était pour dire que quand l'utilisateur est connecté il peut laisser des commentaires et s'il ne l'es pas il peut avoir accès au commentaires déjà posté

Carouge10, il y a 5 ans

ba ce n'est pas ce que le code dit. (crée un nouvel utilisateur et regarde)
j'avais écrit un message déjà
concernant le dernier point, il faut juste tester si l'utlisateur est connecté pour afficher la possibilité de commenté

Guizmo, il y a 5 ans

Oui je sais aussi quand je crée un nouvel utilisateur et que je poste un nouveau commentaire cela affiche le nouveau pseudo de partout

Guizmo, il y a 5 ans

L'autre jour tu m'avais dit de mettre $c['pseudo'] et $_SESSION['pseudo'] sauf que cela plante

Carouge10, il y a 5 ans

alors, je croyais que ça ne saurais pas le cas ????

Guizmo, il y a 5 ans

Si je met $_SESSION['pseudo'] cela marche parfaitement et en rajoutant $c['pseudo'] AND $_SESSION['pseudo'] cela plante

Carouge10, il y a 5 ans

non, il faut juste $c['pseudo'], c'est lui qui contient le pseudo correspondant aux messages qu'on affiche

Guizmo, il y a 5 ans

Ah oui en effet quand on crée un nouveau compte c'est bizzare que cela poste pas des commentaires avec des pseudos différents, cela affiche le même pseudo même sur ceux posté avec d'autres pseudos

Carouge10, il y a 5 ans

parque ce tu affichais à $_session au lieu de $c

Guizmo, il y a 5 ans

hinnnnnnn d'accord bah oui c'est logique fallait remplacer $c par >> $_SESSION de partout, c'est vraiment tout con dès fois xD

Carouge10, il y a 5 ans

non l'inverse, remplcer $_session par $c dans l'affichage des commentaires

Guizmo, il y a 5 ans

Euh oui pardon ^^ Par contre quand j'actualise ma page le commentaire se rajoute à chaque fois

Carouge10, il y a 5 ans

Voilà pourquoi je redigire toujours après avoir insérer un message, ça vide $_POST et évide ce genre de problème

Guizmo, il y a 5 ans

Oui j'ai essayé avec un header('Location: .php'); seulement j'ai une erreur ( ! ) Warning: Cannot modify header information - headers already sent by

Carouge10, il y a 5 ans

la fonction header doit être utiliser avant le < !doctype>, il ne dois pas y avoir de code html avant

Guizmo, il y a 5 ans

D'accord je pensais qu'on pouvait l'insérer dans le html, avant le !doctype j'ai mis header('Location: gateaux.php'); exit; cela m'indique "Cette page ne fonctionne paslocalhost vous a redirigé à de trop nombreuses reprises."

Guizmo, il y a 5 ans

Pour en revenir à l'affichage des commentaires qui s'affichent même si l'on est pas connecté pour l'instant j'ai mis en place ceci >>>

            <?php while($_SESSION = $commentaire->fetch()) { ?>
                <div class="informations_commentaires">
                    Posté par <b><?= $_SESSION['pseudo']?> </b> le <?= $_SESSION['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $_SESSION['commentaire'];?><br />
               </div>

                <?php   
             } ?>
        <?php } else 
        {
            ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p>
                <?php 
                $commentaire = $bdd->prepare('SELECT * FROM commentaires ORDER BY id');
                $commentaire->execute(); ?>
                <div class="informations_commentaires">
                    Posté par <b><?= ['pseudo']?> </b> le <?= ['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= ['commentaire'];?><br />
            <?php
        }
            ?>
Carouge10, il y a 5 ans

et je pari que ça ne fonctionne pas....
oula la c'est sur que tu vas avoir de gros problème.....
c'est quoi l'intéret de charger la session avec les commentaires??? car du coup le dernier commentaire écrasera aussi tout ce que tu as mis en session donc le pseudo de l'utilisateur qui consulte le site

Guizmo, il y a 5 ans

Comment ta deviné que ça marchait pas XD lol
Ben je teste le code après je pensais bien faire en faisant $commentaire = $bdd->prepare('SELECT * FROM commentaires ORDER BY id');
$commentaire->execute(); ?>

Pour que cela récupère les commentaires et j'ai un message ( ! ) Notice: Array to string conversion

Guizmo, il y a 5 ans

J'ai pensé à mettre ma boucle : ?php while($_SESSION = $commentaire->fetch()) { ?>...... ailleurs mais cela me crée pleins d'erreur également

Carouge10, il y a 5 ans

pas ailleurs mas remplacer $_session par $c .... comme c'était avant

Guizmo, il y a 5 ans

Dans cette configuration là ?

       <?php while($c = $commentaire->fetch()) { ?>
                <div class="informations_commentaires">
                    Posté par <b><?= $c['pseudo'];?> </b> le <?= $c['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $c['commentaire'];?><br />
               </div>

                <?php   
             } ?>
        <?php } else 
        {
            ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p>
                <div class="informations_commentaires">

                    Posté par <b><?= $c['pseudo'];?> </b> le <?= $c['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $c['commentaire'];?><br />
               </div>
            <?php
        }
Carouge10, il y a 5 ans

c'est déjà mieux.
Dans le else, tu ne devrais pas avoir de commentaire à afficher
Tu devrais avoir une structure de cette façon :

  • Affichage des commentaires
  • Si utilisateur connecté
    -- Affichage du formulaire pour poster un commentaire
  • Sinon
    -- Afichage du message pour que l'utilisateur se connecte
Guizmo, il y a 5 ans

Oui en effet c'est le schéma a respecté seulement quand je place l'affichage des commentaires ailleurs j'ai des erreurs alors ou faudrait-il le placer ?

Carouge10, il y a 5 ans

montre moi la partie complète de l'affichage des commentaires, c'est à dire avec le if

Guizmo, il y a 5 ans

Voilà la structure de mon code :

      <?php if(isset($_SESSION['id']))
        {

            if(isset($_POST['submit_commentaire'])) {
                if(isset($_SESSION['pseudo'], $_POST['commentaire']) AND !empty($_POST['commentaire']
                )) {
                $pseudo = ($_SESSION['pseudo']);
                $commentaire = htmlspecialchars($_POST['commentaire']);

                $inserer = $bdd->prepare('INSERT INTO commentaires (pseudo, commentaire) VALUES (?,?)');
                $inserer->execute(array($pseudo,$commentaire));
                $envoie = "Votre commentaire a bien été posté !";

                } else {
                $erreur = "Tous les champs doivent être complétés !";
            }
        }

        $commentairesParPage = 5;
        $commentaireTotalsReq = $bdd->query("SELECT id FROM commentaires");
        $commentaireTotals = $commentaireTotalsReq->rowCount();
        $pageCourante = $_GET['page'];
        $pageTotales = ceil($commentaireTotals/$commentairesParPage);

        if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pageTotales)
        {
            $_GET['page'] = intval($_GET['page']);
        } else {
            $pageCourante = 1;
        }

        $depart = ($pageCourante-1)*$commentairesParPage;

        $commentaire = $bdd->prepare('SELECT * FROM commentaires ORDER BY id DESC LIMIT '.$depart.','.$commentairesParPage);
        $commentaire->execute();
        ?>

            <form method= "POST">
            <div id="pseudo"><?php echo '<b>Pseudo : </b>' . $_SESSION['pseudo'] ?></div><br />
                <textarea name="commentaire" id="commentaire" placeholder=" Taper votre commentaire..."cols="50"rows="5"></textarea><br />
                <input type="submit" id="poster" value="Poster" name="submit_commentaire" /><br />
            </form>

            <?php
            if (isset($envoie))
            {
                ?><div id="envoie"><?php echo '<font color="green";>' . $envoie . "</font>";?></div><?php
            }
            if (isset($erreur))
            {
                ?><div id="erreur"><?php echo '<font color="red";>' . $erreur . "</font>";?></div><?php
            }

            for($i=1;$i<=$commentaireTotals; $i++) {
                if($i == $pageCourante)
                {
                    echo $i. ' '; 
                } else {
                    echo'<a href="gateaux.php?page=' .$i. '">'.$i.'</a> ';  
                }
            }

            ?>
            <br />
            <?php while($c = $commentaire->fetch()) { ?>
                <div class="informations_commentaires">
                    Posté par <b><?= $c['pseudo'];?> </b> le <?= $c['date_commentaire'];?>
                </div>
               <div class="commentaires">
                   <?= $c['commentaire'];?><br />
               </div>

                <?php   
             } ?>
        <?php } else 
        {
            ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p>
            <?php
        }
            ?>
Carouge10, il y a 5 ans

Plus qu'à tester et comparer à ton code pour étudier

<?php if(isset($_SESSION['id'])) { if(isset($_POST['submit_commentaire'])) { if(!empty($_SESSION['pseudo']) AND !empty($_POST['commentaire'])) { $pseudo = $_SESSION['pseudo']; $commentaire = $_POST['commentaire']; $inserer = $bdd->prepare('INSERT INTO commentaires (pseudo, commentaire) VALUES (?, ?)'); if($inserer->execute(array($pseudo, $commentaire))) $envoie = "Votre commentaire a bien été posté !"; else $erreur = "Commentaire non posté !"; } else { $erreur = "Tous les champs doivent être complétés !"; } if (isset($envoie)) { echo '<div id="envoie"><font color="green">' . $envoie . "</font></div>"; } if (isset($erreur)) { echo '<div id="erreur"><font color="red">' . $erreur . "</font></div>"; } } } $commentairesParPage = 5; $commentaireTotalsReq = $bdd->query("SELECT id FROM commentaires"); $commentaireTotals = $commentaireTotalsReq->rowCount(); $pageTotales = ceil($commentaireTotals/$commentairesParPage); if( !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pageTotales) { // $_GET['page'] = intval($_GET['page']); $pageCourante = intval($_GET['page']); } else { $pageCourante = 1; } $depart = ($pageCourante-1)*$commentairesParPage; $commentaire = $bdd->prepare('SELECT * FROM commentaires ORDER BY id DESC LIMIT '.$depart.','.$commentairesParPage); $commentaire->execute(); while($c = $commentaire->fetch()) { ?> <div class="informations_commentaires"> Posté par <b><?= $c['pseudo'];?> </b> le <?= $c['date_commentaire'];?> </div> <div class="commentaires"> <?= htmlspecialchars($c['commentaire']);?><br /> </div> <?php } // Afficage du formulaire que si connecté if(!empty($_SESSION['id'])){ ?> <form method= "POST"> <div id="pseudo"><?php echo '<b>Pseudo : </b>' . $_SESSION['pseudo'] ?></div> <textarea name="commentaire" id="commentaire" placeholder=" Taper votre commentaire..." cols="50" rows="5"></textarea> <input type="submit" id="poster" value="Poster" name="submit_commentaire" /> </form> <?php } else { ?><p class="phrase_connectezVous">Connectez-vous pour pouvoir laisser votre message !<p> <?php } // Pagination for($i=1;$i<=$commentaireTotals; $i++) { if($i == $pageCourante) { echo $i. ' '; } else { echo'<a href="gateaux.php?page=' .$i. '">'.$i.'</a> '; } }
Guizmo, il y a 5 ans

C'est bien ce qu'il me semblait j'avais essayé de placer le code plus ou moins comme tu l'as fait, seulement j'avais des erreurs qui étaient sûrement liées à des parenthèses mal placés ou autres, merci cela m'a permis de comprendre d'ou venait mes erreurs !

Carouge10, il y a 5 ans

avec plaisir, passe ton sujet en résolu

Guizmo, il y a 5 ans

Yes merci pour tout !