Ajax/Php rafraichissement automatique

Fermé
Mik3five - 12 nov. 2012 à 22:34
Atropa Messages postés 1940 Date d'inscription mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 - 14 nov. 2012 à 20:01
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 mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
13 nov. 2012 à 00:35
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
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 mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
13 nov. 2012 à 17:05
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
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 mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
Modifié par Atropa le 13/11/2012 à 17:16
<?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
Je poste mon code bientôt. il est fonctionnel. Merci atropa !
0
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 mercredi 25 juin 2008 Statut Membre Dernière intervention 11 mai 2014 274
14 nov. 2012 à 20:01
enregistre plutôt l'heure en micro secondes ou en milli secondes du dernier affichage
0