CRÉER UN FORUM EN PHP - #5 Catégorie et sous-catégorie d'un nouveau topic

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

Dans le précédent tuto de la série, nous avons vu comment lister les topics en tenant compte des catégories et sous-catégories. Je vous propose donc aujourd'hui de voir comment lier tout ça lors de la création d'un nouveau topic :-)

  • 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>
<a href="/PrimTemp/nouveau_topic.php?categorie=<?= $id_categorie ?>">Créer un nouveau topic</a>
  • nouveau_topic.php
<?php
require('php/config.php'); /* Connexion à la base de donnée */
require('php/functions.php'); /* Mes fonctions */

if(isset($_GET['categorie'])) {
   $get_categorie = htmlspecialchars($_GET['categorie']);
   $categorie = $bdd->prepare('SELECT * FROM f_categories WHERE id = ?');
   $categorie->execute(array($get_categorie));
   $cat_exist = $categorie->rowCount();
   if($cat_exist == 1) {
      $categorie = $categorie->fetch();
      $categorie = $categorie['nom'];
      $souscategories = $bdd->prepare('SELECT * FROM f_souscategories WHERE id_categorie = ? ORDER BY nom');
      $souscategories->execute(array($get_categorie));
      if(isset($_SESSION['id'])) {
         if(isset($_POST['tsubmit'])) {
            if(isset($_POST['tsujet'],$_POST['tcontenu'])) {
               $sujet = htmlspecialchars($_POST['tsujet']);
               $contenu = htmlspecialchars($_POST['tcontenu']);
               $souscategorie = htmlspecialchars($_POST['souscategorie']);
               $verify_sc = $bdd->prepare('SELECT id FROM f_souscategories WHERE id = ? AND id_categorie = ?');
               $verify_sc->execute(array($souscategorie,$get_categorie));
               $verify_sc = $verify_sc->rowCount();
               if($verify_sc == 1) {
                  if(!empty($sujet) AND !empty($contenu)) {
                     if(strlen($sujet) <= 70) {
                        if(isset($_POST['tmail'])) {
                           $notif_mail = 1;
                        } else {
                           $notif_mail = 0;
                        }
                        $ins = $bdd->prepare('INSERT INTO f_topics (id_createur, sujet, contenu, notif_createur, date_heure_creation) VALUES(?,?,?,?,NOW())');
                        $ins->execute(array($_SESSION['id'],$sujet,$contenu,$notif_mail));
                        
                        $lt = $bdd->query('SELECT id FROM f_topics ORDER BY id DESC LIMIT 0,1');
                        $lt = $lt->fetch();
                        $id_topic = $lt['id'];
                        $ins = $bdd->prepare('INSERT INTO f_topics_categories (id_topic, id_categorie, id_souscategorie) VALUES (?,?,?)');
                        $ins->execute(array($id_topic, $get_categorie, $souscategorie));
                     } else {
                        $terror = "Votre sujet ne peut pas dépasser 70 caractères";
                     }
                  } else {
                     $terror = "Veuillez compléter tous les champs";
                  }
               } else {
                  $terror = "Sous-catégorie invalide";
               }
            }
         }
      } else {
         $terror = "Veuillez vous connecter pour poster un nouveau topic";
      }
   } else {
      die('Catégorie invalide...');
   }
} else {
   die('Aucune catégorie définie...');
}

require('views/nouveau_topic.view.php'); /* Inclusion du fichier vue */
?>
  • views/nouveau_topic.view.php
<form class="fntopic" method="POST">
     <table class="forum ntopic">
      <tr class="header">
         <th class="main">Nouveau Topic</th>
         <th></th>
      </tr>
      <tr>
         <td>Sujet</td>
         <td><input type="text" name="tsujet" size="70" maxlength="70" /></td>
      </tr>
      <tr>
         <td>Catégorie</td>
         <td>
         <?= $categorie ?>
         </td>
      </tr>
      <tr>
         <td>Sous-Catégorie</td>
         <td>
            <select name="souscategorie">
               <?php while($sc = $souscategories->fetch()) { ?>
               <option value="<?= $sc['id'] ?>"><?= $sc['nom'] ?></option>
               <?php } ?>
            </select>
         </td>
      </tr>
      <tr>
         <td>Message</td>
         <td><textarea name="tcontenu"></textarea></td>
      </tr>
      <tr>
         <td>Me notifier des réponses par mail</td>
         <td><input type="checkbox" name="tmail" /></td>
      </tr>
      <tr>
         <td colspan="2"><input type="submit" name="tsubmit" value="Poster le Topic" /></td>
      </tr>
      <?php if(isset($terror)) { ?>
      <tr>
         <td colspan="2"><?= $terror ?></td>
      </tr>
      <?php } ?>
   </table>
