Bonjour j'ai fait ce petit chat en ajax pour m'entrainer. Rien de particulier, il appelle une page php "minichat_post.php", toutes les secondes avec un settimeout pour actualiser les nouveaux messages. Et il envoie le pseudo et le message à cette page lorsque l'utilisateur cliquer sur envoyer.
La page minitchat_post.php enregistre le pseudo et le message. Puis affiche les 20 derniers.
Tout fonctionne correctement, le chat marche bien. Et pourtant sur safari, chrome et firefox j'ai parfois un message d'erreur (pas systématique) sous forme d'alerte "Une erreur est survenue ! Code :0 Texte : ". Ce message apparait environ une fois sur 3 ou 4 lorsque je me rend pour la premiere fois sur le chat.
Et lorsque j'actualise rapidement les navigateur il apparait environ toutes les 5 actualisations.
Sous safari iphone ce message est plus fréquent. Si laisse tourner le chat plus d'une minute sur safari iphone (tout fonctionne bien) puisque j'actualise la page, alors je reçois l'alerte d'erreur plusieurs fois. 5 par minutes environ.
Sur Mac Os en revanche c'est plutôt 5 fois pour une heure.
Sur firefox en utilisant la console cela correspond à "NS_ERROR_NOT_AVAILABLE: prompt aborted by user". Qui correspond à cette ligne " throw Components.Exception("prompt aborted by user", Cr.NS_ERROR_NOT_AVAILABLE);"
Voici le code.
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 <!doctype html> <html> <head> <meta charset="utf-8" /> <link rel="stylesheet" href="style.css" /> <title>mini chat </title> </head> <body> <div id="blockpage"> <div id="formulaire"> <form id="formuclick" method="post" action="minichat_post.php"> <p> <span class="titremessage"> Ecris ton message </span> <br /> <label for="pseudo">Pseudo :</label> <input type="text" name="pseudo" /> <br /> <label for="message">message :</label> <input type="text" name="message" id="message" /> <br /> <input type="submit" value="Envoyer" id="envoyer"/> </p> </form> </div> <p id="chat"> </p> <script>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 (function() { function affichemessage(pseudo,message) { var xhr = new XMLHttpRequest(); xhr.open('POST', 'minichat_post.php'); xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { document.getElementById('chat').innerHTML = xhr.responseText; // J'affiche le contenu de minichat_post.php dans le div chat. Cela marche bien. setTimeout(affichemessage, 1000); } else if (xhr.readyState == 4 && xhr.status != 200) { alert('Une erreur est survenue !\n\nCode :' + xhr.status + '\nTexte : ' + xhr.statusText); } } if (pseudo !==undefined && message !==undefined) { xhr.send('pseudo='+ pseudo+ '&message='+message); } else { xhr.send(null); } } affichemessage(); var cliquer = document.getElementById('formuclick'); cliquer.onsubmit = function() { var pseudo=document.getElementById('pseudo'); var message=document.getElementById('message'); var pseudovalue=encodeURIComponent(pseudo.value); var messagevalue=encodeURIComponent(message.value); message.value=''; message.focus(); affichemessage(pseudovalue,messagevalue); return false; }; })();
Code html : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 </script> </div> </body> </html>
Voici le code de la page minichat_post.php qui affiche le message.
Code php : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 <?php try { $bdd= new pdo ('mysql:host=localhost;dbname=test','root','root'); } catch (exception $e){ die('erreur :'.$e->getMessage()); } if (isset($_POST['pseudo']) and isset($_POST['message'])){ $req=$bdd->prepare('insert into minichat(pseudo,message,date_creation) VALUES(:pseudo, :message, now()) '); $req->execute(array( 'pseudo'=> htmlspecialchars($_POST['pseudo']), 'message'=> htmlspecialchars($_POST['message']) )); } $req=$bdd->prepare('select pseudo,message, DATE_FORMAT(date_creation,\'%d/%m/%Y à %Hh%i\') as date_modif from minichat order by date_creation desc limit 0,20'); $req->execute() or die(print_r($req->errorInfo())); $i=2; while ($donnees=$req->fetch() ) { $classe=$i%2; if ($classe==0) { $classe='classgris'; } else { $classe='classblanc'; } echo '<span class="'. $classe. '"> <span class="pseudo"> '.htmlspecialchars($donnees['pseudo']).'</span> <em>(le '.$donnees['date_modif'].')</em> : '.htmlspecialchars($donnees['message']). '</span> <br />'; $i++; } $req-> closecursor(); ?>
Concernant affichemessage(), elle reçoit les paramètres pseudo et message si elle est appelée via le bouton "envoyer", sinon elle se contente juste de recuperer minichat_post.php pour actualiser les nouveaux messages.
Je précise qu'à la base j'ai fait le script avec un setinterval donc le problème ne vient pas du settimeout.
J'ai aussi remplacé le submit par un simple bouton déclenché onclick mais cela n'a rien changé pour l'erreur.
Quelqu'un aurait une idée ? Je me prends la tête avec ça depuis hier !!
Edit: Bon je suis vraiment naze, je viens de réaliser que l'alerte correspond au xhr.status 0. Mais ce que je ne comprend pas c'est pourquoi est ce que ça survient de temps en temps alors que tout est hebergé sur mon ordi. De plus je n'arrive pas à trouver à quoi correspond le statut 0.
Partager