• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] json object ausgeben ?

MalcomX

New member
N'Abend erst mal ! ! !

Ich hole bzw. lasse mir mit server-send Event von einem PHP Script Daten über den aktuellen Online Status der User übermitteln. Dies klappt auch soweit nach ewigen Versuchen und Schmökerei im Netz nur hakt's irgendwie von der JS Seite her.

JS Seite:

PHP:
var source = new EventSource('online_status_refresh.php');
source.onmessage = function(evt){
	var jsonData = evt.data;
	var json, ul;
	json = JSON.parse(jsonData);
	ul = document.getElementsByTagName("ul");
	ul[0].textContent = json.user_id;
	ul[1].textContent = json.online_state;
	alert(ul[0]);
};

PHP Seite:

PHP:
$online_users = array();
while ($erg=mysql_fetch_object($abfr)){
	$usr_id = $erg -> id;
	$online_state = $erg -> logged_in;
	$online_users[user_id] = $usr_id;
	$online_users[online_state] = $online_state;
	//$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
}
$json = json_encode($online_users);
echo "data: $json\n\n";


Das alert gibt mir nur folgendes aus

PHP:
[object HTMLUListElement]

und der Wert von

PHP:
liste[0].textContent = json.user_id;

wird auf der Site neben dem Menü ausgegeben


Ich fummel und fummel dran rum und komm einfach nicht auf den Fehler ? ? ?

Gruß
Malcom
 
Zuletzt bearbeitet:
Hi,

Code:
echo json_encode($online_users);

... und das war's schon. Wenn das "formschön" ist, kommt das korrekt bei im JS an. Dort nimmst es mit parse ja auch an.

Was ich nicht sooo verstehe, warum das so ist:
Code:
$online_state = $erg -> logged_in;
$online_users[user_id] = $usr_id;
$online_users[online_state] = $online_state;

Sind hier bspw. user_id und online_state Konstanten? Dann sind diese sehr schlecht kenntlich gemacht!

Dein Vorhaben würde ich - da Du per JS eh via foreach()-Variante arbeiten wirst - eher so lösen:

Hier würde ich eher dies tun:

Code:
$online_users[] = array(
  'usr' => $usr_id,
  'stat' => $erg->logged_in
);

Damit wäre Status und UserID zumindest logisch zusammen. ^^

Mit "console.log" (Konsole im Browser, bitte!) lässt Du Dir mal Deine Variable "json" ausgeben - der Rest dürfte dann klar sein.

Hab Spaß dabei und viel Erfolg!
 
Hallo erst ma ! !

Erst mal vielen Dank für deine Antwort und deine Tipps haben mir echt weitergeholfen. Außer das mit dem foreach hab ich noch nicht so ganz überrissen.

Vor allem das console.log hat mich endgültig mal aus meinen Alert Orgien befreit :D

So hab ich es jetzt gelöst!

Jedoch hab ich jetzt das Problem das es im Chrome läuft sowie auch unter Android jedoch im FF nicht :(

In der Konsole vom FF kann ich nur sehen, das der EventSource nach ein paar mal nicht mehr ausgeführt wird.

PHP:
$(document).ready(function() {
var source = new EventSource('online_status_refresh.php');
source.onmessage = function(evt){
	var jsonData = evt.data;
	var json = JSON.parse(jsonData);
	for (var i = 0; i < json.length; i++){  
	var user = json[i].usr;
	var status = json[i].stat
        console.log(json);
		if(status==1){
			document.getElementById(user).innerHTML="<img src='pics/online.png'>";
		}
		if(status==0){
			document.getElementById(user).innerHTML="<img src='pics/offline.png'>";
		}
	}
}	
});

und die PHP Seite:

PHP:
while ($erg=mysql_fetch_object($abfr)){
	$usr_id = $erg -> id;
	$online_state = $erg -> logged_in;
	$online_users[] = array(
	  'usr' => $usr_id,
	  'stat' => $online_state
	);
}
$json = json_encode($online_users);
echo "retry: 5000\n";
echo "data: $json\n\n";

Gruß und Danke nochmal
Malcom
 
Erst ma vielen Dank für deine Antwort ;)

Danke auch für den Tipp mit onerror.

Zu deiner Frage. Klar hab ich die aktuellste Version ;).

onerror gibt mir keinerlei Fehler aus.

Der aktuelle Stand ist, das ich durch Spielerei mit dem Retry, und irgendwann ich auch durch Google herausfand das man den retry auch auf 0 setzen kann.

Und siehe da es klappt aber wird dann schon haarig und schwammig das ganze bei einem Wert von 0. Wo sich mir auch wiederum die Frage stellt, da ja SSE im Vergleich zu Ajax performanter sein sollte. Ok sei erstmal dahingestellt.

Ich bin bis jetzt nicht weiter dazu gekommen den "Fehler" zu beheben aber es liegt definitiv am retry, und wie schon erwähnt eben nur im FF.

Gruß und euch allen ein schönes Wochenende
Malcom
 
Ja, so ist das mit den "neuen" Funktionen. Bei Webnotification ist das auch nicht anders, da findet man auch die doofsten Dinger bei schon sehr flacher Testtiefe. Ich weiß nicht, wer da immer die Sachen testet, wahrscheinlich nur der Programmierer allein :)
In einem Wirtschaftsunternehmen dürfte man so nicht arbeiten.
 
Zurück
Oben