CRÉER UN FORUM EN PHP - #8 Afficher les réponses

PrimFX Boris ('PrimFX') Le 6 mars 2016

Nous avons précédemment vu comment poster des réponses à un topic... Voyons maintenant comment les afficher, avec en bonus l'utilisation d'un petit système de pagination 😀


Code de la vidéo:
  • topic.php
<?php
require('php/config.php');
require('php/functions.php');
require('php/functions_forum.php');
if(isset($_GET['titre'],$_GET['id']) AND !empty($_GET['titre']) AND !empty($_GET['id'])) {
   $get_titre = htmlspecialchars($_GET['titre']);
   $get_id = htmlspecialchars($_GET['id']);
   $titre_original = $bdd->prepare('SELECT sujet FROM f_topics WHERE id = ?');
   $titre_original->execute(array($get_id));
   $titre_original = $titre_original->fetch()['sujet'];
   if($get_titre == url_custom_encode($titre_original)) {
      $topic = $bdd->prepare('SELECT * FROM f_topics WHERE id = ?');
      $topic->execute(array($get_id));
      $topic = $topic->fetch();
      if(isset($_POST['topic_reponse_submit'],$_POST['topic_reponse'])) {
         $reponse = htmlspecialchars($_POST['topic_reponse']);
         if(isset($_SESSION['id'])) {
            if(!empty($reponse)) {
               $ins = $bdd->prepare('INSERT INTO f_messages(id_topic,id_posteur,contenu,date_heure_post) VALUES (?,?,?,NOW())');
               $ins->execute(array($get_id,$_SESSION['id'],$reponse));
               $reponse_msg = "Votre réponse a bien été postée";
               unset($reponse);
            } else {
               $reponse_msg = "Votre réponse ne peut pas être vide !";
            }
         } else {
            $reponse_msg = "Veuillez vous connecter ou créer un compte pour poster une réponse";
         }
      }
      if(isset($_GET['page']) AND $_GET['page'] > 1) {
         $reponsesParPage = 6;
      } else {
         $reponsesParPage = 5;
      }
      $reponsesTotalesReq = $bdd->prepare('SELECT * FROM f_messages WHERE id_topic = ?');
      $reponsesTotalesReq->execute(array($get_id));
      $reponsesTotales = $reponsesTotalesReq->rowCount();
      $pagesTotales = ceil($reponsesTotales/$reponsesParPage);
      if(isset($_GET['page']) AND !empty($_GET['page']) AND $_GET['page'] > 0 AND $_GET['page'] <= $pagesTotales) {
         $_GET['page'] = intval($_GET['page']);
         $pageCourante = $_GET['page'];
      } else {
         $pageCourante = 1;
      }
      $depart = ($pageCourante-1)*$reponsesParPage;
      $reponses = $bdd->prepare('SELECT * FROM f_messages WHERE id_topic = ? LIMIT '.$depart.','.$reponsesParPage);
      $reponses->execute(array($get_id));
   } else {
      die('Erreur: Le titre ne correspond pas à l\'id');
   }
   require('views/topic.view.php');
} else {
   die('Erreur...');
}
?>
  • topic.view.php
<table class="forum">
   <tr class="header">
      <th class="sub-info w10">Auteur</th>
      <th class="main center">Sujet: <?= $topic['sujet'] ?></th>
   </tr>
   <?php if($pageCourante == 1) { ?>
   <tr>
      <td><?= get_pseudo($topic['id_createur']) ?></td>
      <td><?= $topic['contenu'] ?></td>
   </tr>
   <?php } ?>
   <?php while($r = $reponses->fetch()) { ?>
   <tr>
      <td><?= get_pseudo($r['id_posteur']) ?></td>
      <td><?= $r['contenu'] ?></td>
   </tr>
   <?php } ?>
</table>
<?php
  for($i=1;$i<=$pagesTotales;$i++) {
     if($i == $pageCourante) {
        echo $i.' ';
     } else {
        echo '<a href="topic.php?titre='.$get_titre.'&id='.$get_id.'&page='.$i.'">'.$i.'</a> ';
     }
  }
 ?>
<br />
<?php if(isset($_SESSION['id'])) { ?>
   <form method="POST">
      <textarea placeholder="Votre réponse" name="topic_reponse" style="width:80%"><?php if(isset($reponse)) { echo $reponse; } ?></textarea><br />
      <input type="submit" name="topic_reponse_submit" value="Poster ma réponse"></form>
   </form>
   <?php if(isset($reponse_msg)) { echo $reponse_msg; } ?>
<?php } else { ?>
   <p>Veuillez vous connecter ou créer un compte pour poster une réponse</p>
<?php } ?>
  • php/functions_forum.php
<?php
function get_pseudo($id) {
   global $bdd;
   $pseudo = $bdd->prepare('SELECT pseudo FROM membres WHERE id = ?');
   $pseudo->execute(array($id));
   $pseudo = $pseudo->fetch()['pseudo'];
   return $pseudo;
}
?>

A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 22 ans et je suis passionné d'informatique. Suite à mes études (Licence Informatique puis MSc Computer Science au Trinity College Dublin), je gère l'entreprise Single Quote co-fondée en 2019 et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles 😃

Votre commentaire

Vous devez être connecté pour poster un commentaire. Se connecter ou Créer un compte

Commentaires 4

  • Coco3444 Le 5 février, à 23:48 | Répondre

    Laissez tomber, je suis un peu c*n ce soir... J'avais laissé un point devant et mon éditeur ne me l'affichait pas...
    Bon courage pour ceux qui sont arrivés jusque là...
    (vu le nombre de commentaires, pas beaucoup de personnes... Ce tuto forum c'est vraiment "Et à la fin il n'en restera qu'un")

  • Coco3444 Le 5 février, à 23:45 | Répondre

    excusez moi, j'ai un bug Parse error: syntax error, unexpected '$_GET' (T_VARIABLE) in /var/www/neokratos.mtxserv.com/public_html/forum/topic.php on line 69
    à l'endroit ou on déclare:
      $_GET['page'] = intval($_GET['page']);

  • Foxxen Le 9 mars, à 16:53 | Répondre

    @Foxxen Problème résolu, il suffisait d'enlever sa :

    if(isset($_GET['page']) AND $_GET['page'] > 1) {
    $reponsesParPage = 6;
    } else {
    $reponsesParPage = 5;
    }
    Et de mettre :

    $reponsesParPage = le nombre de réponses souhaiter;

  • Foxxen Le 7 mars, à 22:09 | Répondre

    Salut, il y à un petit bug avec la pagination (enfin je croit puisque j'ai changer quelques trucs), quand il y à 6 réponses,tout marche donc sa affiche deux pages mais ensuit sa met la 6ème réponse sur la première page et dès qu'il y en à 7ème, la 6ème réponse disparait

    Des screens :
    http://www.noelshack.com/2016-10-1457384740-bdd.jpg La bdd
    http://www.noelshack.com/2016-10-1457384740-topic-1.jpg Page 1 du topic
    http://www.noelshack.com/2016-10-1457384741-topic-2.jpg Page 2 du topic



    Il n'y à que 6 réponses qui s'affichent au lieu de 7, voila, laissez moi savoir