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 > La page poster.php > Lecture du tutoriel

La page poster.php

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 370

Plus d'informations Plus d'informations
Cette page vous permettra de créer un MP, ou d'y poster.

Pour cela, il faudra rajouter dans l'accueil de la Messagerie un lien qui renverra vers la page : poster.php.

Il faudra mettre un lien dans Lire un MP aussi, qui renverra vers la page : poster.php?id_mp=ID_MP, où ID_MP sera l'id du MP qu'on lit.

Pour plus de commodité, je vais séparer la page en deux parties.
Dans la première, ce sera s'il y a un id_mp dans l'URL, qui permettra donc de répondre.
Dans la seconde, on créera un MP.
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Répondre

On va commencer par définir l'architecture principale de la page.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
 
if(!empty($_GET['id_mp']))
{
   // La partie que l'on va faire de suite
}
 
else
{
   // La partie qui permettra de créer une nouvelle conversation
}
 
?>


Donc, pour répondre à un MP, c'est très très simple. Il suffit de faire les mêmes vérifications que pour lire un MP, de proposer un formulaire avec simplement le texte, et d'envoyer.

Je remets donc la liste des vérifications :

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
<?php
 
if(!empty($_GET['id_mp']))
   $id_mp = intval($_GET['id_mp']);
if(!isset($id_mp)) // Si on 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.');
 
$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);
 
if(!array_key_exists($id_membre, $liste_participants))
   die('Vous ne pouvez pas accèder à ce MP');
 
if($liste_participants[$id_membre]['mpp_supprimer'] == 1)
   die('Vous avez supprimé cette conversation');
 
?>


On va ajouter une dernière vérification : si la conversation a atteint le nombre maximal de messages, on affiche une erreur.

Code : PHP
1
2
3
4
5
6
<?php
 
if($infos_mp['nb_messages'] == $config['nb_max_mess_mp'])
   die('Vous ne pouvez plus répondre dans ce MP');
 
?>


Maintenant, on peut afficher le formulaire, qui sera donc très simple.

Code : HTML
1
2
3
4
5
6
7
8
<form method="post" action="poster.php?id_mp="<?php echo $id_mp; ?>">
   <fieldset>
      <label for="texte">Message</label>
      <textarea name="texte" id="texte" tabindex="1"></textarea><br /><br />
 
      <input type="submit" name="envoyer" value="Envoyer" tabindex="2" />
   </fieldset>
</form>


On cherche à mettre le message.
En général, on fait comme ça :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
 
if(isset($_POST['envoyer']) AND !empty($_POST['texte']))
{
   // On insère
}
 
else
{
   // On affiche le formulaire
}
 
?>


Le souci, c'est que si $_POST['texte'] contient des espaces vides, ce ne sera pas considéré comme vide. Il faut donc faire une autre vérification, en enlevant les espaces vides grâce à trim.
On obtient donc ceci :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
 
if(isset($_POST['envoyer']) AND trim($_POST['texte']) AND !empty($_POST['texte']))
{
   $sql = 'INSERT INTO mp_messages (mp_id, membre_id, mess_temps, mess_texte) VALUES ('.$id_mp.', '.$id_membre.', NOW(), "'.mysql_real_escape_string($_POST['texte']).'")';
   mysql_query($sql) or die(mysql_error());
 
   header('Location: voir.php?id_mp='.$id_mp);
}
 
else
{
   // On affiche le formulaire
}
 
?>


Et je cite la doc à propos des header :

Citation : La doc
N'oubliez jamais que header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.


Et voilà, ce n'était pas dur du tout. On va maintenant pouvoir créer une conversation.

Créer

Pour pouvoir créer une conversation, récapitulons ce qu'il faut :


Il y a toutefois une petite condition à vérifier : si le membre a déjà le nombre maximal de MP, il ne peut pas en créer une nouvelle.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
 
$sql = 'SELECT COUNT(*) AS nb FROM mp_participants WHERE membre_id = '.$id_membre;
$requete = mysql_query($sql) or die(mysql_error());
$nb_mp = mysql_result($requete, 0);
 
if($nb_mp == $config['nb_max_mp'])
   die('Vous ne pouvez plus créer de MP');
 
?>


On va commencer par faire notre formulaire.

Code : HTML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<form method="post" action="poster.php">
   <fieldset>
      <label for="titre">Titre</label>
      <input type="text" name="titre" id="titre" tabindex="1" /><br />
      
      <label for="destinataires">Destinataires</label>
      <textarea name="destinataires" id="destinataires" tabindex="2"></textarea><br />
 
      <label for="texte">Message</label>
      <textarea name="texte" id="texte" tabindex="3"></textarea><br /><br />
     
      <input type="submit" name="envoyer" value="Envoyer" tabindex="4" />
   </fieldset>
