La page
voirforum.php n'est pas très différente de notre page d'index. La seule différence, c'est qu'on va afficher la liste des
topics au lieu de celle des
forums. Mais finalement, les scripts restent assez similaires.
Ce qu'on va faire
Une requête dans la base de données pour retourner toutes les infos sur le forum en question
Un tableau qui va afficher les 25 derniers topics.
Comme vous avez pu le remarquer, dans la page d'index, l'url d'un forum est de la forme :
voirforum.php?f=2.
On va donc récupérer la valeur de f qui correspond à l'id du forum qu'on va afficher.
Sans plus attendre, le début du code :
Page : voirforum.php
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 | <?php
session_start();
$titre="Voir un forum";
include("includes/identifiants.php");
include("includes/debut.php");
include("includes/menu.php");
//On récupère la valeur de f
$forum = (int) $_GET['f'];
//A partir d'ici, on va compter le nombre de messages
//pour n'afficher que les 25 premiers
$query=$db->prepare('SELECT forum_name, forum_topic, auth_view, auth_topic FROM forum_forum WHERE forum_id = :forum');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
$totalDesMessages = $data['forum_topic'] + 1;
$nombreDeMessagesParPage = 25;
$nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
?>
|
Voilà le début du code. On compte donc le nombre de messages afin de savoir combien de pages on va devoir créer. C'est exactement le même principe que dans le TP sur le Livre d'or (d'ailleurs, j'ai pris les mêmes noms de variables).
Je profite de cette requête pour récupérer les valeurs des champs
auth_view et
auth_topic : vous comprendrez plus tard pourquoi.
Maintenant, on va afficher le haut de la page, c'est-à-dire qu'on va écrire le nombre de pages et des informations sur le visiteur.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 | <?php
echo '<p><i>Vous êtes ici</i> : <a href="./index.php">Index du forum</a> -->
<a href="./voirforum.php?f='.$forum.'">'.stripslashes(htmlspecialchars($data['forum_name'])).'</a>';
//Nombre de pages
$page = (isset($_GET['page']))?intval($_GET['page']):1;
//On affiche les pages 1-2-3, etc.
echo '<p>Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
if ($i == $page) //On ne met pas de lien sur la page actuelle
{
echo $i;
}
else
{
echo '
<a href="voirforum.php?f='.$forum.'&page='.$i.'">'.$i.'</a>';
}
}
echo '</p>';
$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
//Le titre du forum
echo '<h1>'.stripslashes(htmlspecialchars($data['forum_name'])).'</h1><br /><br />';
//Et le bouton pour poster
echo'<a href="./poster.php?action=nouveautopic&f='.$forum.'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic" /></a>';
$query->CloseCursor();
?>
|
Vous remarquez au passage que l'url du lien vers le profil prend maintenant un sens

