TUTO PHP - Envoyer des messages privés - Avancé

PrimFX Boris ('PrimFX') Le 13 décembre 2015

Je vous ai montré comment créer un système de messagerie privée interne à votre site dans un précédent tuto... Je vous propose donc une suite à cette vidéo histoire d'y ajouter quelques fonctionnalité :-)

Code du tuto:

- reception.php
<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
$msg = $bdd->prepare('SELECT * FROM messages WHERE id_destinataire = ? ORDER BY id DESC');
$msg->execute(array($_SESSION['id']));
$msg_nbr = $msg->rowCount();
?>
<!DOCTYPE html>
<html>
<head>
   <title>Boîte de réception</title>
   <meta charset="utf-8" />
</head>
<body>
   <a href="profil.php?id=<?= $_SESSION['id'] ?>">Profil</a>    <a href="envoi.php">Nouveau message</a><br /><br /><br />
   <h3>Votre boîte de réception:</h3>
   <?php
   if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; }
   while($m = $msg->fetch()) {
      $p_exp = $bdd->prepare('SELECT pseudo FROM membres WHERE id = ?');
      $p_exp->execute(array($m['id_expediteur']));
      $p_exp = $p_exp->fetch();
      $p_exp = $p_exp['pseudo'];
   ?>
   <a href="lecture.php?id=<?= $m['id'] ?>"<?php if($m['lu'] == 1) { ?><span style="color:grey"><?php } ?><b><?= $p_exp ?></b> vous a envoyé un message<br />
      <b>Objet:</b> <?= $m['objet'] ?><?php if($m['lu'] == 1) { ?></span><?php } ?></a><br />
   -------------------------------------<br/>
   <?php } ?>
</body>
</html>
<?php } ?>
- envoi.php
<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_POST['envoi_message'])) {
      if(isset($_POST['destinataire'],$_POST['message'],$_POST['objet']) AND !empty($_POST['destinataire']) AND !empty($_POST['message']) AND !empty($_POST['objet'])) {
         $destinataire = htmlspecialchars($_POST['destinataire']);
         $message = htmlspecialchars($_POST['message']);
         $objet = htmlspecialchars($_POST['objet']);
         $id_destinataire = $bdd->prepare('SELECT id FROM membres WHERE pseudo = ?');
         $id_destinataire->execute(array($destinataire));
         $dest_exist = $id_destinataire->rowCount();
         if($dest_exist == 1) {
            $id_destinataire = $id_destinataire->fetch();
            $id_destinataire = $id_destinataire['id'];
            $ins = $bdd->prepare('INSERT INTO messages(id_expediteur,id_destinataire,message,objet) VALUES (?,?,?,?)');
            $ins->execute(array($_SESSION['id'],$id_destinataire,$message,$objet));
            $error = "Votre message a bien été envoyé !";
         } else {
            $error = "Cet utilisateur n'existe pas...";
         }
      } else {
         $error = "Veuillez compléter tous les champs";
      }
   }
   $destinataires = $bdd->query('SELECT pseudo FROM membres ORDER BY pseudo');
   if(isset($_GET['r']) AND !empty($_GET['r'])) {
      $r = htmlspecialchars($_GET['r']);
   }
   if(isset($_GET['o']) AND !empty($_GET['o'])) {
      $o = urldecode($_GET['o']);
      $o = htmlspecialchars($_GET['o']);
      if(substr($o,0,3) != 'RE:') {
         $o = "RE:".$o;
      }
   }
   ?>
   <!DOCTYPE html>
   <html>
   <head>
      <title>Envoi de message</title>
      <meta charset="utf-8" />
   </head>
   <body>
      <form method="POST">
         <!-- <select name="destinataire">
            <?php while($d = $destinataires->fetch()) { ?>
            <option><?= $d['pseudo'] ?></option>
            <?php } ?>
         </select> -->
         <label>Destinataire:</label>
         <input type="text" name="destinataire" <?php if(isset($r)) { echo 'value="'.$r.'"'; } ?> />
         <br /><br />
         <label>Objet:</label>
         <input type="text" name="objet" <?php if(isset($o)) { echo 'value="'.$o.'"'; } ?> />
         <br /><br />
         <textarea placeholder="Votre message" name="message"></textarea>
         <br /><br />
         <input type="submit" value="Envoyer" name="envoi_message" />
         <br /><br />
         <?php if(isset($error)) { echo '<span style="color:red">'.$error.'</span>'; } ?>
      </form>
      <br />
      <a href="reception.php">Boîte de réception</a>
   </body>
   </html>
