Bonjour,

Je suis actuellement en train de créer un blog.

Actuellement j'ai la page index avec la liste des articles. Puis quand je clique sur le titre d'un article, je suis redirigé sur la page article ( avec son id correspondant ) : l'article s'y trouve et en fin de cette page il y a l'affichage et l'ajout de commentaires.

J'aimerais pouvoir sur la page index, en dessous de chaque article, un lien '' Il y a x commentaires " et quand on clique dessus, la liste des commentaires s'affiche ( sois en dessous, sois dans une pop-up ) avec l'ajout du formulaire .

Le but est de tout regrouper sur la page index et de supprimer la page article.

Code de Index.php

<?php
session_start();
?>
<body>
<?php
if(!isset($_SESSION['role']) OR $_SESSION['role'] != 1)
{ include("Vue/menu.php");} else {
  include("Vue/menuadmin.php");}
?>

    <div class="row"><br><br>
    </div>
        <div class="row">
        <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>
        <div class="col-xs-8 col-sm-8 col-md-8 col-lg-8 ">

<?php
                $bdd = new PDO('mysql:host= ;dbname= ;charset=utf8', ' ',' ');
                $articles = $bdd->query('SELECT titre,contenu FROM articles ORDER BY id DESC');
                if(isset($_GET['q']) AND !empty($_GET['q'])) {
                    $q = htmlspecialchars($_GET['q']);
                    $articles = $bdd->query('SELECT titre, contenu FROM articles WHERE titre LIKE "%'.$q.'%" ORDER BY id DESC');             }
?>

                <?php

                $messagesParPage=5;
                $bdd = new PDO('myxx');
                $articles = $bdd->query('SELECT * FROM articles ORDER BY date_time_publication DESC');
                $retour_total=$bdd->query('SELECT COUNT(*) AS total FROM articles');

            while($donnees_total = $retour_total->fetch())  //On range retour sous la forme d'un tableau.
                $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
                //Nous allons maintenant compter le nombre de pages.
                $nombreDePages=ceil($total/$messagesParPage);
                if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
                {
                     $pageActuelle=intval($_GET['page']);

                     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
                     {
                          $pageActuelle=$nombreDePages;
                     }
                }
                else // Sinon
                {
                     $pageActuelle=1; // La page actuelle est la n°1   
                }
$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire
// La requête sql pour récupérer les messages de la page actuelle.
$retour_messages=$bdd->query('SELECT * FROM articles ORDER BY id DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');
while($donnees_messages = $retour_messages->fetch())  // On lit les entrées une à une grâce à une boucle
{
            echo'
            <div class="article">
             <ul>
              <li>
              <a href="article.php?id='.$donnees_messages['id'] .'">
              '.$donnees_messages['titre'] .'</a>
              </li>
              </ul>

              <br><br><ul>
              <li>
              '.$donnees_messages['contenu'] .'
              <img src="photos/separation.png"></li>
              </ul>
              <a href="">Il y a '.$commentaires.' commentaires . </a>
              </div>
              ';   
 }                                  
echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
{
     //On va faire notre condition
     if($i==$pageActuelle) //Si il s'agit de la page actuelle...
     {
         echo ' [ '.$i.' ] ';
     } 
     else //Sinon...
     {
          echo ' <a href="index.php?page='.$i.'">'.$i.'</a> ';
     }
}   
              ?>

              </div>
              <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>

    </div>
    <?php include("Vue/footer.php"); ?>
</div>
</body> 
</html>

article.php :

<?php
session_start();
?>
    <body>
   <?php
if(!isset($_SESSION['role']) OR $_SESSION['role'] != 1)
{ include("Vue/menu.php");} else {
   include("Vue/menuadmin.php");}
   ?>
    <div class="row">
        <br><br>
    </div>

        <div class="row">
      <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>
      <div class="col-xs-8 col-sm-8 col-md-8 col-lg-8 ">
      <div class="article">