</form>
Une question ? Des idées de fonctionnalités, d'amélioration du code, ou d'autres propositions ? L'espace commentaire est juste en-dessous ;-)

A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 20 ans et je suis passionné d'informatique et de technologie. Diplômé d'une Licence Informatique de l'Université de Strasbourg, j'ai co-fondé en 2019 l'entreprise Single Quote et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles sur PrimFX.com 😃

Votre commentaire

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

Commentaires 11

  • Njecky Le 25 septembre, à 15:57 | Répondre

    le code de la page d'accueil?

  • Artcoco1 Le 28 mai, à 18:19 | Répondre

    Bravos gg pour tous... mais est-ce que tu peux me dire dans quelle vidéo tu as créé functions.php?
    Au fait c’est moi le dernier topic problème urgent et je suis trop content à l’idée de pouvoir en avoir un sur mon site.

  • carterdox Le 9 août, à 21:07 | Répondre

    Salut je suis bloquer "Erreur: Aucune catégorie sélectionnée..." svp help

  • sebyseb Le 29 janvier, à 00:10 | Répondre

    Bonsoir,

    j'ai un soucis depuis cette étape, quand je poste un topic, il s'archive bien dans la base de donné mais quand la page se recharge j'ai l'erreur suivante :
    Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\Test\tuto 19 - Le forum\views\nouveau_topic.view.php on line 29

    voila mon code :

    <td>Sous - catégorie</td>
    <td>
    <select name="souscategorie">
    <?php while ($sc = $souscategorie->fetch()) { ?>
    <option value="<?=$sc['id'] ?>"><?=$sc['nom'] ?></option>
    <?php } ?>
    </select>
    </td>
    Si quelqu'un peut m'aider ca serait super cool

  • caca Le 3 septembre, à 14:27 | Répondre

    @isaac donc on affiche quoi

  • barundure Le 15 avril, à 09:01 | Répondre

    Salut!j'ai toujours le même problème qu'auparavant!
    Si je poste une question sur la catégorie programmation et sous catégorie HTML par exemple, et que tente d'affiche les questions posées sur ladite sous catégorie s'affiche mais c'est pour toutes les sous-catégories disponible même ceux qui ne sont pas concernées, C'est un comportement anormal!Pouvez-vous m'aider SVP?
    Je suis bloquer sur ce niveau. J'ai pas pu trouvé là ou je me suis trompé!
    Cordialement!

  • barundure Le 13 avril, à 10:09 | Répondre

    salut PrimFx.j'ai un problème sur la récupération des informations dans la BDD. En faite quand je clique sur catégorie Programmation et que je choisi HTML par exemple, normalement ça doit m'affiché le son contenu propre à la sous-catégorie HTML.Mais le contenu est le même pour tous les sous-catégories qui se trouve à ma BDD, que ça soit CSS, Ruby, Java,....
    Pourriez-vous m'aider SVP?
    Cordialement

  • xXCHAMP0MYXx Le 18 février, à 21:50 | Répondre

    Tu devrais faire un tutoriel sur la création d'un support par ticket en PHP sa serais vraiment cool
    Car la ses la galère je n'y arrive même pas à faire la structure :p

  • ali Le 17 février, à 23:06 | Répondre

    salut, est ce qu'il y'a une partie admin?

  • Foxxen Le 16 février, à 12:01 | Répondre

    @isaac Salut, pour sa tu fait une condition avec les session et tu vérifie si l'id dans la session correspond à celui de l'url, et si il ne correspond pas soit tu affiche d'autres info ou alors tu redirige la personne vers le bon url, ce qui donnerait :

    if($_GET['id'] != $_SESSION['id']){
    ...
    }else{
    ...
    }

  • isaac Le 16 février, à 09:37 | Répondre

    primfx tes vidéos sont superbes mais j'ai un probleme,j'ai cree un espace membre avec une page profil avec ecrit dans l'url profil.php?id=l'id de la personne mais on peut le changer donc la page profil n'est pas protégé
    est ce que tu as une condition