CHAT Log Help

DelphiDell

Erfahrenes Mitglied
Halo, ich stecke schon wieder in schwierigkeiten,

aber diesmal ist es wesentlich weniger Quelltex. Ich denke es liegt am AS.

Meine Flas Datei:

Code:
_global.chat = this;
var iv;
xm = new XML();
xm.load = function()
{
	Update(this);
}
	
function Update(obj)
{
	_root.log.htmlText = "//Chatlog V. 1.0 (c) Mario R.";
	lv = new LoadVars();
	lv.action = "load";
	clearInterval();
	lv.sendAndLoad("log.php",xm,"POST");
	var mlis = xm.childNodes[0];
	inslog(mlis);
	setInterval(function() { Update(); }, 2000);
}

function inslog(node)
{
	_root.log.htmlText = node.nodeName;
	for(var i = 0;i<node.length;i++)
	{
		var nod = node.childNodes[i];
		var from = nod.attributes.u_name;
		var time = nod.attributes.time;
		var msg = unescape(nod.attributes.msg);
		writelog(from,time,msg);
	}
}

function writelog(from,time,msg)
{
	_root.log.htmlText = "Messages ausgabe 2";
	_root.log.htmlText = '<font color="red">'+from+'</font>';
	_root.log.htmlText = '<font color="green">['+time+']</font>';
	_root.log.htmlText = '<font color="black">['+msg+']</font>';
}

Meine PHP

PHP:
<?php
if($_POST["action"] == "load")
{
   $connect = mysql_connect("localhost","xxxxxxx","xxxxxxx");
   mysql_select_db("xxxxxxxxxxx",$connect);
   $q = mysql_query("SELECT * FROM chat_history");
   echo '<messages />';
   while($row = mysql_fetch_assoc($q))
   {
   echo '<log u_name="unknow" time="'.$row["time"].'" msg="'.$row["message"].'">';
   } 
   echo '</messages>';
}
?>

Ich hoffe jemand kann mier helfen.

Gruss

DelphiDell
 
Hi,

1. Bitte achte doch ein wenig mehr auf Rechtschreibung: Dinge wie "Quelltex", "Flas" und "mier" zeugen weniger von Nichtwissen, als schlicht und einfach von Unaufmerksamkeit.

2.
Code:
xm = new XML();
xm.load = function()
{
	Update(this);
}
  • In aller Regel sollte Dein xml-Objekt Whitespaces ignorieren, z.B. wenn Du den Baum auf php-Seite mit Umbrüchen ausgibst:
Code:
xm.ignoreWhite = true;
  • der Handler, der beim Laden aufgerufen wird, heisst "onLoad" und nicht "load":
Code:
xm.onLoad = function() {
    Update(this);
}

Gruß
.
 
