feuerteufel
Goto Top

Probleme mit Ajaxchat und Firefox (Ajax,Java,Php)

Hallo, ich bin seit ein paar Tagen an einem Ajaxchat dran und mit dem Firefox klappt es nicht.

Hier ist der Chat im Original-Quellcode zu finden wie ich ihn durch Google gefunden habe:
http://www.ml-bkf.de/chat/ajaxchat.htm


Das Problem ist folgendes: Ich kann mit dem InternetExplorer ganz normal Messages speichern (nur bei Sonderzeichen macht es noch Probleme) - da funktioniert es ohne Probleme.

Aber mit dem Firefox geht es nicht. Er öffnet die Messages zwar, aber er speichert nur selten etwas in die Datenbank (siehe Chatverlauf). Es dauert also manchmal 40-50 Minuten, bis ich mit dem Firefox wieder eine Messages im Chat senden kann (und diese auch gespeichert wird) - vorher ignoriert er das Senden einfach. Das könnt ihr ja gerne mal ausprobieren.

Man kann also nicht unmittelbar nach dem Senden einer Message erneut eine Message absenden, man muss ne längere Zeit warten. Mal geht es nach 10 Minuten wieder, dann dauerts auch mal ne ganze Stunde.

Es handelt sich um einen Ajaxchat mit einer ajaxchat.htm mit dem Formular und dem Javascript und eine ajaxchatx.php mit dem ausführenden Php-Code zum speichern in die Datenbank.

Durch ausrufen der Php-Datei kann man direkt einen Eintrag in die Datenbank erzeugen, das funktioniert auch Problemlos:
http://www.ml-bkf.de/system/ajaxchatx.php?action=createNewEntry&nam ...

Folgende URL ruft die Einträge aus der Datenbank ab:
http://www.ml-bkf.de/system/ajaxchatx.php?latestID=1&action=getLate ...

Hier ist noch der Code:
ajaxchat.htm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
<head>
<title>AJAX Chat</title>
<style type="text/css">  
.entry {
width: 100%;
background-color: #F5F5F5;
border: 1 dotted #666666;
font-family: Verdana;
}

.entry#small {
color: #CCCCCC;
}

</style>
<script type="text/javascript">  
var latestID = 0; //latestID als globale Variable

//Funktion, mit der Anfragen nach neuesten Einträgen gesendet wird
function getLatestEntries() {
	if (httpGetLatestEntries.readyState == 4 || httpGetLatestEntries.readyState == 0) { //Anfrage senden, wenn Status der letzten Anfrage "completed" ist, bzw. "nicht initialisiert" (d.h. erster Aufruf)  
  	httpGetLatestEntries.open("GET","http://www.ml-bkf.de/chat/ajaxchatx.php?action=getLatestEntries&latestID="+latestID, true);  
    httpGetLatestEntries.onreadystatechange = handleHttpGetLatestEntries; 
  	httpGetLatestEntries.send(null);
	}
}

//Behandelt die Serverantwort
function handleHttpGetLatestEntries() {

  if (httpGetLatestEntries.readyState == 4) {

    response  = httpGetLatestEntries.responseXML.documentElement; 
	messages = response.getElementsByTagName('message');  
    
	if(messages.length > 0) { //Anzeige nur, wenn mindestens eine neue Nachricht
		//document.write(messages.length); //Debug
		for (var i=messages.length-1; i>=0; i--) {
  			//Darstellung im Browser mit dem DOM
 		  	showEntry= document.getElementById("showEntries");  
			neuSpan = document.createElement('span');  
			neuSpan.setAttribute('class','entry');  
			neuSpan.setAttribute('className','entry'); //für den InternetExplorer  
			neuSmall = document.createElement('small');  
			neuNameDate = document.createTextNode(messages[i].getElementsByTagName('date').firstChild.nodeValue + ': ' + messages[i].getElementsByTagName('name').firstChild.nodeValue +': ');  
			neuSmall.appendChild(neuNameDate);
			neuSpan.appendChild(neuSmall);
			neuSpan.appendChild(document.createElement('br'));	  
			neuNachricht = document.createTextNode(messages[i].getElementsByTagName('nachricht').firstChild.nodeValue);  
			neuSpan.appendChild(neuNachricht);
			neuSpan.appendChild(document.createElement('br'));  
			showEntry.insertBefore(neuSpan, showEntry.firstChild);		
		
		} 
		latestID = messages.getElementsByTagName('id').firstChild.nodeValue; //Festlegung der neuen latestID  
		//document.write(latestID); //Debug
	}

    setTimeout('getLatestEntries();',4000); //Erneute Anfrage in vier Sekunden  
  } 
}