<?php
$bdd = new PDO('mysql:host=;dbname=;charset=utf8', '','');
if(isset($_GET['id']) AND !empty($_GET['id'])) {
   $getid = htmlspecialchars($_GET['id']);
   $article = $bdd->prepare('SELECT * FROM articles WHERE id = ?');
   $article->execute(array($getid));
   $article = $article->fetch();
   if(isset($_POST['submit_commentaire'])) {
      if(isset($_POST['pseudo'],$_POST['commentaire']) AND !empty($_POST['pseudo']) AND !empty($_POST['commentaire'])) {
         $pseudo = htmlspecialchars($_POST['pseudo']);
         $commentaire = htmlspecialchars($_POST['commentaire']);
         if(strlen($pseudo) < 25) {
            $ins = $bdd->prepare('INSERT INTO commentaires (pseudo, commentaire, id_article) VALUES (?,?,?)');
            $ins->execute(array($pseudo,$commentaire,$getid));
            $c_msg = "<span style='color:green'>Votre commentaire a bien été posté</span>";
         } else {
            $c_msg = "Erreur: Le pseudo doit faire moins de 25 caractères";
         }
      } else {
         $c_msg = "Erreur: Tous les champs doivent être complétés";
      }
   }
   $commentaires = $bdd->prepare('SELECT * FROM commentaires WHERE id_article = ? ORDER BY id DESC');
   $commentaires->execute(array($getid));
?>

   <h1><?= $titre ?></h1>
   <?= $contenu ?>

   <h2>Commentaires:</h2>

<?php while($c = $commentaires->fetch()) {  ?>
   <b><?= $c['pseudo'] ?>:</b> <?= $c['commentaire'] ?><br />

<?php } ?>
<?php
}
?>
<br>
 <?php
      $commentaires = $commentaires->rowCount();
      echo ' <a href="">Il y a '.$commentaires.' commentaires . </a>' ;
  ?>

<h2>Poster un commentaire:</h2>
<br>
<form class="form" method="POST">
   <input type="text" class="form-control" name="pseudo" placeholder="Votre pseudo" /><br />
   <textarea name="commentaire" class="form-control" placeholder="Votre commentaire..."></textarea><br />
   <input type="submit" value="Poster mon commentaire" name="submit_commentaire" class="btn btn-start-order" />
</form>

<?php if(isset($c_msg)) { echo $c_msg; } ?>
<br /><br />

            </div>

        </div>
<div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>
        </div>
        <?php include("Vue/footer.php"); ?>

</body>  
</html>

Merci pour votre aide !

7 réponses


Adama Sankara
Réponse acceptée

bonjour je me suis inscript sur le site car je suis tombé par hasard sur ton post.
Je vais essayer de t'aider. Le but est que tu comprenne comment sa fonctionnne pour qu'ensuite tu t'ensort tout seul la prochaine fois.
J'espère que l' arichitecture de ta base de données est telle sortes que si je commente un article alrs dans la table commentaire il ya un champ ou je recupère l'id de l'article(C'est pour lier un article a un commentaire). Si c'est le cas alors on peut continuer.
Juste pour l'exemple créer une nouvelle base de données avec deux tables(Juste pour l'exemple sa ne te prendra que 2 minutes).
Un première table "tarticle" qui aura pour champs (id, article, cmpt) et une deuxième table qui aura pour champs (id, comments, idfkarticle)

Tous les champs "id" sont en auto_increment.
Le champ "idfkarticle" permet de lier un article à un commentaire. Si l'on commente un article, alors on affecte l'id de l'aricle dans ce champ la(dans mon script je n'ai pas gerer ce cas la).

Le champ "cmpt" permet de calculer le nombre de commentaire en fonction de chaque article. Il s'implemnt automatiquement.

Ensuite fais un copier coller de ce script dans une page et execute pour voir le resultat.

