raico: schnellere Varaiante für if elseif else ?

Mahlzeit...

ich hab einen if elseif else Code, bei dem aber die if Abfragen inzwischen verdammt lang sind...
a) wirds dadurch mit der Zeit echt unübersichtlich...
b) ist es nicht gerade mal eben einfach für meine Kollegen, die sich überhaupt nicht mit php auskennen, diese Liste an "Fehlern" mal eben zu erweitern.

Der code sieht in etwa so aus:

  
  
if (ereg("WARNUNG",$buffer){  
  
/* mach $buffer orange */  
  
} elseif (eregi("SCSI",$buffer) || eregi("is not recognized",$buffer) || eregi("null or not set",$buffer) || eregi("abnormally",$buffer) || eregi("Bad file number",$buffer) || eregi("Segmentation",$buffer) || eregi("problem",$buffer) || eregi("core",$buffer) || eregi("errno",$buffer) || eregi("error",$buffer) || eregi("failed",$buffer) || eregi("abort",$buffer) || eregi("unsuccessful",$buffer) || eregi("err_sql",$buffer) || eregi("err_backupop",$buffer) || eregi("su: Unknown id:",$buffer) || eregi("Attempting a kill on remote save",$buffer) || eregi("Access is denied",$buffer) || eregi("Unknown user name",$buffer) || ereg("Killed",$buffer) || eregi("set false or does not exist",$buffer) || eregi("no output",$buffer) || eregi("Session terminated, killing shell",$buffer) || eregi("\[NOT FOUND\]",$buffer) || eregi("inconsistent during backup",$buffer) || eregi("unable",$buffer) || eregi("used only once",$buffer) || eregi("c:\\\boot.ini operable program or batch file.",$buffer) || eregi("Command not found",$buffer) || eregi("utility session is already in use",$buffer)){  
  
/* mach $buffer rot */  
  
}  
  
echo $buffer;  
  
  
  

Wie man nun sehen kann... gibts da ne Menge zu überprüfender Fehler, die in der Variable $buffer stecken könnten.
Denn eigentlich wird dabei eine Textdatei Zeile für Zeile abgeparst die auch schon mal mehrere Megabyte groß sein kann.

Meine Idee war nun, rein der Übersicht, die Fehler einfach in eine extra Datei zu schreiben,
z.B.

  
$fehlermeldung[]="SCSI";  
$fehlermeldung[]="is not recognized";  
$fehlermeldung[]="null or not set";  
$fehlermeldung[]="abnormally";  
$fehlermeldung[]="Bad file number";  
$fehlermeldung[]="Segmentation";  
$fehlermeldung[]="problem";  
$fehlermeldung[]="core";  
$fehlermeldung[]="errno";  
$fehlermeldung[]="error";  
$fehlermeldung[]="failed";  
$fehlermeldung[]="abort";  
$fehlermeldung[]="unsuccessful";  
$fehlermeldung[]="err_sql";  
$fehlermeldung[]="err_backupop";  
$fehlermeldung[]="su: Unknown id:";  
$fehlermeldung[]="Attempting a kill on remote save";  
$fehlermeldung[]="Access is denied";  
$fehlermeldung[]="Unknown user name";  
$fehlermeldung[]="Killed";  
$fehlermeldung[]="set false or does not exist";  
$fehlermeldung[]="no output";  
$fehlermeldung[]="Session terminated, killing shell";  
$fehlermeldung[]="\[NOT FOUND\]";  
$fehlermeldung[]="inconsistent during backup";  
$fehlermeldung[]="unable";  
$fehlermeldung[]="used only once";  
$fehlermeldung[]="c:\\\boot.ini operable program or batch file.";  
$fehlermeldung[]="Command not found";  
$fehlermeldung[]="utility session is already in use";  

sie stattdessen im Hauptcode zu includen und jetzt einfach nach einlesen einer Zeile in einer for next schleife den Buffer durch diesen array zu überprüfen um dann bei einem "Treffer" einen "Fehlerwert" zu setzen...
Dann bräcuht ich in der eigentlichen if elseif else Anweisung nur die elseif fehlerwert = 1 abfrage zu machen...

nur... ist das wirklich die schnellere Lösung, bzw. die Sauberere?
Hätte jemand eine "bessere" Lösung zur Hand?

  1. Mahlzeit raico,

    } elseif (eregi("SCSI",$buffer) || eregi("is not recognized",$buffer) || eregi("null or not set",$buffer) || eregi("abnormally",$buffer) || eregi("Bad file number",$buffer) || eregi("Segmentation",$buffer) || eregi("problem",$buffer) || eregi("core",$buffer) || eregi("errno",$buffer) || eregi("error",$buffer) || eregi("failed",$buffer) || eregi("abort",$buffer) || eregi("unsuccessful",$buffer) || eregi("err_sql",$buffer) || eregi("err_backupop",$buffer) || eregi("su: Unknown id:",$buffer) || eregi("Attempting a kill on remote save",$buffer) || eregi("Access is denied",$buffer) || eregi("Unknown user name",$buffer) || ereg("Killed",$buffer) || eregi("set false or does not exist",$buffer) || eregi("no output",$buffer) || eregi("Session terminated, killing shell",$buffer) || eregi("[NOT FOUND]",$buffer) || eregi("inconsistent during backup",$buffer) || eregi("unable",$buffer) || eregi("used only once",$buffer) || eregi("c:\\boot.ini operable program or batch file.",$buffer) || eregi("Command not found",$buffer) || eregi("utility session is already in use",$buffer)){

    Wer diesen Code verbrochen hat, gehört IMHO an seinen testikulären Hornfäden aufgehängt ...

    Meine Idee war nun, rein der Übersicht, die Fehler einfach in eine extra Datei zu schreiben,

    Das würde in der Tat für mehr Übersichtlichkeit sorgen und die Pflege der zu berücksichtigenden Fehlermeldungen wäre erheblich einfacher.

    nur... ist das wirklich die schnellere Lösung, bzw. die Sauberere?

    Also was willst Du: schnell oder sauber?

    MfG,
    EKKi

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

      Also was willst Du: schnell oder sauber?

      Reden wir hier ueber Programmierung, oder den korrekten Umgang mit Sanitaereinrichtungen?

      off:PP

      --
      "You know that place between sleep and awake, the place where you can still remember dreaming?" (Tinkerbell)
      1. Erstmal n Danke an alle dir hier Tipps gegeben haben und ein müdes Lächeln die anderen...

        Die variante mit der Ini Datei hat mir zwar am besten gefallen... Schon aus dem Grund weil sie mit Sicherheit auch am einfachsten zu pflegen ist... Erst Recht für Leute die noch weniger Ahnung von PhP haben als ich...
        Nur leider hats nicht funktioniert, da im array immer nur der erste Eintrag stand... aber nicht alle 30...
        Egal... gab ja noch andere Vorschläge...

        Die Variante mit der in_array hat aber auch nicht funktioniert... Woran das liegt kann ich nur ahnen, hatte jetzt aber keine große Lust und Zeit das wirklich herauszufinden...
        Fakt ist... in buffer steht z.B. "Dies ist ein Error"
        dann hat die in_array Funktion diese Zeile NICHT gefunden, obwohl das Wort "Error" im array steht...
        Egal... Auch hier wieder... keine Zeit und auch keine Lust mich damit zu befassen.
        die CASE Anweisung wollte ich aus dem Grund nicht benutzen, da (wie schon oben geschrieben) die Fehlerliste so einfach wie möglich auch von Arbeitskollegen gefüllt werden muss, die von php NOCH weniger Ahnung haben als ich ;)

        Die Variante mit der for next Schleife hat auf Anhieb das gemacht, was ich wollte...
        Jetzt stehen die Fehler einfach in einer extra Datei untereinander, die dann beim Starten der Webseite einmal abgeparst wird, die Daten in ein array eingelesen werden und dann beim Einlesen eines "logfiles einer Datensicherung" wird dann jede einzelne Zeile in dieser for next Schleife überprüft, ob sie für den "Anwender" im Webinterface rot gefärbt dargestellt werden soll oder nicht.

        Danke also nochmal allen für Tips... ich hab wieder n büschn was dazu gelernt und hoffe nur, dass ich eines Tages nicht ganz so arrogante Antworten gebe, wie so mancher hier....

        1. Hi,

          Die variante mit der Ini Datei hat mir zwar am besten gefallen... Schon aus dem Grund weil sie mit Sicherheit auch am einfachsten zu pflegen ist... Erst Recht für Leute die noch weniger Ahnung von PhP haben als ich...
          Nur leider hats nicht funktioniert, da im array immer nur der erste Eintrag stand... aber nicht alle 30...

          dann hattest Du etwas falsch gemacht. Ich hätte da einfach nochmal nachgefragt...

          Fakt ist... in buffer steht z.B. "Dies ist ein Error"
          dann hat die in_array Funktion diese Zeile NICHT gefunden, obwohl das Wort "Error" im array steht...

          in_array macht ja auch einen exakten Vergleich; "Dies ist ein Error" != "Error".

          freundliche Grüße
          Ingo

        2. Liebe(r) raico,

          Woran das liegt kann ich nur ahnen, hatte jetzt aber keine große Lust und Zeit das wirklich herauszufinden...
          [...] Auch hier wieder... keine Zeit und auch keine Lust mich damit zu befassen.

          ach, dann lass es halt bleiben.

          und hoffe nur, dass ich eines Tages nicht ganz so arrogante Antworten gebe, wie so mancher hier....

          Hast Du einen Besen zur Hand?

          Liebe Grüße,

          Felix Riesterer.

          --
          ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  2. Lieber raico,

    mein Vorschlag:

    Schreib alle diese Fehlermeldungen in ein Array und prüfe mit in_array, ob der Fehler dort vorkommt.

    Anstatt

    if (ereg("WARNUNG",$buffer){

    /* mach $buffer orange */

    } elseif (eregi("SCSI",$buffer) || eregi("is not recognized",$buffer) || eregi("null or not set",$buffer) [...]

    schreibst Du  
      
    ~~~php
    if (in_array($buffer, $GLOBALS['fehlermeldungen'])) {  
        /* $buffer orange machen */  
    } else {  
        /* mach $buffer rot */  
    }
    

    Meine Idee war nun, rein der Übersicht, die Fehler einfach in eine extra Datei zu schreiben

    Das kannst Du auch machen. Dann solltest Du aber besser ein superglobales Array benutzen, damit diese Fehlermeldungen immer überall verfügbar sind.

    z.B.

    $fehlermeldung[]="SCSI";
    $fehlermeldung[]="is not recognized";

      
    [...]  
      
    Warum nicht so?  
      
    ~~~php
    $GLOBALS['fehlermeldungen'] = array(  
        "SCSI",  
        "is not recognized",  
        "null or not set",  
        "abnormally",  
        "Bad file number",  
    ...  
    );
    

    Ich weiß jetzt natürlich nicht, was genau in $buffer steht...

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
  3. ich hab einen if elseif else Code, bei dem aber die if Abfragen inzwischen verdammt lang sind...

    switch

  4. Hallo,

    Meine Idee war nun, rein der Übersicht, die Fehler einfach in eine extra Datei zu schreiben,
    z.B.
    $fehlermeldung[]="SCSI";
    $fehlermeldung[]="is not recognized";
    $fehlermeldung[]="null or not set";

    warum nicht im INI-Format

    [Warnungen]
    WARNUNG

    [Fehler]
    SCSI
    is not recognized
    null or not set

    ...

    in Verbindung mit parse_ini_file(). Ich fände das einerseits "benutzerfreundlicher" und andererseits sauberer.

    Vielleicht schreibst Du noch ein Frontend für das Bearbeiten der Datei.

    Freundliche Grüße

    Vinzenz

  5. Hi,

    ich hab einen if elseif else Code, bei dem aber die if Abfragen inzwischen verdammt lang sind...

    langsam sind nicht die Abfragen, sondern die unsinnige Verwendung von ereg(i).
    Um die simple Existenz von Teilstrings zu ermitteln, kannst Du str(i)pos nutzen - sinnvoll natürlich wie Du schon selbst überlegt hast in einer Schleife mit einem Array.

    freundliche Grüße
    Ingo