//neue Nachricht auf dem Server erzeugen
function createNewEntry(name, nachricht) {
	
	if (httpCreateNewEntry.readyState == 4 || httpCreateNewEntry.readyState == 0) {
	 url  = 'http://www.ml-bkf.de/chat/ajaxchatx.php?action=createNewEntry&name=' + name + '&nachricht=' + nachricht;      
     httpCreateNewEntry.open("GET", url, true);  
     httpCreateNewEntry.onreadystatechange = handleHttpCreateNewEntry;
   	 httpCreateNewEntry.send();
 	}
}

//behandelt die Antwort des Servers
function handleHttpCreateNewEntry() {
  if (httpCreateNewEntry.readyState == 4) {
  //nachdem eine neue Nachricht erfolgreich erzeugt wurde, wird diese angezeigt
  	getLatestEntries();   
	}
}

function checkInput(name, nachricht) {

if(name != "" && nachricht != "") {  
createNewEntry(name, nachricht);
}
else {
alert("Bitte sowohl einen Namen, als auch eine Nachricht eingeben!");  
}


}


function createXMLHttpReqObj() {  //erzeugt die XMLHttpRequest Objekte
 
    // für Mozilla etc.
    if(window.XMLHttpRequest) {
    	try {  //Fehler abfangen
			req = new XMLHttpRequest(); 
        } catch(e) {
			req = false;
        }
    // für den InternetExplorer
    } else if(window.ActiveXObject) {
       	try {
        	req = new ActiveXObject("Msxml2.XMLHTTP");  
      	} catch(e) {
        	try {
          		req = new ActiveXObject("Microsoft.XMLHTTP");  
        	} catch(e) {
          		req = false;
        	}
		}
	}
	return req;
}



// Initialisierung der beiden Objekte
var httpGetLatestEntries= createXMLHttpReqObj();
var httpCreateNewEntry = createXMLHttpReqObj();

</script>
</head>

<body onload="getLatestEntries()">  
<h1>AJAX Chat Anwendung</h1>

<form name="form1" method="post" action="">  
  <p>Name<br>
    <input type="text" name="name" id="name">  
    <br>
    <br>
    Nachricht<br>
    <input type="text" name="nachricht" id="nachricht">  
  </p>
  <p>
    <input type="submit" name="Submit" value="Submit" onclick="checkInput(document.form1.name.value, document.form1.nachricht.value)" >  
  </p>
</form>
<div id="showEntries">  

</div>
</body>
</html>

und die ajaxchatx.php:
<?php

header( "Cache-Control: no-cache, must-revalidate" );   
header( "Pragma: no-cache" );  
header("Content-Type: text/xml; ");  

$db_host = "localhost"; // Host   
$db_user = ""; // User   
$db_password = ""; // Passwort  
$db_name = ""; // Datenbank   

mysql_connect($db_host,$db_user,$db_password) or die(mysql_error()); 
mysql_select_db($db_name) or die(mysql_error());


function getLatestEntries($latestID) {

 $query = "SELECT id, name, nachricht, date FROM ajaxchat WHERE id > $latestID ORDER BY id DESC LIMIT 20";   
 $erg = mysql_query($query); 
 echo "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\"?>";  
 echo "<messages>";  
    while($erg2=mysql_fetch_array($erg))     
     { 
     echo "<message><id>".$erg2['id'];  
     echo "</id><name>".$erg2['name'];  
     echo "</name><nachricht>".$erg2['nachricht'];  
     echo "</nachricht><date>".date("d.m.Y H:i",$erg2['date']);  
     echo "</date></message>";  

     }
echo "</messages>";  


}

function createNewEntry($name, $nachricht) {

//HTML Tags entfernen
$name = strip_tags($name, '');  
$nachricht = strip_tags($nachricht,'');   


$query = "INSERT INTO ajaxchat(name, nachricht, date)   
VALUES ('$name','$nachricht','".time()."')";  
echo "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>";  
if (!mysql_query($query)) {
//nicht notwendig, dient nur der Fehlerkontrolle
echo "<createNewEntry>0</createNewEntry>";}  
else {
echo "<createNewEntry>1</createNewEntry>";  
}
}