[](<?php

//Pour me connecter à la base de données "grafiktar"

$serveur="localhost";
$login="root";
$pass="";
$dbname="grafiktar";

try{

    $connexion = new PDO("mysql:host=$serveur; dbname=$dbname", $login, $pass);
    $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);        
//Fin de la connexion a la base de données

    //Dans la table "tarticle" je selectionne tous les articles
    $select = $connexion->prepare('SELECT * FROM tarticle');
    $select->execute();

    //Cette condition c'est pour faire la pagination; c'est a dire que si je clique sur le nombre de commantaire d'un article dans le but de l'afficher une nouvelle page sera crééer pour n'afficher que les commentaires concernant cet article
    if(isset($_GET['commentaire'])){

        $commentaire = $_GET['commentaire'];//Je recupère ici l'identifiant du commentaire pour ensuite faire la requete qui suit pour ne selectionner que les commentaires de cet identifiant

        $affichage = $connexion->prepare('SELECT * FROM comments WHERE idfkarticle=?');
        $affichage->execute([$commentaire]);

        ?>
        <h2>Commentaires:</h2>
        <?php

        while($allcomments = $affichage->fetch(PDO::FETCH_OBJ)){//Cette boucle affiche tous les commentaires de l'article

            echo $allcomments->comments.'<br>';

        }
    }
    //Ce else parce que si l'on ne clique par sur le nombre de commentaire d'un article alors tous les articles avec leur nombres de commentaire s'afficheront

    else{

        /*Cette grande boucle affiche tous les articles avec leur nombre de commentaire
         *C'est ici que commence vraiment l'exemple a suivre pour essayer de resoudre ton problème*/
        while($s=$select->fetch(PDO::FETCH_OBJ)){//plus haut, j'ai effectuer une requete "select" pour afficher tous les articles
        //Je stocke tous les enregistrement dans la variable < $s >;

            echo 'Nom de l\'article : '.$s->article.'<br>';//J'affiche ici tous les article;

            $idarticle = $s->id;//Je stocke l'identifiant de l'article dans idarticle

            //J'effectue la requete ci-dessous, pour afficher tous les commentaires en fonction de de l'article.
            $a = $connexion->prepare('SELECT * FROM comments WHERE idfkarticle=?');
            $a->execute([$idarticle]);      

            //Le script ci-dessous permet de compter le nombre de commentaire relative a un article 
            $sql = $connexion->prepare('SELECT COUNT(*) FROM comments WHERE idfkarticle=?');

            $sql->execute([$idarticle]);

            $resultat =$sql->fetchAll();

            $insrt = $resultat[0][0];//Pour afficher le nombre de commentaire. Ex: 2 commentaire, 4 commentaire...

            //Avec le nombre de commentaire j'implemente ce nombre dans la table commentaire. Cela me permettra par la suite d'afficher tous les commentaires d'un articles
            $insertion = $connexion->prepare('UPDATE tarticle SET cmpt=? WHERE id=?');
            $insertion->execute([$insrt, $idarticle]);

            ?>
            <!--Pour afficher un lien dans lequel on va visualiser le nombre de commenrtaire-->
            <a href="?commentaire=<?php echo $idarticle; ?>"> <?php echo 'Pour cet article, il y\'a : '.$insrt.' commentaire(s)';?></a><br>
            <?php

            echo '<br><br><br><br><br>';

        }

        //Fin de la boucle

    }

//Ce bloc, c'est pour afficher un message d'erreur
}
catch(exception $e){
    echo 'Attention message d\'erreur: '.$e->getMessage();
}

?>)

J'ai allerger ce scrip pour la comprehension, bien sur on peut l'ameliorer.

N'oublie pas, lit et rélit le script avec les commentaire.

A+

Il te suffit pour afficher le nombres de commentaires de faire un requêtes sur ta table de commentaires et d'utiliser COUNT (*) AS nbComments par exemple, et pour la suite l'affichage dans une pop-up je te conseil d'utiliser AJAX !

fa_dev
Auteur

Bonjour, J'ai essayé d'intégrer ma page 'article' à celle d'index . Cependant j'ai une erreur à chaque fois, et je ne sais pas où mettre ma boucle while : J'ai essayé plusieurs endroits, toujours une erreur..

<h2>Commentaires:</h2>

<?php while($c = $commentaires->fetch()) {  ?>
   <b><?= $c['pseudo'] ?>:</b> <?= $c['commentaire'] ?><br />

<?php } ?>
<?php
}
?>

Et comment j'ai essayé, mais il y a une erreur aussi :

<?php 
session_start();
?>

<body>

<?php 
if(!isset($_SESSION['role']) OR $_SESSION['role'] != 1) 
{ include("Vue/menu.php");} else {
  include("Vue/menuadmin.php");}
?>

    <div class="row"><br><br> 
    </div>
        <div class="row">
        <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>
        <div class="col-xs-8 col-sm-8 col-md-8 col-lg-8 ">

                <?php

                $messagesParPage=5; //Nous allons afficher 5 messages par page.
                $bdd = new PDO('mysql:host=xx;dbname=xx;charset=utf8', 'xx','xx');
                $articles = $bdd->query('SELECT * FROM articles ORDER BY date_time_publication DESC');
                $retour_total=$bdd->query('SELECT COUNT(*) AS total FROM articles'); //Nous récupérons le contenu de la requête dans $retour_total

            while($donnees_total = $retour_total->fetch())  //On range retour sous la forme d'un tableau.
                $total=$donnees_total['total']; //On récupère le total pour le placer dans la variable $total.
                //Nous allons maintenant compter le nombre de pages.
                $nombreDePages=ceil($total/$messagesParPage);
                if(isset($_GET['page'])) // Si la variable $_GET['page'] existe...
                {
                     $pageActuelle=intval($_GET['page']);

                     if($pageActuelle>$nombreDePages) // Si la valeur de $pageActuelle (le numéro de la page) est plus grande que $nombreDePages...
                     {
                          $pageActuelle=$nombreDePages;
                     }
                }
                else // Sinon
                {
                     $pageActuelle=1; // La page actuelle est la n°1    
                }

