aide requete sur 2 tables

Eléphanteau du PHP | 28 Messages

18 sept. 2011, 18:31

bonjour

je suis en train de me prendre la tete. je vous explique

j'ai 2 tables:

MEMBRE

pseudo - age - connecte-
julien - 25 -1
marie - 20 -1
maxime - 19 -0

CHAT

expediteur - message - destinataire - status

julien - slt ca va -marie -1
maxime - coucou - marie -1
marie - slt-julien -1

donc je souhaite affiché les messages de ceux qui sont seulement connecté c'est à dire avec un status a 1 or a chaque fois j'obiens les messages de celui qui n'est pas connecté dans mon exemple Maxime apparaitra alors qu'il ne devait pas etre présent ...

donc je fais ca:
if(isset($_POST['destinataire'])) $destinataire=$_POST['destinataire'];

 else	$destinataire=''marie";


$sql = "select  count(idMessage) as nbremessage, membre.connecte, chat.expediteur from chat, membre where  membre.connecte='1' and chat.status = '1' and chat.destinataire = '$destinataire' group by expediteur order by chat.expediteur desc";


$req = mysql_query ($sql) or die (mysql_error());

$sql2 = mysql_query("SELECT count(idMessage)  from chat,membre where membre.connecte='1' and chat.destinataire = '$destinataire' and chat.status = '1'")or die(mysql_error()) ;



while($row=mysql_fetch_array($sql2)){


$nbre= $row[0];
//echo($nbre);
}

if ($nbre > 0) {

$myArray = array();

while(false != ($data = mysql_fetch_array($req)))



{ 
$myArray[] = array(
	'expediteur' => utf8_encode($data['expediteur']),
	'nbremessageTot' => ($nbre),
	'nbreMessage' => utf8_encode($data['nbremessage']));
	
	
		}
		
	

echo json_encode ($myArray);
}
else
{
$myArray = array();

//while(false != ($data = mysql_fetch_array($req)))



{ 
$myArray[] = array(
	'expediteur' => utf8_encode($data['expediteur']),
	'nbremessageTot' => ('0'),
	'nbreMessage' => utf8_encode($data['nbremessage']));
	
	
		}
		
	

echo json_encode ($myArray);

}

?>

ViPHP
xTG
ViPHP | 7331 Messages

18 sept. 2011, 19:10

Bon déjà la structure de tes tables laissent franchement à désirer. ^^'
Il faudrait une clé unique pour chaque n-uplet, pour une table membre on met généralement un identifiant numérique en auto-incrément.
Les clés permettront de rendre les jointures de tes requêtes plus rapides et permettront au moteur du sgbd de trouver plus facilement les données.
De plus actuellement, si une personne souhaite changer de pseudo ? Avec ton schéma c'est tout bonnement non envisageable.
Et pour la suppression d'un unique message du chat ? Aussi impossible.

Pour ton problème cela vient du fait que tu ne fais aucune relation de jointure entre membre et chat. Il sélectionne donc n'importe quel membre pour n'importe quel message du chat. Il n'y a pas de lien entre destinataire et et pseudo. ;)

Voilà ce que je te conseille :

MEMBRE
idMembre - pseudo - age - connecte
Avec idMembre comme clé primaire de type int en auto-increment.

CHAT
idMessage - idExpediteur - message - idDestinataire - status
Avec idMessage comme clé primaire de type int en auto-increment.
Et idExpediteur, idDestinataire faisant référence à l'idMembre de la table Membre.

Exemple d'utilisation :
Ainsi le nombre de message posté par membre connecté devient =>
SELECT  count(chat.idMessage) as nbremessage, membre.connecte, membre.pseudo 
FROM membre
  LEFT JOIN chat ON (membre.idMembre = chat.idExpediteur)
WHERE membre.connecte = 1
GROUP BY chat.idMembre 
ORDER BY membre.pseudo ASC