if ($_GET['action'] == "createNewEntry") {  

createNewEntry($_GET['name'], $_GET['nachricht']);  

}
elseif ($_GET['action'] == "getLatestEntries") {  

getLatestEntries($_GET['latestID']);  

}

mysql_close();

?>

Hat jemand eine Ahnung woran das liegen könnte dass es mit dem Firefox nicht funktioniert?

Danke schonmal
und viele Grüße
Niklas

Content-ID: 131605

Url: https://administrator.de/contentid/131605

Ausgedruckt am: 23.11.2024 um 02:11 Uhr

TheBob
TheBob 14.12.2009 um 08:23:03 Uhr
Goto Top
Hallo Niklas,

eventuell könnte es daran liegen, dass der Firefox die Seite aus dem Cache holt und gar keinen neuen Request an den Server stellt. Das darf er, da es sich um eine GET-Anfrage handelt.

Vielleicht hilft es, wenn du in der "ajaxchat.htm" das GET in Zeile 25 durch ein POST erstetzt.

Viele Grüße

TheBob
FeuerTeufel
FeuerTeufel 14.12.2009 um 12:39:09 Uhr
Goto Top
Wenn ich das GET in Zeile 25 und 73 in POST ändere:

httpGetLatestEntries.open("POST","http://www.ml-bkf.de/system/ajaxchatx.php?action=getLatestEntries&latestID="+latestID, true);  

sowie in der PHP-Datei

if ($_POST['action'] == "createNewEntry") {  

createNewEntry($_POST['name'], $_POST['nachricht']);  
}
elseif ($_POST['action'] == "getLatestEntries") {  

getLatestEntries($_POST['latestID']);  

}

schreibe, dann geht gar nichts mehr. Weder im InternetExplorer noch im Firefox. Dann kann man weder Messages speichern noch lesen.
TheBob
TheBob 14.12.2009 um 13:18:38 Uhr
Goto Top
Ich dachte auch nur in der htm-Datei ändern, da du die Parameter ja weiterhin per GET übergibst. Hilft das auch nicht?
FeuerTeufel
FeuerTeufel 14.12.2009 um 15:28:39 Uhr
Goto Top
Das habe ich gerade ausprobiert, POST hat keine auswirkung - selber Fehler wie bei GET.

Ich habe es jetzt malauf POST gelassen - müsste dann bei dir genauso wenig im Firefox funktionieren.
FeuerTeufel
FeuerTeufel 16.12.2009 um 03:43:15 Uhr
Goto Top
Also ich fass das ganze jetzt nochmal zusammen. Es handelt sich um das oben gepostete Script - in der ajaxchat.htm habe ich Zeile 25 und 73 auf POST geändert.

Mit dem InternetExplorer funktioniert der Chat einwandfrei (nur der Seitenreload beim Senden stört auf der Homepage (www.ml-bkf.de) etwas. Das beeinträchtigt aber nicht die Funktion.


Der Fehler im Firefox ist kurios:
Wenn man den Chat öffnet (http://www.ml-bkf.de/chat/ajaxchat.htm) ), zeigt er zwar alle Messages an, speichert aber keine wenn man welche sendet.

Er speichert ebenfalls keine Messages, wenn ein anderer oder man selbst kurz zuvor eine Message an den Chat gesendet/gespeichert hat.

Wartet man hingegen 10-80 Minuten, funktionert das Senden einmalig - danach muss man wieder 10-80 Minuten warten - erst dann kann man wiederholt eine Message an den Chat senden. Mal funktioniert es schon nach 10 Minuten, mal dauert es über eine Stunde. In der Zwischenzeit werden die Messages die man speichern will einfach ignoriert.

Wenn er die Seite wirklich aus dem Cache holt, warum funktioniert es denn nach der genannten Wartezeit im intervall, aber nicht unmittelbar nach dem Seitenaufruf. Das ergibt kein Sinn. Was ist nach 10 bis 80 Minuten Wartezeit anders als vorher?

Bis jetzt scheint es keine Lösung zu geben...