1

J'ai pris une petite heure et demie ce matin pour développer ce truc... c'est un chat en PHP couplé avec de l'AJAX. C'est super court niveau code, ça permet à une personne qui choppe le chat en cours de ne pas se taper tout le log précédent.
Points positifs :
- reload toussa
- super maniable
- évactuation du log à partir d'une certaine taille
Points négatifs :
- moche (pour le moment)
- évacuation du log à partir d'une certaine taille
- sécurité (???)
- nécessite l'acceptation des cookies

Il vous faut 2 fichiers (index.php et func.php) : <?php      if(!isset($_COOKIE["connexion"])) {           setcookie("connexion",time(),time()+(3600*24*365));      }      echo "<div id=\"ladiv\" style=\"height:90%;overflow:scroll;\"></div>";      echo "<input type=\"text\" name=\"nom\" id=\"nom\"> <input type=\"text\" name=\"nom\" id=\"message\"> <input type=\"submit\" value=\"???\" onClick=\"javascript:sendRequest('');document.getElementById('message').value='';\">"; ?> <script type="text/javascript" language="Javascript"> setInterval("Rechargement()",5000); function createXMLHttpRequest() {      var ua;      if(window.XMLHttpRequest) {          try {                ua = new XMLHttpRequest();          } catch(e) {                ua = false;           }      } else if(window.ActiveXObject) {           try {                ua = new ActiveXObject("Microsoft.XMLHTTP");           } catch(e) {                ua = false;           }      }      return ua; } var req = createXMLHttpRequest(); function sendRequest() {      req.open('post', 'func.php',true);      req.setRequestHeader("Content-type","application/x-www-form-urlencoded");      blabla="nom="+document.getElementById('nom').value+"&message="+document.getElementById('message').value;      req.onreadystatechange = handleResponse;      req.send(blabla); } function Rechargement() {      req.open('post', 'func.php',true);      req.onreadystatechange = handleResponse;      req.send(null); } function handleResponse() {      if(req.readyState == 4){           var response = req.responseText;           document.getElementById('ladiv').innerHTML=response;           document.getElementById('ladiv').scrollTop = document.getElementById('ladiv').scrollHeight;      } } </script> ?> et <?php      if(filesize('log')>=3000000) unlink("stamp");      $moment=time();      $handle=fopen("stamp","w");      fwrite($handle,time());      fclose($handle);      $handle=fopen("log","a");      if($_POST['message']!="") {           fwrite($handle,"\n".$moment.">>>".htmlentities($_POST['nom']).">>>".htmlentities(substr($_POST['message'],0,2000)));      }      fclose($handle);      $handle=fopen("log","r");      while($buffer=fread($handle,filesize("log"))) {           $lignes=explode("\n",$buffer);           $i=0;           foreach($lignes as $ligne) {                $tablog=explode(">>>",$ligne);                if($tablog[1]!="" && $tablog[0]>$_COOKIE["connexion"]) echo "<b>".$tablog[1]."</b> : ".$tablog[2]."<br />";                $i++;           }      }      fclose($handle);
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo

2

Il y a un bug à cause du double filesize() dans func.php, c'est bizarre que tu ne l'ai pas vu, PHP me retourne des erreurs d'index de tableau à cause de ça. Les résultats de filesize() sont mis en cache par PHP, ce qui fait que le second appel retourne une mauvaise valeur. Il faut que tu fasses un clearstatcache() juste avant (et ta boucle while devient alors inutile).
A propos je ne comprends pas le rôle du fichier stamp, et le but du test sur la taille du fichier log.

Il y a aussi un autre problème à cause du "\n" de fwrite($handle,"\n".$moment... lorsque le fichier log n'existe pas encore, il créera une ligne vide qui génèrera des erreurs d'index de tableau à chaque requête.

3

montreuillois
: - sécurité (???)

- Fais un substr() y compris sur le champ "nom" du POST
- On peut injecter des '\n' dans les paramètres du POST, et faire bugger le script pour toutes les requêtes suivantes

4

1 >> Le stamp est là principalement pour une extension non négligeable, à savoir notifier quand a eu lieu le dernier post. Ainsi les "clients" ne rafraîchiront pas le contenu selon la moment de leur dernier rafraîchissement. Je sais pas si j'ai été super clair.
Enfin c'est vrai que pour le moment, ça sert un peu à rien.

2 >> Pour la sécu, c'est clair, y'a à modifier pas mal de trucs.

Sinon... le truc a évolué depuis, on peut rajouter des smilies, etc... Il est assez beau, le nettoyage du cache se fait correctement maintenant. Je vais le proposer en zippé dès Mardi je pense. Si ça t'intéresse. Par contre, un gros souci au niveau des ressources comnsommées parceque la gestion du "stamp" se fait pas encore.
avatar
Slammeur (qu'on voit danser, le long des golfes clairs).
Mon blog qui parle de jeux-vidéo