Systeme de chat

Résolu/Fermé
kherox Messages postés 131 Date d'inscription dimanche 13 janvier 2013 Statut Membre Dernière intervention 17 octobre 2015 - Modifié par kherox le 13/12/2013 à 09:38
kherox Messages postés 131 Date d'inscription dimanche 13 janvier 2013 Statut Membre Dernière intervention 17 octobre 2015 - 13 déc. 2013 à 19:07
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 mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
13 déc. 2013 à 12:10
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 dimanche 13 janvier 2013 Statut Membre Dernière intervention 17 octobre 2015 1
13 déc. 2013 à 12:19
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 mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 13/12/2013 à 14:30
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 dimanche 13 janvier 2013 Statut Membre Dernière intervention 17 octobre 2015 1
13 déc. 2013 à 14:43
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 mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
13 déc. 2013 à 15:26
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 dimanche 13 janvier 2013 Statut Membre Dernière intervention 17 octobre 2015 1
13 déc. 2013 à 16:01
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 mardi 22 janvier 2008 Statut Membre Dernière intervention 8 juin 2016 228
Modifié par JooS le 13/12/2013 à 18:01
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