.
Le tableau
Une fois qu'on est arrivés là, on va devoir faire une requête de fou furieux pour prendre en une seule fois tout ce que l'on veut sur les forums.
Attention : on y va.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?php
//On prend tout ce qu'on a sur les Annonces du forum
$query=$db->prepare('SELECT forum_topic.topic_id, topic_titre, topic_createur, topic_vu, topic_post, topic_time, topic_last_post,
Mb.membre_pseudo AS membre_pseudo_createur, post_createur, post_time, Ma.membre_pseudo AS membre_pseudo_last_posteur, post_id FROM forum_topic
LEFT JOIN forum_membres Mb ON Mb.membre_id = forum_topic.topic_createur
LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
LEFT JOIN forum_membres Ma ON Ma.membre_id = forum_post.post_createur
WHERE topic_genre = "Annonce" AND forum_topic.forum_id = :forum
ORDER BY topic_last_post DESC');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->execute();
?>
|
Bon bah, allons détailler : comme vous avez sûrement dû le remarquer, on fait une requête qui, grâce à des jointures, associe 4 tables. La première est
forum_topic, ce qui est logique puisqu'on veut avant tout lister les différents topics du forum. On connaît l'id du membre qui a posté le premier message, et on associe alors la table
forum_membres pour connaître son nom. Ensuite, on associe la table
forum_post à forum_topic pour connaître tout ce que l'on veut sur le dernier message, et en l'occurrence, ce qui nous intéresse c'est
qui l'a posté. On repart donc sur la table
forum_membres 
, et on sort le nom du bonhomme qui a posté ce message.
Si vous avez en tête la structure du tableau listant les sujets de chaque forum du Site du Zér0, ou de la plupart des autres forums, vous comprendrez facilement pourquoi il nous faut toutes ces infos.
Euh... c'est quoi, ça ? LEFT JOIN forum_membres Ma ON Ma.membre_id = forum_post.post_createur
C'est un alias, comme on utilise deux fois la table
forum_membre, ça permet de différencier la première jointure de la seconde. La première, on la renomme
Mb, et la seconde
Ma ; ensuite, grâce au mot clé
AS, on re-renomme les champs, pour ne plus les confondre dans l'
echo qui va suivre.
Traitement des annonces !
En fait, on va faire deux tableaux : un pour les annonces et un pour les topics normaux (c'est la raison du
Where topic_genre = "Annonce"). C'est la méthode la plus simple que j'ai trouvée pour avoir les annonces toujours en haut, et les sujets à la suite.
Évidemment on peut toujours économiser une requête en ajoutant des conditions pour afficher la bonne image... On peut toujours arriver à supprimer une requête par-ci par là, cependant dans le tuto j'ai choisi de garder des méthodes simples, à vous de changer ça si vous voulez gagner un peu plus de performance.
Revenons au code :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56 | <?php
//On lance notre tableau seulement s'il y a des requêtes !
if ($query->rowCount()>0)
{
?>
<table>
<tr>
<th><img src="./images/annonce.gif" alt="Annonce" /></th>
<th class="titre"><strong>Titre</strong></th>
<th class="nombremessages"><strong>Réponses</strong></th>
<th class="nombrevu"><strong>Vus</strong></th>
<th class="auteur"><strong>Auteur</strong></th>
<th class="derniermessage"><strong>Dernier message</strong></th>
</tr>
<?php
//On commence la boucle
while ($data=$query->fetch())
{
//Pour chaque topic :
//Si le topic est une annonce on l'affiche en haut
//mega echo de bourrain pour tout remplir
echo'<tr><td><img src="./images/annonce.gif" alt="Annonce" /></td>
<td id="titre"><strong>Annonce : </strong>
<strong><a href="./voirtopic.php?t='.$data['topic_id'].'"
title="Topic commencé à
'.date('H\hi \l\e d M,y',$data['topic_time']).'">
'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a></strong></td>
<td class="nombremessages">'.$data['topic_post'].'</td>
<td class="nombrevu">'.$data['topic_vu'].'</td>
<td><a href="./voirprofil.php?m='.$data['topic_createur'].'
&action=consulter">
'.stripslashes(htmlspecialchars($data['membre_pseudo_createur'])).'</a></td>';
//Selection dernier message
$nombreDeMessagesParPage = 15;
$nbr_post = $data['topic_post'] +1;
$page = ceil($nbr_post / $nombreDeMessagesParPage);
echo '<td class="derniermessage">Par
<a href="./voirprofil.php?m='.$data['post_createur'].'
&action=consulter">
'.stripslashes(htmlspecialchars($data['membre_pseudo_last_posteur'])).'</a><br />
A <a href="./voirtopic.php?t='.$data['topic_id'].'&page='.$page.'#p_'.$data['post_id'].'">'.date('H\hi \l\e d M y',$data['post_time']).'</a></td></tr>';
}
?>
</table>
<?php
}
$query->CloseCursor();
?>
|
Voilà : on arrive au bout de la première boucle. Il n'y a pas grand-chose de compliqué à comprendre : on fait un tableau qu'on remplit avec le contenu de la requête.

Remarquez qu'on n'affiche pas un tableau vide... Enfin on pourrait, mais c'est très moche. Du coup, je vérifie avant que la requête renvoie bien au moins 1 donnée.
Sans plus attendre, les topics !
Ici encore, on va faire une requête de tarés et mettre son contenu dans un tableau. Toutefois, il faut encore vérifier que le forum contient au moins 1 topic. C'est comme pour la page d'index, il est possible que ce soit la première fois que vous mettiez les pieds sur cette page ; si ça se produit, on affiche un message et non pas le tableau.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72 | <?php
//On prend tout ce qu'on a sur les topics normaux du forum
$query=$db->prepare('SELECT forum_topic.topic_id, topic_titre, topic_createur, topic_vu, topic_post, topic_time, topic_last_post,
Mb.membre_pseudo AS membre_pseudo_createur, post_id, post_createur, post_time, Ma.membre_pseudo AS membre_pseudo_last_posteur FROM forum_topic
LEFT JOIN forum_membres Mb ON Mb.membre_id = forum_topic.topic_createur
LEFT JOIN forum_post ON forum_topic.topic_last_post = forum_post.post_id
LEFT JOIN forum_membres Ma ON Ma.membre_id = forum_post.post_createur
WHERE topic_genre <> "Annonce" AND forum_topic.forum_id = :forum
ORDER BY topic_last_post DESC
LIMIT :premier ,:nombre');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->bindValue(':premier',(int) $premierMessageAafficher,PDO::PARAM_INT);
$query->bindValue(':nombre',(int) $nombreDeMessagesParPage,PDO::PARAM_INT);
$query->execute();
if ($query->rowCount()>0)
{
?>
<table>
<tr>
<th><img src="./images/message.gif" alt="Message" /></th>
<th class="titre"><strong>Titre</strong></th>
<th class="nombremessages"><strong>Réponses</strong></th>
<th class="nombrevu"><strong>Vus</strong></th>
<th class="auteur"><strong>Auteur</strong></th>
<th class="derniermessage"><strong>Dernier message </strong></th>
</tr>
<?php
//On lance la boucle
while ($data = $query->fetch())
{
//Ah bah tiens... re vla l'echo de fou
echo'<tr><td><img src="./images/message.gif" alt="Message" /></td>
<td class="titre">
<strong><a href="./voirtopic.php?t='.$data['topic_id'].'"
title="Topic commencé à
'.date('H\hi \l\e d M,y',$data['topic_time']).'">
'.stripslashes(htmlspecialchars($data['topic_titre'])).'</a></strong></td>
<td class="nombremessages">'.$data['topic_post'].'</td>
<td class="nombrevu">'.$data['topic_vu'].'</td>
<td><a href="./voirprofil.php?m='.$data['topic_createur'].'
&action=consulter">
'.stripslashes(htmlspecialchars($data['membre_pseudo_createur'])).'</a></td>';
//Selection dernier message
$nombreDeMessagesParPage = 15;
$nbr_post = $data['topic_post'] +1;
$page = ceil($nbr_post / $nombreDeMessagesParPage);
echo '<td class="derniermessage">Par
<a href="./voirprofil.php?m='.$data['post_createur'].'
&action=consulter">
'.stripslashes(htmlspecialchars($data['membre_pseudo_last_posteur'])).'</a><br />
A <a href="./voirtopic.php?t='.$data['topic_id'].'&page='.$page.'#p_'.$data['post_id'].'">'.date('H\hi \l\e d M y',$data['post_time']).'</a></td></tr>';
}
?>
</table>
<?php
}
else //S'il n'y a pas de message
{
echo'<p>Ce forum ne contient aucun sujet actuellement</p>';
}
$query->CloseCursor();
|
On est arrivés en bas de notre page : voyons plus en détail ce code. La requête que l'on fait est très voisine de celle que l'on a utilisée pour lister les annonces, sauf qu'on limite le nombre de retours à un certain nombre. Ensuite, on remplit le nouveau tableau, et comme on liste d'abord les annonces, elles resteront toujours en haut ! Pour sélectionner les topics "normaux", il faut prendre ceux qui ne sont pas des annonces ; le signe
<> signifie "différent de".
On termine
Elle est pas belle, la vie ? Vous avez maintenant une page qui liste les topics de chaque forum. Enfin je dis avez... il reste encore à terminer en fermant les balises.
Code : PHP
Et voilà.