Ajax/Php rafraichissement automatique

Mik3five -  
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je suis en train de coder un petit tchat. Mon problème est le suivant.
Actuellement, j'utilise un script qui est rappelé régulièrement avec set interval.
Ce script récupère les données dans une base de donnée ou sont enregistrée les messages envoyé

J'utilise une zone unique pour afficher aussi toute mes pages, et j'utilise cette même zone pour le tchat. Le probléme c'est qu'avec le rafraichissement automatique.. il m'est impossible de charger les autres pages en Ajax, car celle-ci disparaisent automatiquement au bout d'une seconde.

J'aimerai que ma page de tchat se rafraichisse, uniquement que lorsqu'il ya des nouvelles données dans la base de donnée.

Je cherche donc une méthode ,ou une structure de controle simple.. qui n'implique pas un rafraichissement périodique.
A voir également:

3 réponses

Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
bonsoir,

pour un chat il faut faire un serveur
et si tu le fais avec un xhr faire une fonction récursive


du genre :
function chatRefresh() {
	var Xhr = new XHR();
	/* Requête */
	Xhr.onreadystatechange = function(){
			if (Xhr.status == 200 && Xhr.readyState == 4) {
				/* Mise a jour du cadre */
				chatRefresh();
			}
		};

}


et en php :

<?php
	/* vérification que la requête est légale */

	while(true) {
	
		/* Test des nouveau message */
	
		if(/*Nouveau message*/) {
			echo /* chaine */
			break;
		}
		else sleep(1);
	}

?>
1
mik3five
 
if(isset($_SESSION['pseudo']) && !empty($_SESSION['pseudo']))
{
	include_once($_SERVER['DOCUMENT_ROOT'].'/include/sql2.php');
	while(true) {
		
		if(connect('chat'))
		{
			$selection='SELECT * FROM 'discussion' WHERE 'send'=0 AND 'nosend'=1 ORDER BY 'id' DESC LIMIT 30';
			$requete=mysql_query($selection) or die('Erreur dans le fichier '.__FILE__.' à la ligne '.__LINE__.' '.mysql_error());
			$resultat=mysql_num_rows($requete);
			writeReq($selection);
			writeReq($resultat);
			
			if($resultat>0)
			{
				$_SESSION['resultat']=$resultat;
				while($message=mysql_fetch_assoc($requete))
				{
					$texte.=$message['id'].'->'.htmlspecialchars($message['pseudo']).':';
					$texte.=htmlspecialchars($message['date']);
					$texte.=htmlspecialchars($message['texte']).'<br>';	
					
					
				}
				echo '----------------------------<br>';
				echo $texte;
				
				break;
			}
			else
			{
				sleep(2); break;	
			}
		}
		else
		{
			echo 'Erreur de connexion';
			sleep(2);
			break;	
		}
	}
}
else
{
	echo '0';
}


1
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
c'est ton serveur au complet ça ?

si c'est le cas il ne vas pas du tout

inutile de faire un sleep suivit d'un break au contraire sleep s'utilise quand il n'y a pas de break
0
mik3five
 
non non ce n'est pas mon serveur au complet. tu as un exemple concret de "serveur au complet" dans ce contexte?. disons que je suis juste un amateur éclairé, qui joue avec 5, 6 langages..
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
<?php

	if(isset($_SESSION['pseudo']) && !empty($_SESSION['pseudo'])) exit('0');
	
	include_once($_SERVER['DOCUMENT_ROOT'].'/include/sql2.php');
	
	while(true) {
		if(!connect('chat')) exit('Erreur de connexion');

		$selection='SELECT * FROM discussion WHERE send=0 AND nosend=1 ORDER BY id DESC LIMIT 30';
		$requete=mysql_query($selection) or die('Erreur dans le fichier '.__FILE__.' à la ligne '.__LINE__.' '.mysql_error());
		$resultat=mysql_num_rows($requete);
		/*writeReq($selection);
		writeReq($resultat);*/
		if($resultat == 0) {
			usleep(50000);
			continue;
		}
		$_SESSION['resultat']=$resultat;
		while($message=mysql_fetch_assoc($requete)) {
			$texte .= $message['id'].'->'.htmlspecialchars($message['pseudo']).':'.
					htmlspecialchars($message['date']).
					htmlspecialchars($message['texte']).'<br>';
		}
		break;
	}

	echo '----------------------------<br>';
	echo $texte;

?>
0
Mik3five
 
Je poste mon code bientôt. il est fonctionnel. Merci atropa !
0
mik3five
 
Alors j'ai une question...

Comment faire la distinction entre nouveau message et ancien message?

Pck, bêtement, j'ai essayé ceci.

Chaque message envoyé sur le tchat, reçois l'attribut non lu.
Lorsque celui-ci est rapatrié via le refreshChat, le script php, met l'attribut non lu en lu.
Cependant, le message ne s'affiche quasiment jamais sur les autres navigateurs.

Et quand, dans mon script, qui récupère les message, je ne met pas de critère , je demande juste les 30 derniers messages... il me renvoie en boucle les 30 derniers messages......

Comment est ce que je peux faire, pour être sur et certains que chaque message s'affiche, et pas en boucle.
0
Atropa Messages postés 1940 Date d'inscription   Statut Membre Dernière intervention   274
 
enregistre plutôt l'heure en micro secondes ou en milli secondes du dernier affichage
0