<?php
}
?>
- lecture.php
<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_GET['id']) AND !empty($_GET['id'])) {
      $id_message = intval($_GET['id']);
      $msg = $bdd->prepare('SELECT * FROM messages WHERE id = ? AND id_destinataire = ?');
      $msg->execute(array($_GET['id'],$_SESSION['id']));
      $msg_nbr = $msg->rowCount();
      $m = $msg->fetch();
      $p_exp = $bdd->prepare('SELECT pseudo FROM membres WHERE id = ?');
      $p_exp->execute(array($m['id_expediteur']));
      $p_exp = $p_exp->fetch();
      $p_exp = $p_exp['pseudo'];
?>
<!DOCTYPE html>
<html>
<head>
   <title>Lecture du message #<?= $id_message ?></title>
   <meta charset="utf-8" />
</head>
<body>
   <a href="reception.php">Boîte de réception</a>    <a href="envoi.php?r=<?= $p_exp ?>&o=<?= urlencode($m['objet']) ?>">Répondre</a>    <a href="supprimer.php?id=<?= $m['id'] ?>">Supprimer</a><br /><br /><br />
   <h3 align="center">Lecture du message #<?= $id_message ?></h3>
   <div align="center">
      <?php if($msg_nbr == 0) { echo "Erreur"; } else { ?>
      <b><?= $p_exp ?></b> vous a envoyé: <br /><br />
      <b>Objet:</b> <?= $m['objet'] ?>
      <br /><br />
      <?= nl2br($m['message']) ?><br />
      <?php } ?>
   </div>
</body>
</html>
<?php
      $lu = $bdd->prepare('UPDATE messages SET lu = 1 WHERE id = ?');
      $lu->execute(array($m['id']));
   }
} 
?>
- supprimer.php
<?php
session_start();
$bdd = new PDO('mysql:host=127.0.0.1;dbname=espace_membre', 'root', '');
if(isset($_SESSION['id']) AND !empty($_SESSION['id'])) {
   if(isset($_GET['id']) AND !empty($_GET['id'])) {
      $id_message = intval($_GET['id']);
      $msg = $bdd->prepare('DELETE FROM messages WHERE id = ? AND id_destinataire = ?');
      $msg->execute(array($_GET['id'],$_SESSION['id']));
      header('Location:reception.php');
   }
} 
?>
Pour aller plus loin:
- Création d'une page "messages envoyés"
- Ajouter la date et l'heure d'envoie du message
- Possibilité d'envoyer un message privé à plusieurs personnes en même temps
- Possibilité d'ajouter une pièce jointe à un message

Bien sûr il reste encore beaucoup d'autres fonctionnalités et améliorations possibles, je vous laisse proposer les votre en commentaire 😛

A propos de l'auteur

PrimFX
Boris ('PrimFX')

Je m'appelle Boris, j'ai 22 ans et je suis passionné d'informatique. Suite à mes études (Licence Informatique puis MSc Computer Science au Trinity College Dublin), je gère l'entreprise Single Quote co-fondée en 2019 et je profite de mon temps libre pour partager ma passion à travers des vidéos & articles 😃

Votre commentaire

Vous devez être connecté pour poster un commentaire. Se connecter ou Créer un compte

