Hallo Rolf,
unglaublich, wie Du Dich mit soviel (Fremd)Code auseinandersetzt, das ist schon klasse!
[{"id":"","wert":null,"typ":"test"}]
Punkt 1: Es wäre nicht verständlich, wo im Logout-Fall ein JSON-Objekt mit typ=test herkommt. Du setzt $session_ok auf 0 und überspringst den Folgeteil damit. Wenn da typ=test steht, war die Session valide und
...
war nicht gleich 1.
Das sehe ich genauso. Deshalb frage ich hier nach.
Warum überhaupt eine $session_ok Variable? Kannst Du den Teil, der nur bei einer gültigen Session laufen soll, nicht einfach in ein
else
verpacken?
Eigentlich schon, aber ich frage nur jede halbe Stunde nach, ob die Session noch gültig ist und dann würde auch der Restcode nur jede halbe Stunde laufen. Daher der Umweg über $session_ok.
Punkt 2: Der Syntax-Error. Der muss von JavaScript kommen, PHP wirft keinen Syntax-Error beim Parsen von kaputtem JSON. Debugging mit alerts ist - mit Verlaub - Kacke. Verwende console.log und mach die Entwicklerwerkzeuge vom Browser auf, um die Konsole zu sehen.
Genau dort habe ich ja die Fehlermeldung heraus kopiert.
Und dann gib vor dem JSON.parse den Inhalt von data aus. Alternativ kannst Du Dir im Netzwerk-Tab der Entwicklerwerkzeuge auch die Antwort des Ajax-Aufrufs anschauen.
Weiß ich nicht, wie geht.
Ich bin nämlich nicht überzeugt, dass da das drin steht, was Du meinst. Ich nehme an, dass da eine PHP Notice drin steht, dass irgendwas nicht passt, und die ist natürlich kein valides JSON. Wenn ich im Firefox einen JSON.parse Aufruf mache und ihm JSON Müll übergebe, bekomme ich genau deine Meldung.
Wäre eine plausible Lösung. Würde aber dann tatsächlich bedeuten, dass nicht beim Browser ankommt, was ich vermute. Ich sagte ja auch, "es scheint dort anzukommen".
Punkt 3: Deine zurückgegebenen Daten. Warum hüllst Du das Objekt in ein Array ein? Das ist nicht nötig. Du musst das Array dann am Client nur unnötig auspacken - ich würde annehmen, das hast Du in deinem geposteten Code herausgenommen. Denn dies hier kann nicht funktionieren:
var einzeldata = JSON.parse( data ); if ( datenset.typ === 'success' ) {
Woher käme der Wert in
datenset
, wenn Du dort nicht vorher einzeldata[0] abgelegt hättest?!
Hast recht. Ich hatte mit den ganzen heraus gelöschten alerts auch Wesentliches nicht gepostet, sorry.
var einzeldata = JSON.parse( data );
for ( var i = 0; i < einzeldata.length; i++ ) {
var datenset = einzeldata[ i ];
}
Punkt 3: Content-Type. Beim Zurückgeben eines JSON-Strings ist es empfehlenswert, zu Beginn des Scripts diese Funktion aufzurufen, um dem Browser mitzuteilen, dass dies kein HTML ist.
header('Content-Type: application/json; charset=utf-8');
An welcher Stelle mache ich das?
Punkt 4: Abfrage von "session vorbei" ohne Polling: Geht nicht. Du hast PHP-seitig keine Wächterfunktion vorliegen, die beim Verfall einer Session getriggert wird. Ich weiß auch gar nicht, wie man PHP sagen sollte, dass eine Session eine maximale Lebensdauer hat. Man kann dem Session-GarbageCollector eine Zeit mitgeben, nach der es ihm erlaubt ist, alte Sessions abzuräumen. Der läuft aber nicht deterministisch, sondern startet zufällig mit einer gewissen Wahrscheinlichkeit. Wann genau das passiert, habe ich gerade im PHP Handbuch nicht gefunden, und vor 16 Jahren schrieb ein gewisser Matt dies.
D.h. Du kannst dem Client nur die Timeout-Zeit deiner Sessions mitteilen und der Client kann dann mittels setTimeout einen eigenen Timer starten. Den muss er natürlich bei jedem Serverkontakt, der die Session aktualisiert, zurücksetzen (setTimeout gibt ein Löschticket zurück, mit dem Du clearTimeout aufrufen kannst um den Timer zu löschen).
Nein, das mache ich ganz anders.
Ich habe in den Konfigdatenm eine $maxtime gesetzt.
Zudem wird für jeden User eine Session generiert, die Session-ID in eine db eingetragen und bei jedem Seitenaufruf der Datetime-Stempel aktualisiert.
So brauche ich jetzt nur in php zu schauen, ob now() für diesen User größer ist als sein Stempel + $maxtime.
Sven