erreurs sur pour lister les topics partie 4 cours creation forum PHP

luffy78

luffy78 Le 15 juillet 2019 à 23:19 (Édité le 15 juillet 2019 à 23:21)

Bonjour,
je suis en train de suivre la partie 4 du cours sur la création d'un forum.
J'ai ces 3 erreurs qui s'affichent sur ma page forum_topic.view.php :
1)Notice: Undefined variable: topics in C:\wamp64\www\parties\views\forum_topic.view.php on line 8
2)Fatal error: Uncaught Error: Call to a member function fetch() on null in C:\wamp64\www\parties\views\forum_topic.view.php on line 8
3)Error: Call to a member function fetch() on null in C:\wamp64\www\parties\views\forum_topic.view.php on line 8

Ma page forum_topic.php :
  <?php
require('php/config.php'); /* Connexion à la bdd */
require('php/functions.php'); /* Mes fonctions */
$bdd = new PDO('mysql:host=127.0.0.1;dbname=forum', 'root', '');
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');
?>

Ma page forum_topic.view :
<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>

Merci de votre aide
Bonne soirée !
SkinDePewDiePie_

SkinDePewDiePie_ Le 17 juillet 2019 à 09:28

Bonjour,
D'ou déja t'a une variable bdd dans "php/config.php" et dans ton fichier.
Je pense que ton problème viens de la.

Après j'peux pas t'aider plus, je laisse faire les experts.
Bonne chance pour ton forum 😀
-Matteo
luffy78

luffy78 Le 18 juillet 2019 à 18:27

Merci de ton aide mais ça ne vient pas de là. Les experts peuvent me dire ce qui ne va pas ?
ThomasLBA

ThomasLBA Le 20 juillet 2019 à 00:37 (Édité le 20 juillet 2019 à 00:38)

 Coucou,
Il n’y a pas un problème dans ta requête ?
<?php $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 = ?"; ?>

J’aurais plutôt fait :
<?php $req = "SELECT * FROM f_topics
            LEFT JOIN f_topics_categories ON f_topics_categories.id_topic = f_topics.id // C’est ici que j’ai modifié
            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 = ?"; ?>

Ah et rien à voir mais je te conseille de nommer tout en Anglais, je trouve qu’on s’y retrouve mieux au niveau des noms de variables, de tables, etc... (mais ce n’est que mon avis personnel) 😅
Après je n’ai pas très bien regardé donc il est fortement possible que je me trompe ...

En espérant avoir aidé ! Ciao ^^
luffy78

luffy78 Le 23 juillet 2019 à 22:20

Merci de ton aide ThomasLBA ! j'ai testé avec ta nouvelle requête mais ça ne fonctionne  toujours pas. Ca doit venir de la variable $t. Merci du tuyau pour nommer les noms en anglais je vais prendre en compte maintenant 😉

 while($t = $topics->fetch()) { ?>

merci
luffy78

luffy78 Le 30 juillet 2019 à 21:23

Hey guys ! toujours personne pour m'aider ? merci
SkinDePewDiePie_

SkinDePewDiePie_ Le 1 août 2019 à 15:21


Bonjour,
As-tu nommé ta variable $topics ou $topic, c'est le détail qui tue 😀

-Matteo
ThomasLBA

ThomasLBA Le 5 août 2019 à 10:02 (Édité le 5 août 2019 à 10:09)

Re !

Peut être faudrait-t-il tester la valeur de "$topics" :

      //...
      $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);
      die('<pre>'.print_r($topics).'</pre>') // ICI
Au moins pour voir à quoi ça ressemble, parce que c'est forcemment de là que vient l'erreur : PHP ne connait pas cette variable !
SkinDePewDiePie_

SkinDePewDiePie_ Le 5 août 2019 à 10:30 (Édité le 5 août 2019 à 10:43)

Bonjour,
luffy78, J'ai vu le tuto de primfx et ton code est bon, donc essaye d'update PHP, sinon essaye de passer a XAMPP.
Ou essaye sur un hébergement en ligne.

-Matteo
Klimero12

Klimero12 Le 20 septembre 2019 à 16:48

Bonjour,
Je ne sais pas si le post est toujours d’actualité mais comme Luffy, j'ai pas mal galéré au même endroit mais j'ai fini par trouver mon erreur.
Il faut vraiment suivre pas à pas le tuto car certaines tables ou champs on changés.
Après recherches j'en ai déduit ce qui suit :
Le message te dit que ta variable topic dans forum_topic.view.php n'est pas définie. Cette variable est normalement définie dans la requête préparée de forum_topic.php ligne  46 (et 47). Elle renvoie vers la variable $req lignes 32 a 37 de forum_topic.php. Elle correspond donc à tes jointures de tables.
Il faut que tu contrôles tes jointures et essayer le code dans phpmyadmin.
J'ai fini par corriger mon erreur en refaisant les jointures dans phpmyadmin est ça a fini par marcher.
Bonne journée
SkinDePewDiePie_

SkinDePewDiePie_ Le 20 septembre 2019 à 19:16

J'avais complètement oublié ce topic mdr, merci @Klimero12 de me l'avoir rappellé x)
Vous devez être connecté pour poster une réponse. Se connecter ou Créer un compte