$premiereEntree=($pageActuelle-1)*$messagesParPage; // On calcul la première entrée à lire

if(isset($_GET['id']) AND !empty($_GET['id'])){
    $getid = htmlspecialchars($_GET['id']);
    $article = $bdd->prepare(' SELECT * FROM articles WHERE id = ?');
    $article = execute(array($getid));
    $article = $article->fetch();
if(isset($_POST['submit_commentaire'])) {
      if(isset($_POST['pseudo'],$_POST['commentaire']) AND !empty($_POST['pseudo']) AND !empty($_POST['commentaire'])) {
         $pseudo = htmlspecialchars($_POST['pseudo']);
         $commentaire = htmlspecialchars($_POST['commentaire']);
         if(strlen($pseudo) < 25) {
            $ins = $bdd->prepare('INSERT INTO commentaires (pseudo, commentaire, id_article) VALUES (?,?,?)');
            $ins->execute(array($pseudo,$commentaire,$getid));
            $c_msg = "<span style='color:green'>Votre commentaire a bien été posté</span>";
         } else {
            $c_msg = "Erreur: Le pseudo doit faire moins de 25 caractères";
         }
      } else {
         $c_msg = "Erreur: Tous les champs doivent être complétés";
      }
   }
   $commentaires = $bdd->prepare('SELECT * FROM commentaires WHERE id_article = ? ORDER BY id DESC');
   $commentaires->execute(array($getid));

// La requête sql pour récupérer les messages de la page actuelle.
$retour_messages=$bdd->query('SELECT * FROM articles ORDER BY id DESC LIMIT '.$premiereEntree.', '.$messagesParPage.'');

while($donnees_messages = $retour_messages->fetch())  // On lit les entrées une à une grâce à une boucle
{
            echo'
            <div class="article">
             <ul>
              <li>
              <a href="article.php?id='.$donnees_messages['id'] .'">
              '.$donnees_messages['titre'] .'</a>
              </li>
              </ul>

              <br><br><ul>
              <li>
              '.$donnees_messages['contenu'] .'
              <h2>Poster un commentaire:</h2>
                <br>
                <form class="form" method="POST">
                   <input type="text" class="form-control" name="pseudo" placeholder="Votre pseudo" /><br />
                   <textarea name="commentaire" class="form-control" placeholder="Votre commentaire..."></textarea><br />
                   <input type="submit" value="Poster mon commentaire" name="submit_commentaire" class="btn btn-start-order" />
                </form>
              <img src="photos/separation.png"></li>
              </ul>';

 }

echo '<p align="center">Page : '; //Pour l'affichage, on centre la liste des pages
for($i=1; $i<=$nombreDePages; $i++) //On fait notre boucle
{
     //On va faire notre condition
     if($i==$pageActuelle) //Si il s'agit de la page actuelle...
     {
         echo ' [ '.$i.' ] '; 
     }  
     else //Sinon...
     {
          echo ' <a href="index.php?page='.$i.'">'.$i.'</a> ';
     }
}    

              ?>

              </div>
              <div class="col-xs-2 col-sm-2 col-md-2 col-lg-2"></div>

    </div>
    <?php include("Vue/footer.php"); ?>
</div>
</body>  
</html>

J'ai vraiment besoin de votre aide. Je débute, et j'ai le nez dedans ..

Pourquoi u fait un while... essais avec foreach.

euh... un while ou un foreach sur un retour de requette qui te ressort un COUNT ca sert a rien... t'aura tjrs une seule ligne... d'ailleur, vaut mieux faire un COUNT(id) par exemple qu'un COUNT(*) (qui est un peu plus long a traiter...)

fa_dev
Auteur

Un énorme merci pour ce code très détaillé, simple et super compréhensible : Je le garde en mémoire car très très utile. Merci merci !

Bonjour,
Je suis ravie d'avoir pu t'aider DEV.
Au plaisir de te recroiser.
À bientôt !
ADAMA