CRÉER UN FORUM EN PHP - #4 Lister les topics

PrimFX Boris ('PrimFX') Le 7 février 2016

Un tuto assez long dans lequel je vous propose de voir comment afficher nos topics en les triant par catégories et sous-catégories. Comme dit dans la vidéo, je fais en sorte de ne pas avoir à passer l'id de la catégorie dans l'URL, c'est pourquoi le code est assez long pour ce qui est des vérifications (et donc de la sécurisation du site)... Après, à vous de voir comment vous souhaitez faire passer vos données entre les pages 😛 A noter que les URLs seront prochainement "embellies" grâce à l'URL Rewriting ;-)

  • forum_topic.php
  <?php
require('php/config.php'); /* Connexion à la bdd */
require('php/functions.php'); /* Mes fonctions */

if(isset($_GET['categorie']) AND !empty($_GET['categorie'])) {
   $get_categorie = htmlspecialchars($_GET['categorie']);
   $categories = array();
   $req_categories = $bdd->query('SELECT * FROM f_categories');
   while($c = $req_categories->fetch()) {
      array_push($categories, array($c['id'],url_custom_encode($c['nom'])));
   }
   foreach($categories as $cat) {
      if(in_array($get_categorie, $cat)) {
         $id_categorie = intval($cat[0]);
      }
   }
   if(@$id_categorie) {
      if(isset($_GET['souscategorie']) AND !empty($_GET['souscategorie'])) {
         $get_souscategorie = htmlspecialchars($_GET['souscategorie']);
         $souscategories = array();
         $req_souscategories = $bdd->prepare('SELECT * FROM f_souscategories WHERE id_categorie = ?');
         $req_souscategories->execute(array($id_categorie));
         while($c = $req_souscategories->fetch()) {
            array_push($souscategories, array($c['id'],url_custom_encode($c['nom'])));
         }
         foreach($souscategories as $cat) {
            if(in_array($get_souscategorie, $cat)) {
               $id_souscategorie = intval($cat[0]);
            }
         }
      }
      $req = "SELECT * FROM f_topics
            LEFT JOIN f_topics_categories ON f_topics.id = f_topics_categories.id_topic 
            LEFT JOIN f_categories ON f_topics_categories.id_categorie = f_categories.id
            LEFT JOIN f_souscategories ON f_topics_categories.id_souscategorie = f_souscategories.id
            LEFT JOIN membres ON f_topics.id_createur = membres.id
            WHERE f_categories.id = ?";

      if(@$id_souscategorie) {
         $req .= " AND f_souscategories.id = ?";
         $exec_array = array($id_categorie,$id_souscategorie);
      } else {
         $exec_array = array($id_categorie);
      }

      $req .= " ORDER BY f_topics.id DESC";
      
      $topics = $bdd->prepare($req);
      $topics->execute($exec_array);
   } else {
      die('Erreur: Catégorie introuvable...');
   }
} else {
   die('Erreur: Aucune catégorie sélectionnée...');
}

require('views/forum_topics.view.php');
?>
  • views/forum_topic.view.php
  <table class="forum">
   <tr class="header">
      <th class="main">Sujet</th>
      <th class="sub-info w10">Messages</th>
      <th class="sub-info w20">Dernier message</th>
      <th class="sub-info w20">Création</th>
   </tr>
   <?php while($t = $topics->fetch()) { ?>
   <tr>
      <td class="main">
         <h4><a href=""><?= $t['sujet'] ?></a></h4>
      </td>
      <td class="sub-info">4083495</td>
      <td class="sub-info">25.12.2015 à 18h07<br />de PrimFX</td>
      <td class="sub-info"><?= $t['date_heure_creation'] ?><br />par <?= $t['pseudo'] ?></td>
   </tr>
   <?php } ?>
