[Messagerie] function recup_conversation en pdo

Résolu
Bonjour,

Sachant que le code de cette function mysl_ est :
<?php
//la function qui va recuperer les conversations
function recup_conversation()
{
    $results = array();
    $sql = mysql_query("
    SELECT conversations.id_conversation,
                    conversations.sujet_conversation,
                    utilisateurs.pseudo,
                    utilisateurs.avatar,
                    conversations_messages.date_message
                    FROM conversations
                    LEFT JOIN conversations_messages ON conversations.id_conversation = conversations_messages.id_conversation
                    INNER JOIN conversations_membres ON conversations.id_conversation = conversations_membres.id_conversation
                    INNER JOIN utilisateurs ON utilisateurs.pseudo = conversations_messages.pseudo_exp
                    WHERE pseudo_dest = '{$_SESSION['pseudo']}'
                    GROUP BY conversations.id_conversation
                    ORDER BY conversations_messages.date_message DESC
    ");
    while($row = mysql_fetch_assoc($sql))
    {
        $results[] = $row;
    }
        return $results;
}
?>


Qu'est ce que donne ce code en pdo svp ?
J'approche de la fin !

Merci d'avance :)

7 réponses

Résumé de la discussion

La discussion porte sur la conversion d'une fonction PHP qui récupère des conversations de MySQL vers PDO et sur l'utilisation d'un identifiant utilisateur comme paramètre dans la requête. Parmi les éléments essentiels, une proposition de remplacement propose d'utiliser une requête préparée avec un marqueur de paramètre et de lier l'identifiant via PDO, plutôt que la variable de session. Des points critiques apparaissent, notamment des erreurs de syntaxe dans les placeholders et l'oubli d'un SELECT initial, ainsi que l'adéquation entre quotes et paramètres dans la clause WHERE. En complément, plusieurs répondants encouragent à tester le code avec les résultats affichés et à vérifier la présence de la session afin d'isoler les causes sans conclure à une réparation immédiate.

Bobot (l’IA à votre service)
  1. Commence par faire un premier jet, on n'est pas là pour mâcher le travail. Essaye un peu au moins... D'autant que tu dispose d'un grand nombre d'exemples de conversion !
    0
    1. C'est un truc de ce genre ?

      <?php 
      //la function qui va recuperer les conversations
      function recup_conversation() {
       global $bdd; // déclaration globale de BDD
      
      $pseudo = isset($_SESSION['pseudo'])?$_SESSION['pseudo'] : NULL;
      $strWhere = $pseudo ? " WHERE pseudo !='$pseudo'  " : '' ;
      
      $sql = "conversations.id_conversation,
                          conversations.sujet_conversation,
                          utilisateurs.pseudo,
                          utilisateurs.avatar,
                          conversations_messages.date_message
                          FROM conversations
                          LEFT JOIN conversations_messages ON conversations.id_conversation = conversations_messages.id_conversation
                          INNER JOIN conversations_membres ON conversations.id_conversation = conversations_membres.id_conversation
                          INNER JOIN utilisateurs ON utilisateurs.pseudo = conversations_messages.pseudo_exp
                          WHERE pseudo_dest = '{$_SESSION['pseudo']}'
                          GROUP BY conversations.id_conversation
                          ORDER BY conversations_messages.date_message DESC";
      
       $req = $bdd->prepare($sql);
       $req->execute();  
       $resultat = $req->fetchall();
      return $resultat;
      }
      ?>
      0
      1. Passe le $_SESSIOn['pseudo'] dans un array !
        0
      2. @hharchi9
        $pseudo_session = isset($_SESSION['pseudo'])?$_SESSION['pseudo'] : NULL;

        comme ça ?
        0
      3. Un array $params pour la requete !
        0
      4. @hharchi9
        $params = array(':session_pseudo' =>$pseudo_session ');
        0
      5. Voilà et réutiliser le :session_pseudo dans la requête à la place de $_SESSION['pseudo'] (au niveau du where)
        0
    2. Tu as bien changé :pseudo_session ?
      0
      1. bien sur
        <?php 
        //la function qui va recuperer les conversations
        function recup_conversation() {
         global $bdd; // déclaration globale de BDD
        
        $pseudo_session = isset($_SESSION['pseudo'])?$_SESSION['pseudo'] : NULL;
        
        $sql = "SELECT conversations.id_conversation,
                            conversations.sujet_conversation,
                            utilisateurs.pseudo,
                            utilisateurs.avatar,
                            conversations_messages.date_message
                            FROM conversations
                            LEFT JOIN conversations_messages ON conversations.id_conversation = conversations_messages.id_conversation
                            INNER JOIN conversations_membres ON conversations.id_conversation = conversations_membres.id_conversation
                            INNER JOIN utilisateurs ON utilisateurs.pseudo = conversations_messages.pseudo_exp
                            WHERE pseudo_dest = ':session_pseudo '
                            GROUP BY conversations.id_conversation
                            ORDER BY conversations_messages.date_message DESC";
        					
        					$params = array(':session_pseudo' =>$pseudo_session);
                            
        					
        $req = $bdd->prepare($sql);
        $req->execute($params);
        $resultat = $req->fetchall();
        
        return $resultat;
        }
        ?>
        0
      2. Je voulais dire dans phpmyadmin :)
        0
      3. pourquoi ? pour la requête j'ai fais :
        SELECT conversations.id_conversation,
                            conversations.sujet_conversation,
                            utilisateurs.pseudo,
                            utilisateurs.avatar,
                            conversations_messages.date_message
                            FROM conversations
                            LEFT JOIN conversations_messages ON conversations.id_conversation = conversations_messages.id_conversation
                            INNER JOIN conversations_membres ON conversations.id_conversation = conversations_membres.id_conversation
                            INNER JOIN utilisateurs ON utilisateurs.pseudo = conversations_messages.pseudo_exp
                            WHERE pseudo_dest = ':session_pseudo '
                            GROUP BY conversations.id_conversation
                            ORDER BY conversations_messages.date_message DESC
        0
      4. Donc tu n'as pas remplacé :session_pseudo dans le WHERE !! Met le pseudo du membre qui a un message !
        0
      5. j'ai : http://www.noelshack.com/2015-26-1435093749-erreur.jpg
        0
    3. Sans le code utilisé (celui que tu utilises pour l'affichage), impossible de voir ce qui cloche...
      0
      1. ah pardon
        <?php 
        include('functions/membre.func.php');
        include('body/header.php');
        include('body/menu.php');
        ?>
        <h3>Les conversations</h3>
        <?php 
        $conversations = recup_conversation();
           if($conversations == true)
           {
                foreach($conversations as $conversation)
             {
              ?>
                 <div class='conversation'>      
                <a href="index.php?page=profile&pseudo=<?php echo $conversation['pseudo']; ?>"><?php echo $conversation['pseudo']; ?></a><br />
             <omg src='avatar/<?php echo $conversation['avatar']; ?> height='70' width='70'>
             <p><a href=""> <?php echo $conversation['sujet_conversation'] ?></a></p>
             
                          </div>      
              <?php
             }
           }else{
            ?>
               <div class'error'>Vous n'avez pas de message</div>
            <?php
           }
        ?>
        0
      2. coloration syntaxique...
        0
      3. dsl j'ai oublié la balise de fermeture :/
        0
    4. Bonjour

       WHERE pseudo_dest = ':session_pseudo '


      Il ne faut pas d'apostrophes autour de :session_pseudo :
       WHERE pseudo_dest = :session_pseudo
      0
      1. ah merci beaucoup !
        j'ai mtn ceci : http://www.noelshack.com/2015-26-1435095592-erreur.jpg
        (je sais pas pourquoi ça s'est repeté plusieurs fois et il manque l'avatar)
        0
      2. Pourquoi en plusieurs fois => ça vient de ta bdd !
        0
      3. ah je vois, 3 messages ont été envoyés
        0
    5. Pour l'avatar, encore une histoire d'apostrophes.
      <omg src='
      et où est l'apostrophe qui ferme le src ?
      0
      1. comme ceci ?
        <omg src=""avatar/<?php echo $conversation['avatar']; ?> height='70' width='70'>
        0
      2. Modérateur
        Bonjour,

        1 - .. ce n'est pas OMG .. mais IMG qu'on doit utiliser.
        2 - Il faut écrire, comme le dit Le père, les attributs entre QUOTES !

        <IMG src='avatar/<?php echo $conversation['avatar']; ?>'  height='70' width='70'></IMG>
        
        0
      3. Pour ne plus avoir plusieurs champs d'affiché, check ta base de données et enlève les champs en double qui se sont formés à la réexécution du script !
        0
    6. parfait merci à tous :) petite question pourquoi dans ma bdd je ne peux supprimer les messages? :/
      0
      1. Modérateur
        Ben.. je ne sais pas ... tu fais comment pour essayer de les supprimer ??
        Tu as un message d'erreur ??
        .... si tu ne nous donnes pas plus d'infos ... et bien..... ( ...comment dire....???...) ..... on ne pourra pas DEVINER !!!!!
        0
      2. @jordane45finalement je pense que ça se fera manuellement sur le site, ou je peux très bien utilise une requete avec un DELETE ^^
        0