Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zéro > Les tutoriels > Non-Officiels > Site Web > PHP > Systèmes complets > Messagerie privée à plusieurs participants > Le système > Lire un MP > Lecture du tutoriel

Lire un MP

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)
Avatar
Auteur : NL
Visualisations : 1 210

Plus d'informations Plus d'informations
Cette page affichera la liste des participants du MP, et surtout les messages.

Comme je l'ai indiqué au début, je pars du principe que vous avez créé un système de membres, et l'id du membre qui va sur la page est $id_membre.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Les informations sur le MP

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 :


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 : PHP
1
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 : SQL
1
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 : PHP
1
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 : PHP
1
2
3
4
5
6
<?php
 
if($liste_participants[$id_membre]['mpp_supprimer'] == 1)
   die('Vous avez supprimé cette conversation');
 
?>


Vous pourriez faire d'autres vérifications, comme compter le nombre de membres (un simple count sur le tableau) et voir si cela vaut moins de 1. Idem pour le nombre de messages, surtout que l'on a déjà récupéré la valeur.


Une dernière petite touche. Si le membre n'avait pas lu le MP, on le met comme lu.

Code : PHP
1
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.

La requête et traitement des données

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 : SQL
1
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 ?
Chapitre précédent Sommaire Chapitre suivant
Retour en haut Retour en haut


Créé : le 08/09/2007 à 08:04:36
Modifié : le 22/08/2008 à 15:52:17
Avancement : 100%
Licence : Copie non autorisée

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | RSS tutoriels | RSS news
Édité par Simple IT SARL : Nous contacter | Notre blog | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 191 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 0.0633s (0.0515s)