</table>
  • views/forum.view.php (pour la petite modification de l'URL)
  <table class="forum">
   <tr class="header">
      <th class="main">Catégories</th>
      <th class="sub-info messages">Messages</th>
      <th class="sub-info dmessage">Dernier message</th>
   </tr>
   <?php
   while($c = $categories->fetch()) {
      $subcat->execute(array($c['id']));
      $souscategories = '';
      while($sc = $subcat->fetch()) { 
         $souscategories .= '<a href="/PrimTemp/forum_topics.php?categorie='.url_custom_encode($c['nom']).'&souscategorie='.url_custom_encode($sc['nom']).'">'.$sc['nom'].'</a> | ';
      }
      $souscategories = substr($souscategories, 0, -3);
   ?>
   <tr>
      <td class="main">
         <h4><a href="/PrimTemp/forum_topics.php?categorie=<?= url_custom_encode($c['nom']) ?>"><?= $c['nom'] ?></a></h4>
         <p>
         <?= $souscategories ?>
         </p>
      </td>
      <td class="sub-info">4083495</td>
      <td class="sub-info">04.12.2015 à 14h52<br />de PrimFX</td>
   </tr>
   <?php } ?>
</table>
  • php/functions.php (fonction url_custom_encode())
  function url_custom_encode($titre) {
   $titre = htmlspecialchars($titre);
   $find = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ð', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'ß', 'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ø', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Œ', 'œ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Š', 'š', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', 'Ÿ', '?', '?', '?', '?', 'Ž', 'ž', '?', 'ƒ', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?');
     $replace = array('A', 'A', 'A', 'A', 'A', 'A', 'AE', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'D', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 's', 'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', 'A', 'a', 'A', 'a', 'A', 'a', 'C', 'c', 'C', 'c', 'C', 'c', 'C', 'c', 'D', 'd', 'D', 'd', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'E', 'e', 'G', 'g', 'G', 'g', 'G', 'g', 'G', 'g', 'H', 'h', 'H', 'h', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'I', 'i', 'IJ', 'ij', 'J', 'j', 'K', 'k', 'L', 'l', 'L', 'l', 'L', 'l', 'L', 'l', 'l', 'l', 'N', 'n', 'N', 'n', 'N', 'n', 'n', 'O', 'o', 'O', 'o', 'O', 'o', 'OE', 'oe', 'R', 'r', 'R', 'r', 'R', 'r', 'S', 's', 'S', 's', 'S', 's', 'S', 's', 'T', 't', 'T', 't', 'T', 't', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'W', 'w', 'Y', 'y', 'Y', 'Z', 'z', 'Z', 'z', 'Z', 'z', 's', 'f', 'O', 'o', 'U', 'u', 'A', 'a', 'I', 'i', 'O', 'o', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'U', 'u', 'A', 'a', 'AE', 'ae', 'O', 'o', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?');
     $titre = str_replace($find, $replace, $titre);
   $titre = strtolower($titre);
   $mots = preg_split('/[^A-Z^a-z^0-9]+/', $titre);
   $encoded = "";
   foreach($mots as $mot) {
      if(strlen($mot) >= 3 OR str_replace(['0','1','2','3','4','5','6','7','8','9'], '', $mot) != $mot) {
         $encoded .= $mot.'-';
      }
   }
   $encoded = substr($encoded, 0, -1);
   return $encoded;
}
Comme d'habitude, si vous avez des idées, propositions, ou autre, l'espace commentaire est là !

PS: Pour la fonction url_custom_encode(), vous remarquerez sans doute qu'elle possède quelques failles, notamment pour la sous-catégorie C++ (à cause des "+")... Nous verrons comment corriger ça dans un prochain épisode, et je mettrai à jour le code de la fonction ;-)

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 15

  • jean356485854 Le 14 janvier, à 18:26 | Répondre

    Je peut plus vois de code !

  • jean356485854 Le 14 janvier, à 18:26 | Répondre

    MDR

  • Ayari Le 7 décembre, à 20:59 | Répondre

    if(isset($_GET['categorie']) AND !empty($_GET['categorie'])) je trouve pas le variable categorie ou se trouve !!

  • hjgffyfy Le 22 juin, à 07:18 | Répondre

    voici mon code

    <table class="forum">
    <tr class="header">
    <th class="main">Catégories</th>
    <th class="sub-info messages hide-640">Réponses</th>
    <th class="sub-info messages hide-640">Vues</th>
    <th class="sub-info dmessage">Dernière réponse</th>
    </tr>
    <?php
    while($c = $categories->fetch()) {
    $subcat->execute(array($c['id']));
    $souscategories = '';
    while($sc = $subcat->fetch()) {
    $souscategories .= '<a href="/PrimTemp/forum_topics.php?categorie='.url_custom_encode($c['nom']).'&souscategorie='.url_custom_encode($sc['nom']).'">'.$sc['nom'].'</a> | ';
    }
    $souscategories = substr($souscategories, 0, -3);
    ?>
    <tr class="categories">
    <td class="main">
    <h4><a href="/PrimTemp/forum_topics.php?categorie=<?= url_custom_encode($c['nom']) ?>"><?= $c['nom'] ?></a></h4>
    <p>
    <?= $souscategories ?>
    </p>
    </td>
    <td class="sub-info hide-640"><?= reponse_nbr_categorie($c['id']) ?></td>
    <td class="sub-info hide-640">999 999 999</td>
    <td class="sub-info"><?= derniere_reponse_categorie($c['id']) ?></td>
    </tr>
    <?php } ?>
    </table>

  • hjgffyfy Le 22 juin, à 07:18 | Répondre


    Notice: Undefined variable: categories in C:\xampp\htdocs\killer-craft-master\forum_1\views\forum.view.php on line 9

    Fatal error: Call to a member function fetch() on null in C:\xampp\htdocs\killer-craft-master\forum_1\views\forum.view.php on line 9

    une erreur que je ne comprend pas

  • sebyseb Le 28 janvier, à 22:10 | Répondre

    Réponse trouvé, il suffit d'ajouter le nom de la bdd. devant la table à ouvrir

    LEFT JOIN tuto9.membres ON f_topics.id_createur = membres.id

  • sebyseb Le 28 janvier, à 22:00 | Répondre

    Salut ! Merci pour le tuto mais j'ai un problème avec mon code. Enfaite j'ai le forum sur une autre bdd que le reste du site, donc quand je tente de lier la table membres(bdd1) avec f_topics.id_createur pour faire apparaitre le pseudo du createur de topics ca ne fonctionne pas.

    Ma question est donc "comment lier deux BDD sur Mysql ?

  • quiqou55 Le 29 mars, à 19:58 | Répondre

    Pour les trucs qui tu pourrait faire différemment et plus simplement tu pouvais a la place de faire :

    $categories = array();
    $req_categories = $bdd->query('SELECT * FROM f_categories');
    while($c = $req_categories->fetch()) {
    array_push($categories, array($c['id'],url_custom_encode($c['nom'])));
    }

    tu pouvais faire :

    $req_categories = $bdd->query('SELECT * FROM f_categories');
    $categories= $req_categories->fetchAll(2);

  • Foxxen Le 2 mars, à 09:33 | Répondre

    @Marius Hey ! Merci, je vais refaire le tuto et voir si sa marche mieux.

  • M69-74 Le 1 mars, à 18:52 | Répondre

    @Foxxen Hello ! En fait j'avais enregistré quelque chose dans ma base de donnée avec un ''S'' en trop et il a fallu sont tout re-modifier ! J'ai ensuite resuivi le tuto ligne pour ligne et tout est bon !
    En ésperant t'avoir aidé !

  • Foxxen Le 29 février, à 18:50 | Répondre

    @Marius Ok, pas de problème, c'était quoi le bug, que je puisse le régler si jamais sa me ré-arrive ??

  • M69-74 Le 29 février, à 00:44 | Répondre

    @Foxxen Hello ! Finalement, j'ai touvé l'erreur ! Merci pour ta réponse quand même !

  • Foxxen Le 27 février, à 09:17 | Répondre

    @Marius Personnellement, mon problème c'est résolu avec le tuto #6, donc essaye de prendre le codu du tuto#6 et regarde si sa marche

  • M69-74 Le 27 février, à 06:23 | Répondre

    J'ai le même problème que @Foxxen ; pourrais-tu vérifier lez code s'il t plaît ? @PrimFx Merci par avance !

  • Foxxen Le 16 février, à 11:02 | Répondre

    Salut, j'ai un problème avec le code forum_topics.php.
    Je créer un topic dans une sous catégorie et quand je vais dans celle-ci il n'y à rien, n'y dans les autres (le topic est bien créer).
    ( Et j'ai fait aussi une categorie programmation comme ton example et tous les topics, mis dans une catégorie son seulement afficher dans C++, meme si il n'y à pas de sous catégorie dans l'url )<- Enfaite on revient au premier problème. A tu une idée ?