Funktioniert leider immer noch nicht, es wird zwar der childname "messages" ausgegeben, mehr aber nicht. Und nach wenigen sekunde stürzt der Funpic server ab :(

Code:
_global.chat = this;
var iv;
xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function()
{
	Update(this);
}
	
function Update(obj)
{
	_root.log.htmlText = "//Chatlog V. 1.0 (c) Mario R.";
	lv = new LoadVars();
	lv.action = "load";
	clearInterval();
	lv.sendAndLoad("log.php",xm,"POST");
	var mlis = xm.childNodes[0];
	inslog(mlis);
	setInterval(function() { Update(); }, 2000);
}

function inslog(node)
{
	_root.log.htmlText = node.nodeName;
	for(var i = 0;i<node.length;i++)
	{
		var nod = node.childNodes[i];
		var from = nod.attributes.u_name;
		var time = nod.attributes.time;
		var msg = unescape(nod.attributes.msg);
		writelog(from,time,msg);
	}
}

function writelog(from,time,msg)
{
	_root.log.htmlText = "Messages ausgabe 2";
	_root.log.htmlText = '<font color="red">'+from+'</font>';
	_root.log.htmlText = '<font color="green">['+time+']</font>';
	_root.log.htmlText = '<font color="black">['+msg+']</font>';
}
 
Hi,

ok, beim zweiten Blick sehe ich noch ein paar mehr Fehler:
  • Wo wird denn in Deinem AS-Code die xml-Datei zuerst geladen? ich sehe dort nur einen Quasirekursiven Aufruf: beim onLoad wird die Methode Update aufgerufen, die wiederum direkt einen Scriptaufruf durchführt, die zum onLoad des xml-Objektes führt. Abgesehen davon, dass das ganze bei Dir nirgendwo angestoßen wird, würde diese Vorgehensweise höchstwahrscheinlich zu einem Absturz führen.

  • Im PHP-Script sind auch noch einige Fehler:
PHP:
echo '<messages />';
Das Tag darfst Du an dieser Stelle nicht mit einem / schließen, da es ja weitere Kindknoten enthält.

PHP:
'<log u_name="unknow" time="'.$row["time"].'" msg="'.$row["message"].'">';
Die log-Tags musst Du allerdings mit einem / schließen, da sie weder Textinhalt noch Kindknoten enthalten.

Gruß
.
 
Tobias Menzel hat gesagt.:
Wo wird denn in Deinem AS-Code die xml-Datei zuerst geladen? ich sehe dort nur einen Quasirekursiven Aufruf: beim onLoad wird die Methode Update aufgerufen, die wiederum direkt einen Scriptaufruf durchführt, die zum onLoad des xml-Objektes führt. Abgesehen davon, dass das ganze bei Dir nirgendwo angestoßen wird, würde diese Vorgehensweise höchstwahrscheinlich zu einem Absturz führen.

hmm, wie kann ich dass realisieren, dass es nicht mehr absürzt
 
hmm, wie kann ich dass realisieren, dass es nicht mehr absürzt
... indem Du die offensichtlichen Fehler korrigierst, und das ganze dann Schritt für Schritt debuggst. Anhand des von Dir geposteten Codes kann ich nicht einmal ersehen, was Du überhaupt erreichen willst, geschweige denn, eine fertige Korrekur präsentieren.

Die normale Vorgehensweise ist:
  • xml-Objekt erstellen, onLoad-Handler festlegen

  • Im onLoad-Handler Aufruf einer entsprechenden Ausgabefunktion

  • load-Methode des xml-Objektes ausführen (sollen die Inhalte in bestimmten Intervallen automatisch geupdatet werden, so kannst Du an dieser Stelle ein Intervall einsetzen.

Gruß

P.S.: Du hast Dir meine Bemerkung zur Rechtschreibung scheinbar nicht durchgelesen ("absürzt") - um mal Nägel mit Köpfen zu machen: Noch mal, und der Thread wird geschlossen (sorry, aber anders scheint es nicht zu klappen). ;)
.
 
In der Chatlog-Datei? Sicher, hier:
Code:
var xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function() {
	parse(this);
}

xm.load("chatlog.php");

und im Chat selber wird in der parseUpdate-Methode ein Intervall gestartet, dass zum Laden der Daten führt:
Code:
function parseUpdate(obj) {
	var ulist = obj.childNodes[0];
	var messages = obj.childNodes[1];
	//history.setRaw(obj.toString());
	parseUsers(ulist);
	parseMessages(messages);
	if (checking) iv = setInterval(function() { doUpdate(); }, timeout);
}
Das erste Laden wird angestoßen, wenn sich ein User einloggt:
Code:
function doLogin(nick) {
	setStatus("login: " + nick);
	var lv = new LoadVars();
	lv.action = "login";
	lv.nickname = nick;
	checking = true;
	history.clearMessage();
	clearInterval(iv);
	lv.sendAndLoad("chat.php", xm, "POST");
	chat_nickName = nick;
}
Die sendAndLoad-Methode des LoadVars-Objekts übergibt das xml-Objekt als Rückgabeziel - der onLoad-Handler ruft die Funktion parseUpdate auf, von wo aus (wie gesagt) nach einer gewissen Zeitspanne (nicht aber sofort, denn das würde zu einer Überlastung führen) wieder das php-Script aufgerufen wird.

Gruß
.
 
Also in etwa so

Funktioniert aber nicht....

PHP:
_global.chat = this;
var iv = 0;
var xm = new XML();
xm.ignoreWhite = true;
xm.onLoad = function()
{
	inslog(this);
}
xm.load("log.php");

function Update()
{
	_root.log.htmlText = "//Chatlog V. 3.0 (c) Mario R.";
	lv = new LoadVars();
	lv.action = "load";
	lv.sendAndLoad("log.php",xm,"POST");
}

function inslog(node)
{
	for(var i = 0;i<node.length;i++)
	{
		var nod = node.childNodes[i];
		var from = nod.attributes.u_name;
		var time = nod.attributes.time;
		var msg = unescape(nod.attributes.msg);
		writelog(from,time,msg);
	}
	iv = setInterval(function() { Update(); }, timeout);
}

function writelog(from,time,msg)
{
	str += '<font color="red">'+from+'</font>';
	str +=  '<font color="green">['+time+']</font>';
	str +=  '<font color="black">['+msg+']</font>';
	_root.log.htmlTex = str;
}
 
Prinzipiell schon näher drann - allerdings solltest Du das Interval in der Funktion "Update" mit clearInterval löschen, sonst bekommst Du eine Menge überlagernder Intervalle. ... oder Du definierst das Intervall nur einmal am Anfang.

Eine generelle Frage: Wenn das ganze lediglich ein Chatlog werden soll - warum orientierst Du Dich dann nicht an meiner "chatlog.fla"? Die ist um einiges simpler aufgebaut.

EDIT: Um das ganze zu beschleunigen wäre es hilfreich, wenn Du auch hier die betreffenden Dateien einmal postest: Ich kann mir Code zwar ansehen, bin allerdings kein perfekter Debugger und kann nur offensichtliche Fehler bemerken. Mit der Datei könnte ich die Angelegenheit "in situ" testen, was die Fehlersuche um einiges vereinfachen würde.

Gruß
.
 
Zurück