Commentaires 29

  • frederic Le 10 septembre, à 10:21 | Répondre

    c'est bien meme si je n'ai pas encore essaye mais la base de donnees ou est-elle?

  • POL1 Le 8 mars, à 18:36 (Édité le 8 mars 2020 à 18:44) | Répondre

    D'abord bonjour !
    @doOb23 peut-être faut-il enclencher dans ton .htaccess l'option display_errors comme ça :
    php_flag display_errors on
    car peut-être que les messages/avertissement/erreurs php ne s'affichent pas.

    Ensuite je peux te proposer de mettre une valeur par défaut à la colonne "lu" ou à l'envoi/réponse d'un message mettre une valeur à lu.

    Peut-être partager ton code par pastebin serait aussi une solution ? Je suis disponible pour le revoir et essayer de déceler une possible erreur.

    ======

    @traka tu peux regarder du côté de $bdd->query("REQUETE");
    Exemple (code non testé) :
    https://pastebin.com/ENRjjmxB
    Je t'invite fortement à faire des recherches par toi même.

    En espérant vous être utile,
    PØL1

  • traka Le 18 août, à 17:34 | Répondre

    @GLORIA @GLORIA @GLORIA @RootV
    Bonsoir / dans la partie lecture.php comment peut faire pour afficher tous les messages envoyer par l'expediteur Merci! Pour votre aide

  • GLORIA Le 9 mai, à 00:48 | Répondre

    salut rootv
    pour ton problème essaye un peu de supprimer cette ligne if(isset($_GET['id']) AND !empty($_GET['id'])) mais tu gardes bien l'accolade je crois que tu auras un résultat par contre cela va certainement modifier ton id.

  • RootV Le 9 mars, à 14:01 | Répondre

    le resultat m'affiche un ecran blanc
    <?php
    session_start();
    require('config/database.php');
    require('includes/functions.php');



    if(isset($_SESSION['user_id']) AND !empty($_SESSION['user_id'])) {

    if(isset($_GET['id']) AND !empty($_GET['id'])) {
    $id_message = intval($_GET['id']);

    $msg = $db->prepare('SELECT * FROM message WHERE id = ?');
    $msg->execute(array($_GET['id']));
    $msg_nbr = $msg->rowCount();

    ?>

    <!DOCTYPE html>
    <html>
    <head>
    <title>Lecture du message #<?= $id_message ?></title>
    <meta charset="utf-8" />
    </head>
    <body>
    <a href="send.php">Nouveau message</a>&nbsp;&nbsp;&nbsp;<a href="profile.php">Mon profile</a><br />
    <h3>Lecture du message #<?= $id_message ?></h3>

    <?php
    if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; }
    while($m = $msg->fetch()) {
    $p_exp = $db->prepare('SELECT pseudo FROM users WHERE id = ?');
    $p_exp->execute(array($m['id_expediteur']));
    $p_exp = $p_exp->fetch();
    $p_exp = $p_exp['pseudo'];
    ?>
    <b><?= $p_exp ?></b> vous a envoyé: <br />
    <?= nl2br($m['message']) ?><br />
    -------------------------------------<br/>

    <?php } ?>

    </body>
    </html>

    <?php
    }
    }
    ?>

  • RootV Le 9 mars, à 14:00 | Répondre

    je un resulat qui m'affiche un ecran blanc a ce niveau
    <?php
    session_start();
    require('config/database.php');
    require('includes/functions.php');



    if(isset($_SESSION['user_id']) AND !empty($_SESSION['user_id'])) {

    if(isset($_GET['id']) AND !empty($_GET['id'])) {
    $id_message = intval($_GET['id']);

    $msg = $db->prepare('SELECT * FROM message WHERE id = ?');
    $msg->execute(array($_GET['id']));
    $msg_nbr = $msg->rowCount();

    ?>

    <!DOCTYPE html>
    <html>
    <head>
    <title>Lecture du message #<?= $id_message ?></title>
    <meta charset="utf-8" />
    </head>
    <body>
    <a href="send.php">Nouveau message</a>&nbsp;&nbsp;&nbsp;<a href="profile.php">Mon profile</a><br />
    <h3>Lecture du message #<?= $id_message ?></h3>

    <?php
    if($msg_nbr == 0) { echo "Vous n'avez aucun message..."; }
    while($m = $msg->fetch()) {
    $p_exp = $db->prepare('SELECT pseudo FROM users WHERE id = ?');
    $p_exp->execute(array($m['id_expediteur']));
    $p_exp = $p_exp->fetch();
    $p_exp = $p_exp['pseudo'];
    ?>
    <b><?= $p_exp ?></b> vous a envoyé: <br />
    <?= nl2br($m['message']) ?><br />
    -------------------------------------<br/>

    <?php } ?>

    </body>
    </html>

    <?php
    }
    }
    ?>

  • rick_91 Le 1 novembre, à 17:27 | Répondre

    slt cest encore moi ...souci au niveau des messages reçus et envoyés .En fait je voudrais que lorsqu on clique sur repondre que l utilisateur est en vue la liste de ses messages envoyés et reçus mais juste pour celui avec qui il est entrain de tchatté .

  • rick_91 Le 25 octobre, à 21:50 | Répondre

    slt slt svp j'ai vraiment besoin d'un coup de main...
    bon voilà: j'ai suivi le tuto et je voudrai ajouter à ma page envoi.php un recapitulatif des msg envoyés et reçus par l'utilisateur en question mais uniquement lorsqu'il clique sur repondre à un message. cmt proceder jvous prie ?

  • MULINDA Le 25 août, à 08:58 | Répondre

    Vraiment je manque le mot pour te remercier. J’étais un nul en informatique et en programmation mais grâce à vous, j’évolue et j'envisage déjà de devenir un programmeur pro en php.

  • sissou_samia Le 7 juin, à 12:50 | Répondre

    Bonjoour. je veut faire une boite d'envoi mais j'arrive pas . S'il vous plaît aidez moi a le faire

  • Codeurcssdu45 Le 6 mars, à 18:23 | Répondre

    Page blanche..

  • timotheefredy Le 24 août, à 22:47 | Répondre

    s.il vous plait pouvez vous m'aider a ajouter a ce tuto une option de pièce jointe SVP? ??

  • eziom Le 14 mai, à 19:36 | Répondre

    moi marche pas :(

  • pok Le 22 avril, à 13:45 | Répondre

    Juste ce que je cherchais!!! Chapeau l'artiste

  • kc_sagesse Le 21 février, à 12:33 | Répondre

    merci pour ce ke tu fais pour les debutants

  • layali Le 15 février, à 12:43 | Répondre

    Coucou j'ai un souci sur la page réception, l'id du message s'affiche plusieurs foi car c'est dans une boucle comment faire pour afficher le dernier id entré dans la table?car il ne veut pas passer dans l'url

  • layali Le 15 février, à 11:16 | Répondre

    Coucou j'ai un souci sur la page réception, l'id du message s'affiche plusieurs foi car c'est dans une boucle comment faire pour afficher le dernier id entré dans la table?car il ne veut pas passer dans l'url

  • Martin4952 Le 22 décembre, à 11:01 | Répondre

    @Primfx ton tuto est comme d'hab super ! Tu devrais mettre ce systeme de messages privés sur ton site car quand j'ai envie par exemple de parler a toi ou a @Thibault_Feugere je dois passer par les commentaires... mais bon ton site est comme meme super génial !

  • PaulLavieille Le 21 décembre, à 13:50 | Répondre

    @Clouder Oui, mon skype c'est paullavieille ;)

  • Clouder Le 21 décembre, à 11:59 | Répondre

    @PaulLavieille Tu as Skype ? :)

    Ou je peux te poster ça ici aussi si tu veux :p

  • PaulLavieille Le 21 décembre, à 11:46 | Répondre

    @Clouder Oui je veux bien :P

  • Clouder Le 21 décembre, à 11:31 | Répondre

    @PaulLavieille Si tu veux je peux t'expliquer ça en te détaillant comment je fais :)

  • PaulLavieille Le 21 décembre, à 08:34 | Répondre

    @Clouder A sympas ^^
    J'avais essayé mais je n'ai pas réussi x)

  • Clouder Le 21 décembre, à 01:27 | Répondre

    @PaulLavieille oui je sais très bien ^^ justement pour mon site je suis partis de son tchat que j'ai amélioré car j'ai restreint pour deux personnes avec pleins de sécurité et j'ai un petit script qui recharge juste les messages s'il y en a sinon il fait rien et je suis juste parti de son tuto et j'ai mis mes idées :)

  • PaulLavieille Le 20 décembre, à 23:34 | Répondre

    @Clouder Oui mais c'est pas du tout optimisé, c'est bien si il n'y en a qu'un. Aussi il a déjà fais un tuto pour un chat ;)

  • Clouder Le 20 décembre, à 20:40 | Répondre

    @PaulLavieille pas forcément tu peux tout réaliser en php puis avec un tout petit script en javascrip (genre 5/6 lines) tu fais appel à une autre page qui te recharge uniquement ce dont tu as besoin :)

  • PaulLavieille Le 19 décembre, à 20:59 | Répondre

    @PrimFX Pour tes prochains articles avec les vidéos, tu pourrais faire un screen de la partie PhPMyAdmin ici ? Car j'arrive pas à suivre ta vidéo pour les MP :(

  • PaulLavieille Le 19 décembre, à 20:58 | Répondre

    @Clouder Pour faire une messagerie instantanée il faudrait utiliser d'autres langage que Php :/

  • Clouder Le 16 décembre, à 14:00 | Répondre

    Salut Prim ! :)

    Super le tuto je pensais que tu allais faire une messagerie du style tchat mais qu'avec deux personnes mais c'est tout aussi cool. :D