johny7: Ausgaben abfangen

Moin allerseits,

ich erwarte von meinen PHP-Skripten JSON-Ausgaben. Solange alles gut läuft, bekomme ich was ich will. Wenn aber z.B. ein Fehler auftaucht, weil z.B. eine Datenbankabfrage nicht funktioniert oder ein Syntaxfehler vorhanden ist, kann meine JavaScript-Funktion mit der Rückgabe nichts anfangen, weil sie sich nicht JSON-interpretieren lässt. Wie veranstalte ich, dass alle Ausgaben auch in eine JSON-Variable geschickt werden?

Grüße, JN

--
ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
http://www.johny7.de
  1. Moin!

    Du liest hier:

    http://php.net/manual/en/function.ob-start.php

    ... und überlegst, wie Du Die Fehler dann in der Rückmeldung unterbringst und clientseitig auswertest.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. Moin allerseits,

      http://php.net/manual/en/function.ob-start.php
      ... und überlegst, wie Du Die Fehler dann in der Rückmeldung unterbringst und clientseitig auswertest.

      Danke.

      Ich habe es jetzt so gelöst:

        
      function callback($buffer) {global $echo; $echo = $buffer; return '';} ob_start("callback");  
      
      

      Ganz unten bei der Ausgabe steht dann:

        
      ob_end_flush(); $return['buffer'] = $echo;  
      echo json_encode($return);  
      
      

      An $return wurden vorher natürlich weitere Werte übergeben.

      Grüße, JN

      --
      ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
      http://www.johny7.de
  2. Hi!

    Wenn aber z.B. ein Fehler auftaucht, weil z.B. eine Datenbankabfrage nicht funktioniert oder ein Syntaxfehler vorhanden ist, kann meine JavaScript-Funktion mit der Rückgabe nichts anfangen, weil sie sich nicht JSON-interpretieren lässt.

    Warum gibst du denn Fehlermeldungen in Richtung JSON aus? Bei einer Datenbankabfrage hast du maximal mysql_connect() als Kandidaten für PHP-Fehlermeldungen, und da kannst du den @-Operator verwenden. Die weiteren mysql_*()-Funktionen werfen keine PHP-Fehler, da du sie ja (wenn du es richtig machst) gar nicht erst aufrufst, wenn eine der übergeordneten Funktionen über ihren Rückgabewert schon einen Fehler signalisiert.

    Andere PHP-Fehler treten
    a) bei Proframmierfehlern auf - hast du keine, wenn du ausreichend getestet hast.
    b) bei externen Operationen - da kannst du den @ verwenden und Folgefehler durch Auswerten der Rückgabewerte verhindern.

    Besser als @ ist in der Produktivumgebung allerdings, display_errors auf off zu stellen. Schon allein deswegen ergibt sich das Problem der abzufangenden Ausgaben nicht.

    Lo!

  3. Moin allerseits,

    ich erwarte von meinen PHP-Skripten JSON-Ausgaben. Solange alles gut läuft, bekomme ich was ich will. Wenn aber z.B. ein Fehler auftaucht, weil z.B. eine Datenbankabfrage nicht funktioniert oder ein Syntaxfehler vorhanden ist, kann meine JavaScript-Funktion mit der Rückgabe nichts anfangen, weil sie sich nicht JSON-interpretieren lässt.

    Zum Auswerten verwende ich folgende JavaScript-Funktion:

    // implement JSON.parse de-serialization  
    JSON.parse = JSON.parse || function (str) {  
        if (str === "") str = '""';  
        eval("var p=" + str + ";");  
        return p;  
    };
    

    Das Problem taucht vermutlich auf, wenn der eval() fehl schlägt, weil im String keine richtigen Daten sind. Wie kann ich diesen Fall abfangen um dann z.B: ein leeres Objekt zurück zu geben?

    Grüße, JN

    --
    ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
    http://www.johny7.de
    1. Hi!

      eval("var p=" + str + ";");
      Das Problem taucht vermutlich auf, wenn der eval() fehl schlägt, weil im String keine richtigen Daten sind.

      Wie wäre es, stattdessen richtige Daten in den String zu bringen, also solche, die den Syntaxregeln von Javascript entsprechen? Alles andere ist Murksen an der falschen Baustelle.

      Wie kann ich diesen Fall abfangen um dann z.B: ein leeres Objekt zurück zu geben?

      Wenn eval() keine korrekte Syntax findet, kann es diese nicht ausführen. Also ist auch das erwartete Ergebnis nicht da, in diesem Fall eine angelegte Variable namens p.

      Lo!

      1. Moin allerseits,

        Hi!

        eval("var p=" + str + ";");
        Das Problem taucht vermutlich auf, wenn der eval() fehl schlägt, weil im String keine richtigen Daten sind.

        Wie wäre es, stattdessen richtige Daten in den String zu bringen, also solche, die den Syntaxregeln von Javascript entsprechen? Alles andere ist Murksen an der falschen Baustelle.

        Ich habe es schon versucht. Trotzdem kommt es manchmal dazu z.B. wenn PHP wegen eines Fatalen Fehlers abgebrochen wird. Deshalb wollte ich die Funktion tolerant ausführen.

        Wie kann ich diesen Fall abfangen um dann z.B: ein leeres Objekt zurück zu geben?

        Wenn eval() keine korrekte Syntax findet, kann es diese nicht ausführen. Also ist auch das erwartete Ergebnis nicht da, in diesem Fall eine angelegte Variable namens p.

        Wird eval() dann einfach ignoriert und der Fehler tritt eigentlich nur in der Zeile auf, in der auf p zuzugreifen versucht wird? Oder Hängt sich JavaScript dort tatsächlich an eval() auf? Wenn ersteres, dann kann man das ja abfangen.

        Grüße, JN

        --
        ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
        http://www.johny7.de
        1. Hi!

          eval("var p=" + str + ";");
          Das Problem taucht vermutlich auf, wenn der eval() fehl schlägt, weil im String keine richtigen Daten sind.
          Wie wäre es, stattdessen richtige Daten in den String zu bringen, also solche, die den Syntaxregeln von Javascript entsprechen? Alles andere ist Murksen an der falschen Baustelle.
          Ich habe es schon versucht. Trotzdem kommt es manchmal dazu z.B. wenn PHP wegen eines Fatalen Fehlers abgebrochen wird. Deshalb wollte ich die Funktion tolerant ausführen.

          Dann solltest du, wie ich schon vorschlug, die Ausgabe der Fehlermeldungen unterdrücken. Sie haben auf einem Produktivsystem sowieso nichts in der normalen Ausgabe zu suchen. Die Besucher können und sollen mit diesen Informationen nichts anfangen. Es sollte sowieso nur Laufzeitfehler auftreten, denn syntaktische hat man üblicherweise durch umfangreichen Tests ausgeschlossen. Die Ausgabe von Laufzeitfehlern lässt sich komplett unterdrücken (display_errors=off) - unabhängig davon, kann und sollte man sie ja loggen.

          Wenn eval() keine korrekte Syntax findet, kann es diese nicht ausführen. Also ist auch das erwartete Ergebnis nicht da, in diesem Fall eine angelegte Variable namens p.
          Wird eval() dann einfach ignoriert und der Fehler tritt eigentlich nur in der Zeile auf, in der auf p zuzugreifen versucht wird? Oder Hängt sich JavaScript dort tatsächlich an eval() auf? Wenn ersteres, dann kann man das ja abfangen.

          Eval kann nicht vorher wissen, dass es scheitern wird. Es wird also aufgerufen werden. Nur wird es nicht das erhoffte Ergebnis bringen. In deinem Fall ist das doch nur eine Variablenzuweisung. Bei einer solchen wird zuerst der zuzuweisende Ausdruck ausgwertet. Erst dann (und wenn das erfolgreich verlief) wird die Variable angelegt beziehungsweise deren Inhalt verändert, wenn sie schon vorher existierte.

          Ein Fehler kann aber auch schon vorher auftreten, wenn das Befüllen von str mittels erzeugtem Javascript-Code vorgenommen wird. Also

          var str = '{
            foo: "bar";
          }';

          In dem Fall wären Zeilenumbrüche im Code der Stringzuweisung. Das darf in Javascript nicht sein. Wenn allerdings der Inhalt in PHP vorbereitet wird und als Ajax-Response in str landet, dann ist dieser Fall nicht relevant. Bei einem eval() macht sich erst dann ein Problem bemerkbar, wenn aus dessen Sicht ungültige Syntax vorliegt. eval() bekommt ja nur den Inhalt des Strings zu sehen.

          var str = '{
            foo: "bar
          qux";
          }';

          Hier geht der String "bar qux" über zwei Zeilen und erzeugt einen Syntaxfehler.

          Lo!

          1. Moin allerseits,

            Dann solltest du, wie ich schon vorschlug, die Ausgabe der Fehlermeldungen unterdrücken. Sie haben auf einem Produktivsystem sowieso nichts in der normalen Ausgabe zu suchen. Die Besucher können und sollen mit diesen Informationen nichts anfangen. Es sollte sowieso nur Laufzeitfehler auftreten, denn syntaktische hat man üblicherweise durch umfangreichen Tests ausgeschlossen. Die Ausgabe von Laufzeitfehlern lässt sich komplett unterdrücken (display_errors=off) - unabhängig davon, kann und sollte man sie ja loggen.

            Ja, auf dem Produktivsystem. Während des Testens wäre es mir komfortabler, wenn es bei ungültiger Rückgabe einen Alert gibt mit dem Inhalt von str.

            Eval kann nicht vorher wissen, dass es scheitern wird. Es wird also aufgerufen werden. Nur wird es nicht das erhoffte Ergebnis bringen. In deinem Fall ist das doch nur eine Variablenzuweisung. Bei einer solchen wird zuerst der zuzuweisende Ausdruck ausgwertet. Erst dann (und wenn das erfolgreich verlief) wird die Variable angelegt beziehungsweise deren Inhalt verändert, wenn sie schon vorher existierte.

            In dem Fall wären Zeilenumbrüche im Code der Stringzuweisung. Das darf in Javascript nicht sein. Wenn allerdings der Inhalt in PHP vorbereitet wird und als Ajax-Response in str landet, dann ist dieser Fall nicht relevant. Bei einem eval() macht sich erst dann ein Problem bemerkbar, wenn aus dessen Sicht ungültige Syntax vorliegt. eval() bekommt ja nur den Inhalt des Strings zu sehen.

            var str = '{
              foo: "bar
            qux";
            }';

            Hier geht der String "bar qux" über zwei Zeilen und erzeugt einen Syntaxfehler.

            D.h., wenn ich in str keinen Zeilenumbruch habe, wird auch kein Syntaxfehler erzeugt? Kann ich denn vor eval() in str einfach alle Umbrüche entfernen und dann so den Syntaxfehler umgehen?

            Grüße, JN

            --
            ie:{ fl:( br:^ va:| ls:[ fo:| rl:? n4:? ss:| de:] js:| ch:? sh:( mo:| zu:)
            http://www.johny7.de
            1. Hi!

              D.h., wenn ich in str keinen Zeilenumbruch habe, wird auch kein Syntaxfehler erzeugt?

              Das ist ein unzulässiger Schluss, es gibt ja noch mehr Syntaxfehler als die Zeilenumbrüche.

              Kann ich denn vor eval() in str einfach alle Umbrüche entfernen und dann so den Syntaxfehler umgehen?

              Warum willst du Daten verfälschen anstatt sie ordnungsgemäß zu notieren? Siehe (mal wieder) den Kontextwechsel-Artikel, da gibt es in der Fortsetzung auch was zu Javascript. Allerdings nützt dir auch korrekte Syntax nichts, wenn du dir die Nutzdaten mit PHP-Fehlermeldungen ruinierst. Du hast zwei Baustellen:

              • PHP-Fehlermeldungen - Ursachen beseitigen, Meldungen aus der Ausgabe raushalten.
              • Javascript-Syntax - Der Erzeuger muss syntaktisch korrekt arbeiten.

              Lo!