Reseau social aide

EverySocial
Invité n'ayant pas de compte PHPfrance

15 avr. 2012, 17:23

Bonjour à tous ! Je suis en train de développer un réseau social (EverySocial)

Le problème c'est que jai fait ces scripts
<?php

Class ClassMessages
{
	public function Send($to, $from, $message)
	{
		global $users;
		
		$to_username = $users->GetUserVar('username', $to);
		$from_username = $users->GetUserVar('username', $from);
		
		if ($users->IsNameTaken($to_username) && $users->IsNameTaken($from_username))
		{
			dbquery("INSERT INTO messages (to_user,from_user,timestamp,message) VALUES ('" . $to . "', '" . $from . "', '" . time() . "', '" . clean($message, true, true) . "')");
		}
	}
	
	public function GetMessages($from = '', $to = '')
	{
		return dbquery("SELECT * FROM messages WHERE from_user = '" . $from . "' AND to_user = '" . $to . "' ORDER by timestamp");
	}
}

?>
Pour obtenir les messages
<?php

require_once "global.php";

if (!LOGGED_IN)
{
	header('Location: ./');
	exit;
}

if (isset($_GET['to_id']))
{
	$to_id = @intval($_GET['id']);
}

	$received = $message->GetMessages("3", USER_ID);
	
	while ($r = mysql_fetch_assoc($received))
	{
		$from_user = $users->GetUserVar('username', $r['from_user']);
		$to_user = $users->GetUserVar('username', $r['to_user']);
		$date = "Il y a&nbsp;" . $core->GetTime(time() - $r['timestamp']);
		$rsg_db = $r['message'];
		
		echo $from_user . "&nbsp;&agrave;&nbsp;dit: (" . $date . ")&nbsp;" . $rsg_db . "<br />";
	}
	
	$send = $message->GetMessages(USER_ID, "3");
	
	while ($s = mysql_fetch_assoc($send))
	{
		$from_id = $users->GetUserVar('username', $s['from_user']);
		$to_user = $users->GetUserVar('username', $s['to_user']);
		$date = "Il y a&nbsp;" . $core->GetTime(time() - $s['timestamp']);
		$msg_db = $s['message'];
		
		echo "Vous avez dit: (" . $date . ")&nbsp;" . $msg_db . "<br />";
	}
?>
Je ne demande pas de dynamiser le site, c'est déjà fait, mais je voudrais juste faire qu'au lieu d'avoir

Code : Tout sélectionner

machin à dit (il y a 1 minutes) salut machin à dit (il y a 1 minutes) salut j'ai dit: blablabla
que ça soye

Code : Tout sélectionner

machin à dit (il y a 1 minutes) salut j'ai dit: blablabla machin à dit (il y a 1 minutes) salut
Et j'aimerai aussi que dés que l'on reçois un message, on soit averti sur la page.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 avr. 2012, 17:33

C'est un problème d'algo... actuellement ton code affiche la liste des messages de "machin" via une boucle while, puis affiche tes messages avec une seconde boucle. Résultat, tous tes messages apparaissent après.

Au lieu de boucler sur les messages d'un individu, il faudrait que tu boucles sur l'ensemble des messages en triant ceux-ci par date ou par id pour pouvoir les afficher dans le bon ordre.

Tu peux faire ça directement dans une requête SQL ou une fois que tu récupères tes résultats, au lieu de faire un echo immédiatement pour les afficher, tu les stockes dans un tableau à plusieurs dimensions. Tu pourras alors trier ton tableau par date avant de le parcourir pour afficher tes messages.
(La première solution reste quand même la plus optimisée)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

EverySocial
Invité n'ayant pas de compte PHPfrance

15 avr. 2012, 17:49

C'est un problème d'algo... actuellement ton code affiche la liste des messages de "machin" via une boucle while, puis affiche tes messages avec une seconde boucle. Résultat, tous tes messages apparaissent après.

Au lieu de boucler sur les messages d'un individu, il faudrait que tu boucles sur l'ensemble des messages en triant ceux-ci par date ou par id pour pouvoir les afficher dans le bon ordre.

Tu peux faire ça directement dans une requête SQL ou une fois que tu récupères tes résultats, au lieu de faire un echo immédiatement pour les afficher, tu les stockes dans un tableau à plusieurs dimensions. Tu pourras alors trier ton tableau par date avant de le parcourir pour afficher tes messages.
(La première solution reste quand même la plus optimisée)
Le problème c'est que je ne vois pas comment faire, on va dire que je suis paumé :/

EVERYSOCIAL
Invité n'ayant pas de compte PHPfrance

15 avr. 2012, 19:10

Je suis toujours bloqué sur ce sujet :/ !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 avr. 2012, 20:20

Que fait ta méthode GetMessages ? ... c'est elle qui retourne les résultats et qu'il faut adapter pour qu'elle te retourne tous les messages par ordre chronologique et non par utilisateur :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

EverySocial
Invité n'ayant pas de compte PHPfrance

15 avr. 2012, 20:38

public function GetMessages($from = '', $to = '')
	{
		return dbquery("SELECT * FROM messages WHERE from_user = '" . $from . "' AND to_user = '" . $to . "' ORDER by timestamp ASC");
	}	
if (isset($_SESSION['to_id']))
{
	$to_id = @intval($_GET['id']);
}

	$messages = $message->GetMessages(USER_ID, $to_id);
	
	while ($s = mysql_fetch_assoc($messages))
	{
		$from_user = $users->GetUserVar('username', $s['from_user']);
		$to_user = $users->GetUserVar('username', $s['to_user']);
		$date = "Il y a&nbsp;" . $core->GetTime(time() - $s['timestamp']);
		$msg_db = $s['message'];
		
		if ($s['from_user'] == $to_id)
		{
			echo $from_user . "&nbsp;&agrave;&nbsp;dit&nbsp;(" . $date . "):&nbsp;" . $msg_db . "<br />";
		}
		
		if ($s['from_user'] == USER_ID)
		{
			echo "Vous avez envoy&eacute; (" . $date . "):&nbsp;" . $msg_db . "<br />";
		}
	}

EverySocial
Invité n'ayant pas de compte PHPfrance

15 avr. 2012, 20:38

le code ci dessus ne m'envoi que les messages que j'ai envoyé

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

15 avr. 2012, 21:01

Tu pourrais faire une nouvelle méthode, qui va te retourner la liste de tous les messages envoyés OU reçus en une seule requête :
public function GetAllMessages($from = '', $to = '')
        {
                return dbquery("SELECT * FROM messages WHERE (from_user = '" . $from . "' AND to_user = '" . $to . "') OR (from_user = '" . $to . "' AND to_user = '" . $from . "') ORDER by timestamp ASC");
        } 
Il te suffit ensuite d'appeler cette méthode et d'afficher les messages :
 $messages = $message->GetAllMessages(USER_ID, $to_id);
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...