Partage
  • Partager sur Facebook
  • Partager sur Twitter

while qui ne se fait pas respecter

    22 décembre 2024 à 17:02:10

    Vous connaissez tous messenger ?

    vous avez une liste de pseudos , vous cliquez dessus, ca ouvre la conversation

    Ben la le but est le meme sauf que la ... non ca ouvre pas la bonne converssation 

    jm'explique :

    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', TRUE);
    ini_set('display_startup_errors', TRUE);
    ?>
    <div class="menu_cote2" id ="menu_cote2">
     <nav id="menu_nav2" class="content">  
     <ul> 
      <li class="menu_item2" id ="menu_item2">
        MES MESSAGES
      </li>   
      </ul>
    <?php
     // MESSAGE DONT JE SUIS LE DESTINATAIRE
     $id_membre = $_SESSION['membre']['id_membre'];
     $nveau_msg = $db->prepare('SELECT DISTINCT * FROM messagerie WHERE id_destinataire=:id_destinataire ');
     $nveau_msg->execute(['id_destinataire' => $id_membre ]);
      // TANT QUE J AI DES MESSAGES
      while( $vous_avez_un_nouveau_msg = $nveau_msg -> fetch()  ) 
    { 
      // RECHERCHE INFO MEMBRE AUTEUR
      $id=$vous_avez_un_nouveau_msg['id_auteur'];
      //echo $id;
      $id_auteur = $db->prepare('SELECT DISTINCT * FROM membre WHERE id_membre=:id ');
      $id_auteur->execute(['id' => $id]);
      $auteur = $id_auteur -> fetch();
    ?>   
      <ul>
       <li class="menu_item2" id ="menu_item2">
        <img src=" <?php echo $auteur['photo_profil']; ?>"onclick="afficher('messagerie'),toggleDiv('menu_nav2')" > 
         <?php
       echo $auteur['pseudo'];
    ?>
    </a>
      </li>
     </ul>
    <?php   
     } 
    ?>
     </nav> 
    </div>
    
    <!--<script src="inc/js/messagerie.js"></script> --!>
    <?php
    include("message.php");
    ?>
    

    ce code  affiche la liste de mes contacts et leur photos tant que j'ai des messages et elle appelle la page message.php a chaque fois que l'on clique sur l'image

    message.php
    
    <?php
    if(!internauteEstConnecte()) {header("location:connexion.php#cadre");}
    if(internauteEstConnecte())
     {
    ?>
     <nav id="messagerie" class ="discution" >
      <p align="right"><input type="button" name="B1"
      value="  X  " onclick="afficher()"></p>
    <?php   
       error_reporting(E_ALL);
       ini_set('display_errors', TRUE);
       ini_set('display_startup_errors', TRUE); 
       echo' Vous discutez avec '.$auteur['pseudo'] ;
    //echo'<br>';  
    //echo $id;
    //echo'<br>'; 
    ?>
       <div class="scroll" id="scroll">
        <div class="scroll_content" id="scroll_content">
         <script>
          // Embed PHP variable directly into JavaScript
          var getid = "<?php echo $id; ?>"; // Ensure correct PHP embedding of variable
          // Set an interval to load messages every 500 milliseconds
          setInterval(load_message, 500);
          function load_message()
           {
           // Use the getid JavaScript variable properly
           $('#scroll_content').load('inc/recupmessages.inc.php', {id: getid});
           }
          </script>
         </div> 
        </div>
        <br>
        <br>
        <tr>
         <td>
          <div id ="messageBox">
           <input type="text" id="messageInput" placeholder="Écrivez un message">
           <button id="sendButton">Envoyer</button>     
          </div>  
         </td>
        </tr>
       </nav>
       <script src="inc/js/systeme_messagerie.js"></script>
    <?php   
    //if (isset($_POST['message']))
    //{
    //var_dump($_POST['message']);
       if (isset($_POST['message'])) 
        {
        $tonmessage= $_POST['message'];
        $insertmessage = $db->prepare('INSERT INTO messagerie (id_auteur, id_destinataire, message) VALUE(?,?,?)');
        $insertmessage -> execute($_SESSION['membre']['id_membre'], $id ,$tonmessage);
        echo 'ok';
        } 
    ?>
        <br>
        <br> 
        <script src="inc/js/discution.js"></script>
        <noscript> Pour utiliser ce site, merci d'activer JavaScript.</noscript>
        <br>
        <br>
    <?php 
        }
    ?>
    </body>

     le code en js  va aller chercher les conversations via recup_message.php et les afficher dans le div adequat

    et voila ou est le probleme : pour tout ce qui est affichage des contacts pas de soucis la liste des contacts et leurs photos s'affichent, le while s'applique impeccable

    mais quand je clique sur la photo c'est toujours la meme convers qui s'ouvre

    1ere chose qui ne va pas : le echo $auteur['pseudo'] n'est pas bon 

    2eme chose qui ne va pas : le $id qui permet de trouver la conversation ne correpond pas a l'image 

    c'est donnees sont pourtant crées dans le while  de nveau_msg.inc.phpqui devrait les renouveller a chaque fois 

    mais on dirait que ce while ne s'applique pas une fois la requete js lancee 

    une piste ? le fichier message php est appelle en include hors du while mais si j'essaie de le mettre dedans ca cree un grand espace entre chaque photos/pseudo qui doit correspondre a la taille du div qui est appelle mais qui n'est pas affiché car le code javascript n'est pas appellé

     help me !!

    -
    Edité par YvesmanCacestprive 22 décembre 2024 à 17:17:44

    • Partager sur Facebook
    • Partager sur Twitter
      23 décembre 2024 à 0:50:57

      Salut

      Est-ce qu'on a quelque part à disposition le code de la fonction JavaScript afficher() ? Actuellement, je me demande comment elle sait quelle conversation afficher selon le contact voulu. Je ne vois pas d'information spécifique au niveau du HTML et ne peut voir où mieux regarder sans le code JavaScript. Attention : pour rappel, le PHP que tu nous montres ne fait que générer du HTML, et le JavaScript n'a accès qu'à ce HTML généré, pas au PHP. Donc le JavaScript fonctionne sur ce que tu vois quand tu fais Ctrl + U dans ton navigateur quand tu ouvres la page.

      Pour le code strictement PHP, il me semble faire ce à quoi tu t'attends. Je relèverai quelques éléments dans le code fourni au moment de rédiger ce message, éléments qui pourraient être partie du problème.

      • Le code HTML de la liste des messages disponible lors de l'écriture de celui-ci me semble problématique à plusieurs niveaux :
        • il va créer un <ul> ainsi qu'un <li> à chaque message, mais sans le fermer. Donc on va imbriquer des listes ;
        • il y a un </a> qui traîne sans qu'il n'y ait son équivalent ouvrant.
      • Les lignes 2 à 4 ne devraient pas être nécessaires sur un véritable environnement de développement bien configuré. Utiliser un serveur distant n'est pas une bonne pratique.
      • Je te propose de regarder les possibilités des balises <details> et <summary>.
      • DISTINCT me paraît inutile quand tu fais un SELECT … WHERE id = …, parce que l'ID est sensé être unique et donc il ne devrait pas y avoir plusieurs résultats. A moins que tu nous aies fourni un code nettoyé. Si c'est le cas, note que ça peut poser des problèmes de compréhension.
      • Une requête dans une boucle, ce n'est pas optimal au niveau performances. Je t'enjoins à nouveau à te familiariser avec les jointures.

      -
      Edité par Ymox 23 décembre 2024 à 0:52:00

      • Partager sur Facebook
      • Partager sur Twitter
        23 décembre 2024 à 11:26:52

        Salut

        Est-ce qu'on a quelque part à disposition le code de la fonction JavaScript afficher() ?

        La fonction afficher() ne sert qu'a fermer la fenetre si on clique dessus

        Actuellement, je me demande comment elle sait quelle conversation afficher selon le contact voulu.

        elle ne fait que fermer la page courante

        Je ne vois pas d'information spécifique au niveau du HTML et ne peut voir où mieux regarder sans le code JavaScript.

        il n'y a pas de code particulier pour cette fonction

        Attention : pour rappel, le PHP que tu nous montres ne fait que générer du HTML, et le JavaScript n'a accès qu'à ce HTML généré, pas au PHP. Donc le JavaScript fonctionne sur ce que tu vois quand tu fais Ctrl + U dans ton navigateur quand tu ouvres la page.

        ok

        Pour le code strictement PHP, il me semble faire ce à quoi tu t'attends. Je relèverai quelques éléments dans le code fourni au moment de rédiger ce message, éléments qui pourraient être partie du problème.

        • Le code HTML de la liste des messages disponible lors de l'écriture de celui-ci me semble problématique à plusieurs niveaux :
          • il va créer un <ul> ainsi qu'un <li> à chaque message, mais sans le fermer. Donc on va imbriquer des listes ;
        si tu regardes bien tu verras que le while se ferme apres les balises de fermeture donc c'est bon
          • il y a un </a> qui traîne sans qu'il n'y ait son équivalent ouvrant.
        supprimé
        Les lignes 2 à 4 ne devraient pas être nécessaires sur un véritable environnement de développement bien configuré. Utiliser un serveur distant n'est pas une bonne pratique.
        ces lignes seront supprimées quand le code sera fonctionnel
        les balises details et summary ne sont pas suffisantes en effet il faut non seulement qu'une balise s'ouvre mais aussi que d'autres se ferment pour ca j'ai besoin d'une fonction js
        • DISTINCT me paraît inutile quand tu fais un SELECT … WHERE id = …, parce que l'ID est sensé être unique et donc il ne devrait pas y avoir plusieurs résultats. A moins que tu nous aies fourni un code nettoyé. Si c'est le cas, note que ça peut poser des problèmes de compréhension.
        le distinct peut servir en cas ou une personne aurait poste plusieurs fois le meme messages et  peut servir de protection contre le flood
        • Une requête dans une boucle, ce n'est pas optimal au niveau performances. Je t'enjoins à nouveau à te familiariser avec les jointures.
        je ne trouve pas de documentation adequate pour une jointure avec plusieurs conditions differentes


        -
        Edité par YvesmanCacestprive 23 décembre 2024 à 11:28:58

        • Partager sur Facebook
        • Partager sur Twitter
          24 décembre 2024 à 0:50:49

          YvesmanCacestprive a écrit:

          La fonction afficher() ne sert qu'a fermer la fenetre si on clique dessus […] elle ne fait que fermer la page courante

          Mmm, une fonction afficher() qui, donc, masque quelque chose ? Si elle fait aussi l'affichage (donc permute entre affiché/masqué), je peux comprendre, sinon pour moi, le nom n'est pas assez parlant. Mais ce n'est pas mon code.

          YvesmanCacestprive a écrit:

          si tu regardes bien tu verras que le while se ferme après les balises de fermeture donc c'est bon

          Au temps pour moi, j'ai effectivement mal placé l'accolade fermante qui se trouve bien après.  :honte:

          YvesmanCacestprive a écrit:

          ces lignes seront supprimées quand le code sera fonctionnel

          Ça reste une mauvaise pratique, d'autant pour un projet qui semble avoir une certaine ampleur. Mieux vaut deux machines correctement configurées — voire deux hôtes virtuels sur la même machine, un pour le débogage et l'autre pour la production — qu'une seule, distante, pour laquelle tu dois faire ce genre de trucs. Le jour ou c'est en production et que tu dois faire du débogage, tu laisseras les messages d'erreur pour tout le monde juste parce que toi tu en as besoin ? Pas vraiment une bonne idée. Tandis qu'une machine en local qui de toute manière affiche les erreurs, non seulement tu n'as pas à changer le code pour les voir, mais en plus une fois la correction effectuée, tu as juste à envoyer le nouveau code sans re-changer autre chose.

          YvesmanCacestprive a écrit:

          les balises details et summary ne sont pas suffisantes en effet il faut non seulement qu'une balise s'ouvre mais aussi que d'autres se ferment pour ca j'ai besoin d'une fonction js

          Alors normalement pas, l'attribut name devrait permettre ce comportement sans JavaScript. Il semble que le support soit suffisamment bon actuellement.

          YvesmanCacestprive a écrit:

          le distinct peut servir en cas ou une personne aurait poste plusieurs fois le meme messages et peut servir de protection contre le flood

          Donc ce n'est pas la vraie requête, si je comprends bien. OK.

          YvesmanCacestprive a écrit:

          je ne trouve pas de documentation adequate pour une jointure avec plusieurs conditions differentes

          Cela peut s'expliquer facilement ici si tu le souhaites, et ainsi avec le contexte.


          La ligne include("message.php") fait partie du premier code, ou c'est une erreur de formatage lors de l'envoi du message ici ? Si elle n'en fait pas vraiment partie, où est-elle réellement ?

          Si elle fait partie du code, message.php, inclus dans le premier script, n'affiche en fait jamais que la discussion avec le dernier pseudo. La variable $id est écrasée à chaque tour de boucle pour lister les pseudos, mais existe toujours après celle-ci quand le script message.php est inclus et donc exécuté. Du coup, c'est aussi ce qui est utilisé dans la requête AJAX effecuée avec load().
          Outre le fait qu'au moment où le script message.php est inclus dans la page, on n'a pas connaissance d'un potentiel choix, on n'a apparemment pas de quoi en prendre compte à un moment ou un autre (le </a> qui traînait ?).

          Si j'ai vu juste, tu devrais à mon sens :

          • soit ajouter des liens qui vont "recharger" la page, mais avec l'ID du correspondant (?id_correspondant=…, par exemple), et seulement dans ce cas inclure message.php en s'assurant d'y utiliser non pas $id tel que défini dans la boucle, mais l'ID repris du lien ($_GET['id_correspondant']). C'est du HTML et PHP, pas besoin de JavaScript ici.
          • soit ne pas inclure message.php, et utiliser JavaScript pour :
            • ajouter un écouteur de clic sur les pseudos de la liste ;
            • récupérer l'ID du correspondant quand un des pseudos est cliqué (un ajout dans la liste doit être fait) ;
            • le passer à load().

          -
          Edité par Ymox 24 décembre 2024 à 0:51:26

          • Partager sur Facebook
          • Partager sur Twitter
            25 décembre 2024 à 12:06:56

            Ymox a écrit:

            YvesmanCacestprive a écrit:

            La fonction afficher() ne sert qu'a fermer la fenetre si on clique dessus […] elle ne fait que fermer la page courante

            Mmm, une fonction afficher() qui, donc, masque quelque chose ? Si elle fait aussi l'affichage (donc permute entre affiché/masqué), je peux comprendre, sinon pour moi, le nom n'est pas assez parlant. Mais ce n'est pas mon code.

            justement oublions ce bout de code sans interet pour nous concentrer sur le probleme enoncé

            YvesmanCacestprive a écrit:

            si tu regardes bien tu verras que le while se ferme après les balises de fermeture donc c'est bon

            Au temps pour moi, j'ai effectivement mal placé l'accolade fermante qui se trouve bien après.  :honte:

            no souci 

            YvesmanCacestprive a écrit:

            ces lignes seront supprimées quand le code sera fonctionnel

            Ça reste une mauvaise pratique, d'autant pour un projet qui semble avoir une certaine ampleur. Mieux vaut deux machines correctement configurées — voire deux hôtes virtuels sur la même machine, un pour le débogage et l'autre pour la production — qu'une seule, distante, pour laquelle tu dois faire ce genre de trucs.

            je sais mais j'ai du mal a lancer mon server local

            Le jour ou c'est en production et que tu dois faire du débogage, tu laisseras les messages d'erreur pour tout le monde juste parce que toi tu en as besoin ? Pas vraiment une bonne idée. Tandis qu'une machine en local qui de toute manière affiche les erreurs, non seulement tu n'as pas à changer le code pour les voir, mais en plus une fois la correction effectuée, tu as juste à envoyer le nouveau code sans re-changer autre chose.

            justement je fais en sorte que le site ne comporte aucune erreurs 

            pour le moment meme si il est en ligne je n'ai pas encore cree de commu et  n'ai fait encore aucune publicite et donc personne n'est inscrit dessus 

            YvesmanCacestprive a écrit:

            les balises details et summary ne sont pas suffisantes en effet il faut non seulement qu'une balise s'ouvre mais aussi que d'autres se ferment pour ca j'ai besoin d'une fonction js

            Alors normalement pas, l'attribut name devrait permettre ce comportement sans JavaScript. Il semble que le support soit suffisamment bon actuellement.

            si ca marche pourquoi changer ?

            YvesmanCacestprive a écrit:

            le distinct peut servir en cas ou une personne aurait poste plusieurs fois le meme messages et peut servir de protection contre le flood

            Donc ce n'est pas la vraie requête, si je comprends bien. OK.

            si si c'est la bonne requete 

            YvesmanCacestprive a écrit:

            je ne trouve pas de documentation adequate pour une jointure avec plusieurs conditions differentes

            Cela peut s'expliquer facilement ici si tu le souhaites, et ainsi avec le contexte.

            volontiers 


            La ligne include("message.php") fait partie du premier code, ou c'est une erreur de formatage lors de l'envoi du message ici ? Si elle n'en fait pas vraiment partie, où est-elle réellement ?

            le include dans le onclick a ete remplace par un "afficher('messagerie')"

            le include en lui meme a ete deplace en bas de page ( pour que la fonction 

            afficher('messagerie') puisse trouver la div correspondante )

            Si elle fait partie du code, message.php, inclus dans le premier script, n'affiche en fait jamais que la discussion avec le dernier pseudo. La variable $id est écrasée à chaque tour de boucle pour lister les pseudos, mais existe toujours après celle-ci quand le script message.php est inclus et donc exécuté. Du coup, c'est aussi ce qui est utilisé dans la requête AJAX effecuée avec load().

            ok

            Outre le fait qu'au moment où le script message.php est inclus dans la page, on n'a pas connaissance d'un potentiel choix, on n'a apparemment pas de quoi en prendre compte à un moment ou un autre

            je comprend pas ou tu veux en venir

            (le </a> qui traînait ?).

            c'est juste une erreur de codage oublions ce </a>

            Si j'ai vu juste, tu devrais à mon sens :

            • soit ajouter des liens qui vont "recharger" la page, mais avec l'ID du correspondant (?id_correspondant=…, par exemple), et seulement dans ce cas inclure message.php en s'assurant d'y utiliser non pas $id tel que défini dans la boucle, mais l'ID repris du lien ($_GET['id_correspondant']). C'est du HTML et PHP, pas besoin de JavaScript ici.
            3 probleme avec cette solution : 1) ca reload la page 2) si j'envoie sur message.php je ne reste plus sur la page courante 3) je peux pas envoyer l'identifiant dans le href sinon il ne trouvera pas le fichier
            • soit ne pas inclure message.php, et utiliser JavaScript pour :
              • ajouter un écouteur de clic sur les pseudos de la liste ;
              • récupérer l'ID du correspondant quand un des pseudos est cliqué (un ajout dans la liste doit être fait) ;
              • le passer à load().
            je prefere cette solution mais la je connais rien en js 


            • Partager sur Facebook
            • Partager sur Twitter
              26 décembre 2024 à 1:46:00

              Pavay César, ceux qui vont tout lire te saluent.
              Prends le temps de bien tout reprendre avant de répondre.

              YvesmanCacestprive a écrit:

              justement je fais en sorte que mon site n'ait aucune erreurs

              pour le moment meme si il est en ligne […]

              Effectivement, tu fais comme tu veux, même si nous pourrions être plusieurs à te (re-)dire que ce n'est pas (une bonne) pratique.

              YvesmanCacestprive a écrit:

              si ca marche pourquoi changer ?

              Parce que nous autres informaticiens, nous restons de gros flemmards, peut-être juste un peu moins que les utilisateurs. S'il y a quelque chose pour permettre ça sans JavaScript fait "à la one again", pourquoi se compliquer la vie à réinventer la roue ? Surtout que là, on a la roue, l'essieu, le pneu et la chambre à air, c'est fourni avec le châssis et tout ça roule sur les voies les plus courantes.  :D

              YvesmanCacestprive a écrit:

              si si c'est la bonne requête

              Une requête simple, sur une unique table et sans jointure, avec comme unique contrainte id = :id, ne peut retourner plusieurs fois le même résultat. Tu peux le vérifier assez facilement.
              Je parle surtout de celle ligne 24 du code du premier message, en date de rédaction de celui-ci. Quant à la requête de la ligne 16, si quelqu'un venait à envoyer deux fois volontairement le même message, le seul cas où tu auras des doublons à gérer (et encore, ce n'en seront pas dans ce cas), c'est si tu n'avais aucune information de quand le message a été envoyé (colonne d'ID auto-incrémentée ou date et heure d'envoi).

              YvesmanCacestprive a écrit:

              Ymox a écrit:

              Outre le fait qu'au moment où le script message.php est inclus dans la page, on n'a pas connaissance d'un potentiel choix, on n'a apparemment pas de quoi en prendre compte à un moment ou un autre

              je comprend pas ou tu veux en venir

              Simplement au fait que, le PHP s'exécutant côté serveur, la page avec les choix possibles est envoyée avec la discussion liée au dernier pseudonyme listé, alors qu'on n'a pas encore le choix de l'internaute quant à la discussion avec quel correspondant il veut voir. Ce qui n'est pas nécessairement un problème, mais cette "discussion" affichée sans choix n'est pas vraiment utile. Et dans le cas où, dans la discussion, ce n'était pas le partenaire qui avait répondu, mais l'utilisateur connecté, on ne verrait pas cette réponse.

              YvesmanCacestprive a écrit:

              3 probleme avec cette solution : 1) ca reload la page 2) si j'envoie sur message.php je ne reste plus sur la page courante 3) je peux pas envoyer l'identifiant dans le href sinon il ne trouvera pas le fichier

              1. Utiliser .load() est un artifice qui n'est que visuel, le résultat est pratiquement le même qu'un lien, à ceci près qu'avec ce lien, tu as un rechargement visible et un élément dans l'historique de navigation. Au final, il faudra bien charger la discussion souhaitée, que ce soit par la page entière/avec le reste de la page, ou juste la partie discussion avec .load().
              2. Il y a possibilité de renvoyer sur la même page plutôt que partir sur message.php, justement. C'est ce que j'entendais par « "recharger" ».
              3. C'est possible, en utilisant par exemple les "paramètres GET" ou paramètres de chaîne de requêtes (query string parameters en anglais) nom_du_fichier.ext?nom_du_paramètre_1=valeur_du_paramètre_1&amp;nom_du_paramètre_2=…. Et ça ne bloque en rien la possibilité de trouver le fichier nom_du_fichier.ext.

              YvesmanCacestprive a écrit:

              je prefere cette solution mais la je connais rien en js

              • Il y a moyen en JavaScript d'écouter ce qu'on appelle des événements (events en anglais), comme notamment le clic sur l'un ou l'autre élément. Tu utilises jQuery, avec cette librairie, cela se fait notamment avec .on
                $('selecteur').on(
                  'nom de l'évènement', /* 'click' dans le cas qui nous occupe */
                  fonction() {
                      /* this est l'élément HTML sur lequel on a eu un clic */
                  }
                )
              • Avec la manière de faire ci-dessus (outre la coloration syntaxique foireuse sur ce site), il nous faut de quoi récupérer l'ID du partenaire. Comme imaginé et expliqué, il faut modifier un peu la liste pour permettre de récupérer facilement l'information. Je propose d'utiliser un attribut de donnée data-*.
                Du coup, dans la boucle, ajouter donc data-id="<?php echo $auteur['id_membre']>" dans la balise <img />. Pour en récupérer la valeur à l'équivalent de la ligne 4 ci-avant, on va "simplement" faire var getid = this.dataset.id;.


              YvesmanCacestprive a écrit:

              Ymox a écrit:

              Cela peut s'expliquer facilement ici si tu le souhaites, et ainsi avec le contexte.

              volontiers

              L'idée est donc de récupérer les messages (qui, si j'ai bien saisi, sont dans la table messagerie) et les noms de leurs auteurs (dont les données sont dans membre). On a une colonne id_author qui référence l'ID d'un membre — ID qui doit être unique dans cette table membre, cf. ma remarque sur DISTINCT pour la ligne 24.
              Comme on souhaite récupérer principalement les messages, on va partir de cette table, et donc de ta requête ligne 16

              SELECT
                          *
                  FROM
                              messagerie
                  WHERE
                          id_destinataire = :id_destinataire
              

              On t'a déjà présenté la syntaxe pour faire une jointure, je ne m'étendrai donc pas trop dessus.
              On va en faire une vers la table membre, et s'assurer que id_author d'un message permette bien de joindre vers l'auteur.

              SELECT
                          -- Il vaudra mieux lister explicitement ce dont on a besoin ici.
                          -- On listera les champs sous la forme
                          -- nomDeLaTable.nomDeLaColonne, avec des virgules entre chaque
                          -- nom. On y reviendra.
                          *
                  FROM
                              messagerie
                      -- On fait ici une "jointure interne sur la table membre", "interne"
                      -- principalement parce qu'un message a toujours un auteur
                      INNER JOIN
                              membre
                          -- C'est avec les deux lignes ci-dessous qu'on fait correspondre
                          -- les données d'un message avec celles de l'auteur. C'est dans le
                          -- cas où l'ID de l'auteur correspond avec celle d'un
                          -- enregistrement de membre, et cela s'exprime ainsi.
                          ON
                                  id_author -- colonne de messagerie
                                  =
                                  id_membre -- colonne de membre
                  WHERE
                          id_destinataire = :id_destinataire
              

              Avec cette requête, on récupérera donc pour chaque message les informations de son auteur. S'il y a plusieurs messages d'un même auteur, on aura à chaque fois les informations de l'auteur avec. En imaginant les discussions d'Alice (membre 1) avec Bob (2) et Charlie (3), on aurait quelque chose un peu comme ci-dessous (volontairement simplifié).

              contenu                                      | id_destinataire  | id_author | nom     | photo_profil
              ----------------------------------------------------------------------------------------------------
              Pas mal, et toi ?                            | 1                | 2         | Bob     | bob.jpg
              Tu le trouves vraiment aussi mignon que ça ? | 1                | 3         | Charlie | charlie.jpg
              Trop manger, principalement !                | 1                | 2         | Bob     | bob.jpg
              Et toi ? Reçu ce que tu attendais ?          | 1                | 2         | Bob     | bob.jpg
              

              A partir de maintenant, la partie aux lignes 1 à 18 ne changera plus pour ce qui nous concerne ici.

              … Mais oui, on a seulement les messages qui ont été envoyés à Alice, et pas ceux qu'elle a envoyés en réponse !
              Il faut adapter un petit peu pour avoir les discussions complètes. A noter que, sauf bizarreries dans la structure des tables, il ne devrait pas y avoir besoin de DISTINCT.

              SELECT
                          *
                  FROM
                              messagerie
                      INNER JOIN
                              membre
                          ON
                                  id_author = id_membre
                  WHERE
                      -- Il nous faut les messages où le membre connecté est destinataire
                      -- comme ceux dont il est auteur. Pour un peu plus de clarté, je
                      -- change le marqueur
                          id_destinataire = :membre_connecte
                      OR  id_author = :membre_connecte
              
              contenu                                      | id_destinataire  | id_author | nom     | photo_profil
              ----------------------------------------------------------------------------------------------------
              Salut ! Ça va ?                              | 2                | 1         | Alice   | alice.jpg
              Pas mal, et toi ?                            | 1                | 2         | Bob     | bob.jpg
              Bien aussi !                                 | 2                | 1         | Alice   | alice.jpg
              Qu'as-tu fait à Noël ?                       | 2                | 1         | Alice   | alice.jpg
              Tu le trouves vraiment aussi mignon que ça ? | 1                | 3         | Charlie | charlie.jpg
              Trop manger, principalement !                | 1                | 2         | Bob     | bob.jpg
              Oui, il me fait trop craquer !               | 3                | 1         | Alice   | alice.jpg
              Et toi ? Reçu ce que tu attendais ?          | 1                | 2         | Bob     | bob.jpg
              

              Et là, toutes les conversations sont mélangées. Pour n'en avoir qu'une, il nous faut en plus l'information sur le choix de la personne avec qui l'on converse, que je vais appeler le correspondant. Celui qui est choisi avec la liste, donc.

              SELECT
                          *
                  FROM
                              messagerie
                      INNER JOIN
                              membre
                          ON
                                  id_author = id_membre
                  WHERE
                      -- Si auparavant on avait bien tous les messages dont on est soit
                      -- le destinataire, soit l'expéditeur, il faut qu'on limite à un
                      -- seul correspondant. Ce qui veut dire qu'on aimerait les messages
                      -- dont (le membre connecté est l'expéditeur et le correspondant le
                      -- destinataire)
                      -- OU (le membre connecté est le destinataire et le correspondant
                      -- l'expéditeur)
                              (id_destinataire = :membre_connecte
                          AND  id_author = :correspondant)
                      OR     (id_destinataire = :correspondant
                          AND  id_author = :membre_connecte)
              

              Si des réflexions sur la structure de base de données pour un site de messagerie t'intéressent, je peux te proposer cet autre sujet.

              -
              Edité par Ymox 3 janvier 2025 à 21:49:58

              • Partager sur Facebook
              • Partager sur Twitter

              while qui ne se fait pas respecter

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown