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


Guizmo
Auteur
Réponse acceptée

Yes merci pour tout !

Guizmo
Auteur

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

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
Auteur

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']));

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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 />

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
Auteur

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
Auteur
           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

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
Auteur

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

Guizmo
Auteur

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

avec plaisir

Guizmo
Auteur

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
            }
        }

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
Auteur

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é

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
Auteur

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
Auteur

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

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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

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

Guizmo
Auteur

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."

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

Guizmo
Auteur

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
        }
            ?>

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
Auteur

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
Auteur

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

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

Guizmo
Auteur

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
        }

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
Auteur

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 ?

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

Guizmo
Auteur

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
        }
            ?>

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
Auteur

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 !

avec plaisir, passe ton sujet en résolu