Rolf B: Javascipt Fehler

Beitrag lesen

Hallo Sven,

Wenn aber eine vom datenset.typ "logout" kommt, dann erhalte ich nr eine Fehlermeldung:

Uncaught SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
    success http://localhost/reload.php?

Es scheint folgender JSON-String beim Script anzukommen:

[{"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.

Warum überhaupt $wertinhalt setzen? Die Konstante 'Autologout' kannst Du auch direkt im Array eintragen.

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?

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. 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.

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.

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?!

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');

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).

Punkt 5: Dein Timer. Ich habe Dir zwar gerade empfohlen, ihn abzuschaffen und es anders zu lösen, aber wenn Du nochmal einen Intervall-Timer brauchst, nimm die setInterval-Funktion statt setTimeout.

Punkt 6: Deine Codegenerierung. Ich sehe da

      data: { 
          ID: '".$ID."',
          Art: 'K'
      },

Und das heißt: Du gibst das JavaScript als einen langen String aus, und brichst Dir vermutlich einen ab, wenn Du Anführungszeichen benutzt.

Bessere Lösung:

<?php
   // bla bla code code
?>
<script>
$(document).ready(function() {

function refresh() {
  $.ajax({ 
    type: 'POST',
    url: './reload.php',
    data: { 
      ID: '<?= $ID ?>',
      Art: 'K'
    },
		success : function(data) {
       ...
    }
   ...
}
</script>
<?php
   // Weiteres PHP

D.h. du schaltest den PHP-Modus einfach aus und schreibst JavaScript. Ein guter Code-Editor sollte damit zumindest ansatzweise klarkommen. In dem Moment, wo Du den Wert von $ID brauchst, verwendest Du das PHP-Tag <?= ?>, mit dem Du den Wert einer Variablen oder eines Ausdrucks in die Ausgabe einsteuern kannst.

Punkt 7: An Stelle eines ready-Handlers mit jQuery kannst Du dein <script> Element auch einfach mit dem Attribut defer versehen. Solche Scripte werden ausgeführt, wenn das DOM fertig aufgebaut ist.

Rolf

--
sumpsi - posui - obstruxi