</form>


Maintenant on va s'attaquer à l'insertion. Le plus dur sera évidemment la liste des membres.
On commence par vérifier si l'on va insérer ou non :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<?php
 
if(isset($_POST['envoyer']) AND (trim($_POST['texte']) AND !empty($_POST['texte'])) AND (trim($_POST['destinataires']) AND !empty($_POST['destinaires']))
{
   // Insertion
}
 
else
{
 
}
 
?>


Il va falloir faire tout de même une vérification de plus, celle pour les destinataires.
Il va falloir vérifier si tous existent et, si ce n'est pas le cas, on affiche une erreur. Mais il faudra aussi ne garder qu'un certain nombre de participants, les $config['nb_participants_par_mp'] premiers.

Code : PHP
1
2
3
4
5
6
7
8
<?php
 
// On récupère la liste des participants en faisant un explode sur le nl2br de la variable
$liste_participants = explode('<br />', nl2br($_POST['destinataires']));
 
$liste_participants = array_unique(array_filter(array_map('trim', $liste_participants)));
 
?>


Le array_map applique la fonction trim à chacune des valeurs de $liste_participants. array_filter permet de supprimer les valeurs nulles ou vides. Et enfin array_unique permet d'éviter les doublons.


On prépare notre requête et on va chercher à savoir combien cela renvoie de lignes pour connaître le nombre de participants qui existent.

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
 
$pseudos_sql = '';
foreach($liste_participants as $pseudo)
{
   $pseudos_sql .= (!empty($pseudos_sql) ? ', ' : '').'"'.mysql_real_escape_string($pseudo).'"';
} // Donne $pseudos_sql = "NL", "truc", "machin"
 
// On récupère les id des membres correspondants, en utilisant à nouveau un IN, et on ne prend que ceux qui peuvent avoir un nouveau MP créé
$sql = 'SELECT m.membre_id FROM membres m WHERE membre_pseudo IN ('.$pseudos_sql.') AND (SELECT COUNT(*) FROM mp_participants WHERE mp_participants.membre_id = m.membre_id) < '.$config['nb_max_mp'];
$requete = mysql_query($sql) or die(mysql_error());
 
if(mysql_num_rows($requete) == 0)
   die('Aucun destinataire n\'existe);
 
?>


Bon, tout est prêt, on peut insérer.

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
<?php
 
$sql = 'INSERT INTO mp_sujets (mp_titre) VALUES ("'.mysql_real_escape_string($_POST['titre']).'")';
mysql_query($sql) or die(mysql_error());
 
$id_mp = mysql_insert_id(); // On récupère l'id du MP qui vient d'être créé
 
// On insère le message
$sql = 'INSERT INTO mp_messages (mp_id, membre_id, mess_temps, mess_texte) VALUES ('.$id_mp.', '.$id_membre.', NOW(), "'.mysql_real_escape_string($_POST['texte']).'")';
   mysql_query($sql) or die(mysql_error());
 
// On prépare la liste des valeurs pour le insert
$i = 0; // Une variable pour limiter le nombre de participants
$insert_sql = '('.$id_mp.', '.$id_membre.', 1)'; // Le membre actuel
while($row = mysql_fetch_assoc($requete) AND $i <= $config['nb_participants_par_mp'])
{
   if($row['membre_id'] != $id_membre) // Si ce n'est pas le membre qui envoie
   {
      $insert_sql .= ', ('.$id_mp.', '.$row['membre_id'].', 0)';
      $i++;
   }
}
mysql_free_result($requete);
 
// On insère
$sql = 'INSERT INTO mp_participants (mp_id, membre_id, mpp_lu) VALUES '.$insert_sql;
mysql_query($sql) or die(mysql_error());
 
header('Location: voir.php?id_mp='.$id_mp);
?>


La dernière boucle contient les résultats de la requête de sélection des id des membres, que l'on a fait un peu avant.
Pour l'insertion, on ne met que les champs nécessaires, tous les autres prendront la valeur par défaut ou la valeur de l'auto-incrémentation s'il y a.

Et voilà, ce n'était pas très dur, pas vrai ? On peut maintenant clôturer avec les pages pour ajouter un membre et supprimer un MP.
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 438 Zéros connectés | Requêtes SQL 8 requêtes | Temps de génération de la page : Total (SQL) 1.3092s (1.2964s)