Non affichage des tableaux PHP/SQL

Bonjour, je conçoit un site web et je suis sur le forum mais lors du test les tableaux sensé affiché les messages du forum ne s'affichent pas. j'ai fais des tests pour voir ou est le problème et y a un bout de code dans lequel rien ne s'exécute s'ait pas pourquoi. je vous poste ce code ci-dessous:

		<table>
			<?php
					//Début de la boucle
					while($data = $query->fetch())
					{
					//On affiche chaque catégorie
						if( $categorie != $data['cat_id'] )
						{
							//Si c'est une nouvelle catégorie on l'affiche
							$categorie = $data['cat_id'];
			?>
			<p>les tableaux veulent pas s'afficher!!!!</p>
						<tr>
							<th></th>
							<th class="titre"><strong><?php echo stripslashes(htmlspecialchars($data['cat_nom'])); ?>
							</strong></th>    
							<th class="nombremessages"><strong>Sujets</strong></th>
							<th class="nombresujets"><strong>Messages</strong></th>
							<th class="derniermessage"><strong>Dernier message</strong></th>
						</tr>
			<?php
			}
			//Ici, on met le contenu de chaque catégorie
			?>
			<?php
					// Ce super echo de la mort affiche tous
					// les forums en détail : description, nombre de réponses etc...

					echo'<tr><td><img src="./images/message.gif" alt="message" /></td>
					<td class="titre"><strong>
					<a href="./voirforum.php?f='.$data['forum_id'].'">
					'.stripslashes(htmlspecialchars($data['forum_name'])).'</a></strong>
					<br />'.nl2br(stripslashes(htmlspecialchars($data['forum_desc']))).'</td>
					<td class="nombresujets">'.$data['forum_topic'].'</td>
					<td class="nombremessages">'.$data['forum_post'].'</td>';

					// Deux cas possibles :
					// Soit il y a un nouveau message, soit le forum est vide
					if (!empty($data['forum_post']))
					{
						 //Selection dernier message
					 $nombreDeMessagesParPage = 15;
						 $nbr_post = $data['topic_post'] +1;
					 $page = ceil($nbr_post / $nombreDeMessagesParPage);
						 
						 echo'<td class="derniermessage">
						 '.date('H\hi \l\e d/M/Y',$data['post_time']).'<br />
						 <a href="./voirprofil.php?m='.stripslashes(htmlspecialchars($data['membre_id'])).'&amp;action=consulter">'.$data['membre_pseudo'].'  </a>
						 <a href="./voirtopic.php?t='.$data['topic_id'].'&amp;page='.$page.'#p_'.$data['post_id'].'">
						 <img src="./images/go.gif" alt="go" /></a></td></tr>';

					 }
					 else
					 {
						 echo'<td class="nombremessages">Pas de message</td></tr>';
					 }

					 //Cette variable stock le nombre de messages, on la met à jour
					 $totaldesmessages += $data['forum_post'];

					 //On ferme notre boucle et nos balises
				 }//fin de la boucle
				$query->CloseCursor();
		echo '</table></div>';
			?>


