jens65m: Fehlersammlung und ausgabe

hallo community,

Komm mal wieder nicht weiter. Und zwar handelt es sich um ein Skript, in welches ich mit Absicht Fehler eingebaut habe. Diese Fehler werden werden mit einem Fehlercode in einen Array ($error) geschrieben. Am Ende des Skripts wird nun eine Datei inkludiert, die die Errorcodes aus dem Array auswertet und die entsprechenden Fehlermeldungen ausgibt.

Wie kann ich die Fehlermeldungen jetzt aber ans Anfang der Seite schreiben anstatt ans Ende?

Muss ich die Ausgabe der Fehlermeldungen dann wieder in ein Array speichern und diesen weiter oben ausgeben oder geht das auch anders?

Lg

  1. Mahlzeit jens65m,

    Wie kann ich die Fehlermeldungen jetzt aber ans Anfang der Seite schreiben anstatt ans Ende?

    Beachte das EVA-Prinzip!

    Nachdem Du zu Anfang die [E]ingaben überprüft hast, findet die [V]erarbeitung der Daten statt. Währenddessen können Fehler auftreten. Diese Fehler kannst Du sammeln und am Ende der [V]erarbeitung aufbereiten.

    Die [A]usgabe an den Browser sollte erst anschließend stattfinden - zu diesem Zeitpunkt hast Du aber alle bei der [V]erarbeitung aufgetretenen Fehler ja schön aufbereitet vorliegen und kannst sie an beliebiger Stelle in die [A]usgabe mit einbauen.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
    1. hm ok -> problem:

      if(empty($var))  
      {  
          $err_codes[] = "01";  
      }  
        
      else  
      {  
          echo "hallo"  
      }  
        
      if(empty($var2))  
      {  
          $err_codes[] = "02";  
      }  
        
      else  
      {  
          echo "hallo"  
      }  
        
      foreach ($err_codes as $code)  
      echo $code;
      

      hier kann ich das so nicht nach oben bringen ?!
      lg

      1. Mahlzeit jens65m,

        hier kann ich das so nicht nach oben bringen ?!

        Nein. Definiere "nach oben bringen". Ein echo erzeugt eine Ausgabe an den Browser - sequenziell.

        Deswegen mein Hinweis zur Beachtung des EVA-Prinzips, den Du offensichtlich noch nicht ganz verstanden hast.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
        1. mal was ganz anderes,

          wenn die Fehler die ich hier meine auftreten. Dann wär es eigentlich sogar besser wenn gar nichts mehr vom Skript unternommen wird, sondern direkt auf eine Fehlerseite geleitet wird.
          Wie könnt ich denn dass machen.

          if(errors da sind)  
          {  
              //weiterleitung  
          }  
          
          

          nur mit

          Header("Location: http://www.xxx.de/xxx.php");  
          exit();
          

          wär die Weiterleitung ja sinnlos. Zumal das hier gar nicht funktioniert.

          lg

          1. Hi!

            wenn die Fehler die ich hier meine auftreten. Dann wär es eigentlich sogar besser wenn gar nichts mehr vom Skript unternommen wird, sondern direkt auf eine Fehlerseite geleitet wird.

            Weiterleitungen für solche Fälle sind nicht immer die bessere Lösung. Eher selten. Wenn es ein Fehler ist, der mit einem anderen Status als 200 an den Client gemeldet werden soll, ist eine Weiterleitung sogar komplett kontraproduktiv. Nach dem EVA-Prinzip braucht man ebenfalls nicht den Browser erst eine Ehrenrunde drehen lassen, bevor dessen Anwender die Fehlermeldung zu sehen bekommt. Einfach statt des eigentlichen Inhalts den Fehlertext zurücksenden.

            Lo!

  2. müsste wohl so ne art goto-Alternative sein.
    Ist goto eigentlich empfehlenswert? Mal davon abgesehen das 5.3.0 nicht meiner Version entspricht.

    1. Hi!

      müsste wohl so ne art goto-Alternative sein.

      Wo willst du denn hinspringen? Ein Sprungbefehl macht keine Ausgabe rückgängig. Dein Problem ist mit der Strukturierung nach EVA sehr einfach zu lösen.

      Ist goto eigentlich empfehlenswert? Mal davon abgesehen das 5.3.0 nicht meiner Version entspricht.

      Wenn man goto einsetzen möchte, sollte man das gut begründen können. Wildes Herumspringen führt in der Regel zu Unübersichtlichkeit. Hingegen kann ein gezielter Sprung aus einer verschachtelten Schleife im Gegensatz zu einer durch alle Schachtelungsebenen durchzuschleifenden Abbruchbedingung beispielsweise die Prägnanz und Übersichtlichkeit des Codes erhöhen.

      Lo!

      1. Hallo,

        Wenn man goto einsetzen möchte, sollte man das gut begründen können. Wildes Herumspringen führt in der Regel zu Unübersichtlichkeit.

        sehe ich genauso, ich habe seit Jahren keinen Fall mehr gehabt, wo ich in Versuchung gekommen wäre, ein "goto" zu verwenden, auch wenn ich einräume, dass es sinnvolle Einsatzfälle gibt.

        Hingegen kann ein gezielter Sprung aus einer verschachtelten Schleife im Gegensatz zu einer durch alle Schachtelungsebenen durchzuschleifenden Abbruchbedingung beispielsweise die Prägnanz und Übersichtlichkeit des Codes erhöhen.

        Das ist aber ein Fall, der meistens mit einem break[*] oder continue eleganter zu lösen und dann auch leichter nachzuvollziehen ist, oder sogar mit einem return an geeigneter Stelle, sofern man seinen Code schön in Funktionen oder Methoden strukturiert hat.

        Ciao,
         Martin

        [*] break ist nicht nur in einer switch-Struktur gut, sondern kann auch aus anderen Kontrollstrukturen (Schleifen) ausbrechen.

        --
        Eine Neandertaler-Sippe sitzt in ihrer kalten Höhle. Seufzt der Stammesälteste: "Hoffentlich erfindet bald jemand das Feuer!"
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Hi!

          Hingegen kann ein gezielter Sprung aus einer verschachtelten Schleife im Gegensatz zu einer durch alle Schachtelungsebenen durchzuschleifenden Abbruchbedingung beispielsweise die Prägnanz und Übersichtlichkeit des Codes erhöhen.
          Das ist aber ein Fall, der meistens mit einem break[*] oder continue eleganter zu lösen und dann auch leichter nachzuvollziehen ist, oder sogar mit einem return an geeigneter Stelle, sofern man seinen Code schön in Funktionen oder Methoden strukturiert hat.

          Jein. Wenn break/continue reicht, ist das ok. Mit angehängter Zahl kann man auch die angegebene Anzahl Ebenen durchbrechen. Da muss man dann aber beim Nachverfolgen mitzählen und auch alles anpassen, wenn doch mal eine Ebene hinzukommt oder wegfällt. Zudem gibt es wohl Konstruktionen, da ist das break nicht mehr eindeutig. Ich würde goto auch nur als letztes Mittel einsetzen, wenn mir keine besseren Vereinfachungen solcher Situationen einfallen.

          Lo!

          1. Moin!

            Lösung A und B (Verwendung von Templates) hast Du

            Lösung C:

            Schreib den Shit wann Du willst und formatiere ihn mit CSS so, dass er an der Dir genehmen Stelle auftaucht:

            if ('' != $strErrors) {  
                  echo '<div style="position:absolute;top:2em;left:2em;z-index:99;background-color:#fff;border: 5px solid red;">' . $strErrors . '</div>';  
            }
            

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

    2. Ist goto eigentlich empfehlenswert?

      Nun, in meiner Entwicklungsabteilung ist über die Codierungsrichtlinien (in diesem Fall für C ) die Verwendung von goto strikt verboten, und das ist nicht ungewöhnlich. Wer meint, seinen Code nur noch damit "übersichtlich" gestalten zu können, sollte eventuell nochmal die generelle Struktur überdenken.

      Ich glaube, Dein Denkfehler liegt hier darin, dass die Ausgaben in der html-Seite oben stehen sollen, obwohl sie in Deiner PHP-Seite weiter unten stehen. Das ist aber kein Problem, denn das ist ja nicht das gleiche. Du darfst halt - wie bereits beschrieben - alle Ausgaben für die html-Seite erst später beginnen, wenn alle Fehlerfälle abgetestet sind.

      Gruss
      Stefanie

      1. Hello,

        Nun, in meiner Entwicklungsabteilung ist über die Codierungsrichtlinien (in diesem Fall für C ) die Verwendung von goto strikt verboten, und das ist nicht ungewöhnlich. Wer meint, seinen Code nur noch damit "übersichtlich" gestalten zu können, sollte eventuell nochmal die generelle Struktur überdenken.

        Ich empfinde Exceptions und einfach in der Mitte von Funktionen eingebrachte "return" auch immer als verkappte "goto".

        Zu sauberer Strukturierter Programmierung nach Nassi/Sniderman passen weder diese Returns, noch Exceptions, noch der AUfruf von Interrupts, die dann nicht zurückkehren zur Aufrufstelle, usw.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. Moin!

    Wie kann ich die Fehlermeldungen jetzt aber ans Anfang der Seite schreiben anstatt ans Ende?

    Du speicherst alle Ausgaben und ersetzt den Body-tag durch himself und die Fehlerausgaben. Dazu beginnst Du mit ob_start("callback");, wobei callback eine rekursiv aufgerufene Funktion ist.

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

    <?php  
    ob_start("callback");  
      
    $GLOBALS['strErrorString']="<hr /></p>Hier stehen die Fehler.</p><hr />";  
      
    function callback($buffer) {  
      return (str_replace('<body>', '<body>'.$GLOBALS['strErrorString'],  $buffer));  
    }  
    # foo  
    # bar  
    ?>
    
    <html>  
    <body>  
    <p>A lot of HTML....</p>  
    </body>  
    </html>
    
    <?php  
    ob_end_flush();  
    ?>
    

    Ausgaben:

    <html>  
    <body><hr /></p>Hier stehen die Fehler.</p><hr />  
    <p>A lot of HTML....</p>  
    </body>  
    </html>  
    
    

    Wieso arbeitest Du nicht mit Templates? Dann hättest Du das Problem nicht.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix