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)
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.
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 : PHP1
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 : HTML1
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
}
?>
|
Citation : La docN'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.
Pour pouvoir créer une conversation, récapitulons ce qu'il faut :
- un ou plusieurs destinataires,
- un titre,
- un texte.
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 : PHP1
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)));
?>
|
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.