Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Quelques petites vérifications
Avant d'afficher la liste des messages et des participants, on va d'abord faire quelques vérifications.
Il faut regarder si :
- le MP existe ;
- le membre fait partie de la liste des participants ;
- le membre n'a pas supprimé le MP, auquel cas il n'y a plus accès.
Avant que vous ne lisiez, sachez que pour les erreurs (id du mp inexistant, MP inexistant, ...) j'utilise die('texte').
Est-ce que le MP existe ?
Plutôt que de faire un
COUNT et ensuite une autre requête pour récupérer, on va faire comme ceci :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | <?php
if(!empty($_GET['id_mp']))
$id_mp = intval($_GET['id_mp']);
if(!isset($id_mp)) // Si on n'a pas d'id
die('Vous n\'avez pas choisi de MP');
$sql = 'SELECT mps.mp_id, mp_titre, (SELECT COUNT(*) FROM mp_messages mpm WHERE mpm.mp_id = mps.mp_id) AS nb_messages
FROM mp_sujets mps
WHERE mps.mp_id = '.$id_mp;
$requete = mysql_query($sql) or die(mysql_error());
if(!($infos_mp = mysql_fetch_assoc($requete))
die('Le MP n\'existe pas.');
?>
|
On récupère donc les informations nécessaires, et ensuite on met le tout dans
$infos_mp.
Et c'est là qu'apparaît quelque chose qui est peut-être nouveau pour vous :
Code : PHP1
2
3
4
5
6 | <?php
if(!($infos_mp = mysql_fetch_assoc($requete))
die('Le MP n\'existe pas.');
?>
|
Si vous lisez la doc sur
mysql_fetch_assoc, vous pouvez voir que la fonction renvoie
FALSE s'il n'y a pas de ligne. Donc si le MP n'existe pas, ça ne renvoie pas de ligne, et l'erreur s'affiche.
Le membre fait-il partie des participants ?
Maintenant que nous avons nos informations générales sur le MP, on peut chercher la liste des participants et voir si le
membre en fait partie ou non.
La requête :
Code : SQL1
2
3
4
5 | SELECT mpp.membre_id, m.membre_pseudo, mpp_lu, mpp_supprimer
FROM mp_participants mpp
LEFT JOIN membres ON u.membre_id = mpp.membre_id
WHERE mp_id = '.$id_mp.'
ORDER BY username ASC
|
Rien de bien compliqué à l'horizon. On récupère toutes les informations sur les participants et aussi leurs pseudos.
On va tout mettre dans un
tableau dont la clé sera l'id du membre, que l'on parcourra plus tard pour afficher la liste.
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | <?php
$liste_participants = array();
$sql = 'SELECT mpp.membre_id, m.membre_pseudo, mpp_lu, mpp_supprimer
FROM mp_participants mpp
LEFT JOIN membres ON u.membre_id = mpp.membre_id
WHERE mp_id = '.$id_mp.'
ORDER BY username ASC';
$requete = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_assoc($requete))
{
$liste_participants[$row['membre_id']] = $row;
}
mysql_free_result($requete);
?>
|
Et maintenant on peut vérifier si le membre a le droit de voir la conversation. Pour ça, on va utiliser
array_key_exists, qui permet de savoir si une clé existe dans un tableau.
Code : PHP1
2
3
4
5
6 | <?php
if(!array_key_exists($id_membre, $liste_participants))
die('Vous ne pouvez pas accèder à ce MP');
?>
|
Le point d'exclamation permet de dire "Si l'id du membre n'est pas une clé du tableau".
Le membre a-t-il supprimé le MP ?
Si le membre a supprimé le MP, on affiche une erreur. Très simple : on prend la
valeur de mpp_supprimer dans
liste_participants quand
la clé vaut $id_membre.
Code : PHP1
2
3
4
5
6 | <?php
if($liste_participants[$id_membre]['mpp_supprimer'] == 1)
die('Vous avez supprimé cette conversation');
?>
|
Une dernière petite touche. Si le membre n'avait pas lu le MP, on le met comme lu.
Code : PHP1
2
3
4
5
6
7
8
9 | <?php
if($liste_participants[$id_membre]['mpp_lu'] == 0)
{
$sql = 'UPDATE mp_participants SET mpp_lu = 1 WHERE membre_id = '.$id_membre.' AND mp_id = '.$id_mp;
mysql_query($sql) or die(mysql_error());
}
?>
|
Bien : toutes les vérifications sont faites, on peut préparer notre requête pour récupérer tous les messages.
Avant toute chose, on va commencer par afficher la liste des participants. Pour ça, un simple
foreach sur le tableau.
Code : PHP 1
2
3
4
5
6
7
8
9
10 | <p>
<?php
foreach($liste_participants as $element)
{
echo htmlspecialchars(stripslashes($element['membre_pseudo']));
}
?>
</p>
|
Bien sûr, vous pourriez mettre le pseudo dans un lien, mettre le pseudo en barré si le membre a supprimé le MP.
Maintenant, on s'occupe de la pagination :
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | <?php
$nb_pages = ceil($infos_mp['nb_messages'] / $config['nb_mess_mp_par_page']);
if(!empty($_GET['page']))
$page_actuelle = intval($_GET['page']);
else
$page_actuelle = 1;
// Je préfère effectuer quelques vérifications, au cas où
if($page_actuelle < 1) // Si la page actuelle est inférieure à 1, alors on la met à 1
$page_actuelle = 1;
if($page_actuelle > $nb_pages) // Si la page actuelle est supérieure au nombre de pages, alors on la met au nombre de pages
$page_actuelle = $nb_pages;
// On calcule le numéro du premier message pour le limit de la requête
$start = ($page_actuelle - 1) * $config['nb_mess_mp_par_page'];
?>
|
Bon, c'est comme tout à l'heure, seules les variables changent.
Cette fois-ci, la requête est bien plus courte et bien plus simple. Pas besoin de vous expliquer, je pense.
Code : SQL1
2
3
4
5
6 | SELECT mess_id, mpm.membre_id, DATE_FORMAT(mess_temps, "%e %c %Y à %kh%i") AS mess_temps, mess_texte, m.membre_pseudo
FROM mp_messages mpm
LEFT JOIN membres m ON m.membre_id = mpm.membre_id
WHERE mpm.mp_id = '.$id_mp.'
ORDER BY mess_temps ASC
LIMIT '.$start.', ".$config['nb_mess_mp_par_page'];
|
Je crois qu'il est inutile que je développe plus. Vous avez la requête, il suffit de l'exécuter et de faire une boucle, puis d'afficher.
Cette page est extrêmement simple et rapide, mais il ne fallait oublier les vérifications.
Bien, si nous passions à poster.php ?