8792 sujets

Développement web côté serveur, CMS

Bonsoir,

Voilà, j'ai une messagerie interne sur mon site. J'ai un champ dans ma table qui permet de note si le message est non lu, lu ou répondu.

Jusque la pas de problème, lorsqu'on clique sur un message, il apparaît bien comme lu après.

Par contre, si je reçois un nouveau message, tous les messages lu se remettent non-lu alors que la valeur inscrite dans la table correspond bien pour un message lu.

Le problème doit venir de la mais je me remets entre vos mains:

$sql1 = 'SELECT titre, date, membre.pseudo as expediteur, messages.id as id_message, mode FROM messages, membre WHERE id_destinataire="'.$_SESSION['pseudo'].'" AND id_expediteur=membre.pseudo ORDER BY date DESC'; 
                $donnees = mysql_query($sql1) or die('Erreur SQL !<br />'.$sql1.'<br />'.mysql_error());
                $cont = mysql_fetch_array($donnees);
				$res = $cont;
    // si on a des messages, on affiche la date, un lien vers la page lire.php ainsi que le titre et l'auteur du message
        if ($res['mode'] == 0)
                {
                while ($data = mysql_fetch_array($req)) {
                echo "<div id='actualite' style='color:#4C88A0'>";
                echo "<p><b>";
                echo "Reçu le ";
        		echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = Non lu</b></p>';
                echo "</div>";
        }
                }
                elseif ($res['mode'] == 1)
                {
                while ($data = mysql_fetch_array($req)) {
                echo "<div id='actualite' style='color:#4C88A0'>";
                echo "<p>";
                echo "Reçu le ";
       			echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = <b>Lu</b></p>';
                echo "</div>";
        }
                }
                else
                {
                while ($data = mysql_fetch_array($req)) {
                echo "<div id='actualite' style='color:#4C88A0'>";
                echo "<p>";
                echo "Reçu le ";
        		echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = <b>Répondu</b></p>';
                echo "</div>";
				mysql_close();
       			}
        }


Voilà, si quelqu'un peut m'explique ce qui ne va pas.
En faite tu devrais simplement faire trois requête au lieu de 4.

Sélectionne directement les message lu, non lu et répondue dans la clause WHERE et ton problème s'envolera Smiley smile

cela vient qu'il ne prend en compte que le premier/denrier message reçue (selon le order) et pas l'ensemble des message vue que tu passe par $const qui aura une valeur unique : la denrière

$sql1 = '
						SELECT titre, date, membre.pseudo as expediteur, messages.id as id_message, mode 
						FROM messages, membre 
						WHERE id_destinataire="'.$_SESSION['pseudo'].'" AND id_expediteur=membre.pseudo AND mode = 1 
						ORDER BY date DESC
				';
				$sql2 = '
						SELECT titre, date, membre.pseudo as expediteur, messages.id as id_message, mode 
						FROM messages, membre 
						WHERE id_destinataire="'.$_SESSION['pseudo'].'" AND id_expediteur=membre.pseudo AND mode = 2 
						ORDER BY date DESC
				';
				$sql3 = '
						SELECT titre, date, membre.pseudo as expediteur, messages.id as id_message, mode 
						FROM messages, membre 
						WHERE id_destinataire="'.$_SESSION['pseudo'].'" AND id_expediteur=membre.pseudo AND mode = 3 
						ORDER BY date DESC
				';
				
                $donnees = mysql_query($sql1) or die('Erreur SQL !<br />'.$sql1.'<br />'.mysql_error());
                				

                while ($data = mysql_fetch_array($sql1)) 
				{
					echo "<div id='actualite' style='color:#4C88A0'>";
					echo "<p><b>";
					echo "Reçu le ";
					echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = Non lu</b></p>';
					echo "</div>";
				}
                
                while ($data = mysql_fetch_array($sql2)) 
                {            
					echo "<div id='actualite' style='color:#4C88A0'>";
					echo "<p>";
					echo "Reçu le ";
					echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = <b>Lu</b></p>';
					echo "</div>";
                }
                while ($data = mysql_fetch_array($sql3)) 
                {
					echo "<div id='actualite' style='color:#4C88A0'>";
					echo "<p>";
					echo "Reçu le ";
					echo date('d/m/Y à H\hi', $data['date']) , ' - <a href="lire.php?id_message=' , $data['id_message'] , '">' , stripslashes(htmlentities(trim($data['titre']))) , '</a> [ ' , stripslashes(htmlentities(trim($data['expediteur']))) , ' ] = <b>Répondu</b></p>';
					echo "</div>";
				}
				mysql_close();



Il y'à toute fois mieux à faire comme "double order", order préalablement par 'mode' (lu, non lu...) Puis par date (ou l'inverse)

Ainsi tu ne passe plus qu'à une seul requête et il te reste à faire un :
				if ($mode == 1){$vars_span = 'Lu';}
				if ($mode == 2){$vars_span = 'Non Lu';}
				if ($mode == 2){$vars_span = 'Répondu Lu';}
				
				...ton code... echo $vars_span ... ton code ...


Ce qui allégera ton code et ne te fera faire qu'une seule requête
Modifié par Gectou4 (22 May 2006 - 23:25)