Systeme de chat

Résolu
kherox Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   -  
kherox Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

salut a tous et a toute , je suis sur un systeme de chat que je suis en train de codé. donc ce qui j aimerais faire c'est d'afficher les messages une un a la suite de autres commes facebook et plein d 'autre site de chat les font:
voici mon code :


<?php
foreach ($r as $key => $value) {
foreach ($s as $ke => $ve) {
foreach ($us as $k => $v) {
if($_SESSION['id'] == $v->id)
{
echo $v->pseudo.":\t" ;
echo '<p class="label label-important">';
echo $value->message."\t";
echo "</p>";
echo $value->date_envoie;
echo "</br>";


}elseif($v->id == $d['id_destinateur'] || $v->id == $d['id_expediteur']
){


echo $v->pseudo.":\t" ;
echo '<p class="label label-success">';
echo $ve->message."\t";
echo "</p>";
echo $ve->date_envoie;
echo "</br>";


}

}



}



}?>

je voudrais savoir quel est la maniere de faire?

A voir également:

2 réponses

JooS Messages postés 2468 Date d'inscription   Statut Membre Dernière intervention   228
 
Salut,

Déjà 3 boucles imbriquées, c'est pas très beau a voir sachant qu'il existe surement d'autres façon de faire !

Puis il faut préciser ce que représente les tableaux que tu parcours !

Et je suppose qu'il y a des requêtes SQL derrière tout ça, et je pari que tu n'as pas utilisé de jointure
0
kherox Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   1
 
le $r represente les message envoyer par l'expediteur au destinataire , le $s represente les message envoyer par le destinateur a l'espediteur
$us represente l'expediteur et le destinataire. et oui ne n'ai pas utiliser les jointures.
0
JooS Messages postés 2468 Date d'inscription   Statut Membre Dernière intervention   228
 
Alors non, ce n'est pas comme ça qu'on procède !
En plus, tu n'as traiter que le cas ou le chat comprend deux interlocuteurs, sinon, si tu dois afficher les messages d'un salon(une centaine voir des milliers d'utilisateurs, alors tu auras un problème), tout ça, sans parler des performances de ton système ...

Postes le modele logique représentant ta base de données.
Exemple :
Utilisateur(identifiant, nom, prenom, email)
Salon(identifiant, nom, theme)
Message(expediteur_id*, destinaitaire_id*, date, salon_id*, contenu)
0
kherox Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   1
 
mon modele est
posts(id,message,id_expediteur,id_destinateur)
users(nom,prenom,pseudo, password);
le systeme que je suis en train de construire est pour un chat du style skype ou tu dois selectioner la personne connecter pour voir vos messages, donc c'est dans ce sens que je faire mes deux requettes. donc a ton avis comment est que je dois proceder?
0
JooS Messages postés 2468 Date d'inscription   Statut Membre Dernière intervention   228
 
Ou est l'id dans la table users ?
La date est importante dans ce genre de système !

Avec Skype, on sélectionne l'utilisateur, puis on peux voir l'historique de la discussion, donc si c'est ce que tu comptes faire alors ...

Pour extraire l'historique de la discussion faite avec X utilisateur, on a besoin de deux paramètres :
L'id de l'utilisateur en cours, qui est normalement enregistré dans la session en cours (:exp).
L'id du destinataire (:dest).

SELECT IF(id_expediteur = :exp, 'Moi', 'Interlocuteur') AS expediteur, message
FROM posts
WHERE (id_expediteur = :exp AND id_destinateur = :dest) 
OR (id_expediteur = :dest AND id_destinateur = :exp)
ORDER BY id DESC


:dest et :exp sont les deux paramètres dont la requête a besoin, soit tu les remplies via PDO(conseillé), soit par une concaténation manuelle(déconseillé).
0
kherox Messages postés 131 Date d'inscription   Statut Membre Dernière intervention   1
 
j ai deja recuperer tout cela via PDO, pour l'id du users j ai oublier de mettre. ensuite je te donne ma requete complete :
$d['id_destinateur'] = $_POST['destinateur'];
//pour recuperer les messages que l'expediteur a envoyer au destinataite
$r=$posts->name->find(array('conditions'=>array( 'id_expediteur' => $d['id_expediteur'],
'id_destinateur' => $d['id_destinateur'])));

//pour recuperer les messages que le destinateur a envoyer au expediteur
$s=$posts->name->find(array('conditions'=>array('id_expediteur'=>$d['id_destinateur'],
'id_destinateur' => $d['id_expediteur']
)));

quand on clique sur un pseudo par exemple on charge son historique, j ai deja faire cela . le probleme c'est a la affichage, cela ne se faire par comme skype. c'est ce que je veux corriger. donc comment faire
0
JooS Messages postés 2468 Date d'inscription   Statut Membre Dernière intervention   228
 
Tu l'as déjà fait, oui, je le sais, mais la manière dont tu l'as réaliser est inappropriée !
Tu récupère TOUT les messages postés, puis tu les filtres, et tu répète cette opération deux fois.
Moi je te propose de filtrer tes messages avant même de les récupérer, grâce a la clause "WHERE", et une seule requête suffira.

Sans oublier ce que j'ai dis dans mon premier message.
Puisque tu utilises PDO ...
$req = $bd->prepare('
SELECT IF(p.id_expediteur = :exp, "Vous", "Interlocuteur") AS author, 
CONCAT(u_exp.nom, " ", u_exp.prenom) AS expediteur, p.message
FROM posts p
INNER JOIN users u_exp ON posts.id_expediteur = u_exp.id
WHERE (id_expediteur = :exp AND id_destinateur = :dest) 
OR (id_expediteur = :dest AND id_destinateur = :exp)
ORDER BY id DESC');
$req->bindParam(':exp', $d['id_expediteur'], PDO::PARAM_INT);
$req->bindParam(':dest', $d['id_destinateur'], PDO::PARAM_INT);
$req->execute();

while($post = $req->fetch(PDO::FETCH_OBJ)) {
    echo '<div>';
    echo ($post->author == 'Vous') 
        ? '<p style="display:inline;color:grey;">Vous : </p>'
        : '<p style="display:inline;color:blue;">' . $post->expediteur . ' : </p>';

    echo '<p style="display:inline;">' . $post->message . '</p>';
    echo '</div>';
}
0