13 réponses

  1. Voici la requête:

    <code>

    <?php
    $query=$db->prepare('SELECT cat_id, cat_nom,
    forum_forum.forum_id, forum_name, forum_desc, forum_post,
    forum_topic, auth_view, forum_topic.topic_id,
    forum_topic.topic_post, post_id, post_time, post_createur,
    membre_pseudo,
    membre_id
    FROM forum_categorie
    LEFT JOIN forum_forum ON forum_categorie.cat_id =
    forum_forum.forum_cat_id
    LEFT JOIN forum_post ON forum_post.post_id =
    forum_forum.forum_last_post_idLEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
    LEFT JOIN forum_membres ON forum_membres.membre_id =
    forum_post.post_createur
    WHERE auth_view <= :lvl
    ORDER BY cat_ordre, forum_ordre DESC' );
    $query->bindValue(':lvl',$lvl,PDO::PARAM_INT);
    $query->execute();
    ?>
    1. A première vu !
      SQL : T'as oublier le GROUP BY
      PHP : Dans ton cas, c'est bindParam

      quant au reste, il faut que t'explique le rôle de chaque table, et ce que tu veux avoir comme résultat !
  2. je ne comprend pas trop comment tu fais le test si c'est une nouvelle catégorie ?

    avant ta boucle while a quelle valeur as tu initialisé la variable $categorie ??

    //On affiche chaque catégorie
    if( $categorie != $data['cat_id'] )
    {
    //Si c'est une nouvelle catégorie on l'affiche
    $categorie = $data['cat_id'];
    1. catégorie est initialisé à NULL

      il y a une table qui contiendra les catégories de forum l'autre sur les messages de chaque catégories, un pour les membres, l'autre pour les messages et les informations de chaque message, utilisée pour écrire le nom de chaque forum et leur description. etc. J'utilise le tutoriel tiré du site du zér0.
      1. Pas compris, désolé !
        Y a une jointure entre 5 tables dans ta requête !
        nom de table(champ1, champ2, ...)
        Essaye de mieux expliquer !
      2. je suis le tutoriel de Tadzoa du site du zéro donc les requêtes sont pas trop expliqué tu voie. c'est un peu du copier/coller là.
    2. Bonjour moi j'ai le même problème mais j'ai l'impression que la condition du
      while($data = $query->fetch())
      n'est pas vérifier car lorsque je regarde le code source dans le navigateur au niveau des balises <table> il n'y a rien de marquer. Quelqu'un aurait-il une idée?

      Merci d'avance
      1. peut être que ta requette n'a retourné aucun résultat, pour voir le nombre:

        //mets cette ligne juste avant ta boucle while pour avoir le nombre de résultats trouvés:
        echo $query->rowCount() . ' résultat(s)';
        
        while($data = $query->fetch())
        
        1. Bonsoir effectivement la requête ne retourne aucun résultat; j'ai 0 résultat. Je crois qu'il faudrait que je revoie ma base de données ou bien? Merci Alain_42 pour cette nouvelle astuce.
          1. je pense que tu devrait revoir ta requette, eventuellement faire afficher les erreur au moment de l'execution de celle çi

            try catch

            vas voir sur Google comment daire avec mysql PDO
            1. Bonjour jusqu'à présent j'ai pas trouver de solution à mon problème rien ne s'affiche sous la boucle while j'ai inséré un try catch dans le requête de connexion à la BD et il me retourne aucune erreur de connexion à la BD. Je pense que l'erreur est dans la requête mais j'arrive pas à la trouvé. c'est un projet que je doit rendre en fin septembre et la ch8 pas très avancé. Aider moi
              s'l vous plaît
              .
              1. Alors ta BD est vide !
              2. j'ai rempli ma BD mais pas toutes les tables je l'avoue. Je vais la remplir et je vous tient au courant.
              3. jusque là rien ne s'affiche même pas un tableau vide. Ne doit t-on pas utilisé l'extension MySQL i au lieu de MySQL pour la connexion a la BD? s
              4. Execute ça dans phpMyAdmin, :
                SELECT cat_id, cat_nom, forum_forum.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, forum_topic.topic_id, forum_topic.topic_post, post_id, post_time, post_createur, membre_pseudo, membre_id   
                
                FROM forum_categorie   
                LEFT JOIN forum_forum ON forum_categorie.cat_id = forum_forum.forum_cat_id   
                LEFT JOIN forum_post ON forum_post.post_id = forum_forum.forum_last_post_id  
                LEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id   
                LEFT JOIN forum_membres ON forum_membres.membre_id = forum_post.post_createur   
                WHERE auth_view <= :lvl   
                GROUP BY cat_id, cat_nom, forum_forum.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, forum_topic.topic_id, forum_topic.topic_post, post_id, post_time, post_createur, membre_pseudo, membre_id   
                ORDER BY cat_ordre, forum_ordre DESC


                En remplaçant biensure ":l v l" par une valeur qui existe dans ta BD !

                Si ça donne un résultat, c'est que t'a mal exécuter ta requête coté PHP !
                Si ça ne retourne aucun résultat, alors la condition "auth_view <= :lvl" est fausse, pour en être sure, enlève la condition, et re-exécute la requête !
            2. pour voir éventuellement les erreurs rajoutes les lignes de part et d'autre de la query:

              ////rajoutes cette ligne
              	$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
              	/////
              	$query=$db->prepare('SELECT cat_id, cat_nom,
              forum_forum.forum_id, forum_name, forum_desc, forum_post,
              forum_topic, auth_view, forum_topic.topic_id,
              forum_topic.topic_post, post_id, post_time, post_createur,
              membre_pseudo,
              membre_id
              FROM forum_categorie
              LEFT JOIN forum_forum ON forum_categorie.cat_id =
              forum_forum.forum_cat_id
              LEFT JOIN forum_post ON forum_post.post_id =
              forum_forum.forum_last_post_idLEFT JOIN forum_topic ON forum_topic.topic_id = forum_post.topic_id
              LEFT JOIN forum_membres ON forum_membres.membre_id =
              forum_post.post_createur
              WHERE auth_view <= :lvl
              ORDER BY cat_ordre, forum_ordre DESC' );
              $query->bindValue(':lvl',$lvl,PDO::PARAM_INT);
              //rajoutes ça pour voir les erreurs de ta requette
              if (!$query) {
              	   echo "<br />PDO::errorInfo():<br />";
              	   print_r($db->errorInfo());
              	}
              ///
              $query->execute(); 
              1. Jointure => GROUP BY
                Variable => bindParam
              2. Merci pour vos réponses.
                @JooS la requête s'exécute bien dans phpMyAdmin avec la condition et même sans la condition tous se passe bien.

                @Alain_42 voici les messages d'erreurs que je retrouve:
                Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.forum_categorie' doesn't exist'

                 Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'test.forum_categorie' doesn't exist'
            3. et ben voilà:

              Table 'test.forum_categorie' doesn't exist'

              la table forum_categorie n'existe pas
              1. Re ...

                Si ça s'est bien exécuté sous phpMyAdmin alors ça devrais aussi via PDO !

                $req = $db->prepare('SELECT cat_id, cat_nom, ff.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, ft.topic_id, ft.topic_post, post_id, post_time, post_createur, membre_pseudo, membre_id     
                
                FROM forum_categorie fc
                LEFT JOIN forum_forum ff ON fc.cat_id = ff.forum_cat_id
                LEFT JOIN forum_post fp ON fp.post_id = ff.forum_last_post_id
                LEFT JOIN forum_topic ft ON ft.topic_id = fp.topic_id
                LEFT JOIN forum_membres fm ON fm.membre_id = fp.post_createur 
                WHERE auth_view <= :lvl
                GROUP BY cat_id, cat_nom, ff.forum_id, forum_name, forum_desc, forum_post, forum_topic, auth_view, ft.topic_id, ft.topic_post, post_id, post_time, post_createur, membre_pseudo, membre_id
                ORDER BY cat_ordre, forum_ordre DESC');
                $req->bindParam(':lvl', $lvl, PDO::PARAM_INT);
                $req->execute();
                while($data = $req->fetch()) {
                  var_dump($data);  
                }


                PS : La variable $lvl doit contenir une valeur qui peut donner un résultat, essaye avec la même valeur que t'avais utiliser sous phpMyAdmin !

                Quant a la connexion vers la BD, utilise ce code pour gérer les erreurs, au lieu d'utiliser errorInfo partout ou tu va !

                try {  
                 $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;  
                    
                 $db = new PDO('mysql:host=localhost;dbname=base_de_donnees', 'root', '', $pdo_options);  
                }  
                catch (Exception $e) {  
                 die('Erreur : ' . $e->getMessage());  
                }

                Mettez en résolu quand c'est résolu -.- ...
                1. Les tableaux s'affichent maintenant le problème venait de la requête un
                  left join
                  était collé au mot qui le précédait et exécuté la requête dans phpmyadmin ma permis de découvrir cela. Merci
                  ENCORE UN Grand merci à vous car grâce à vous j'ai découvert beaucoup de chose et d'astuces en php.