Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Abfangen unzulässiger Parameter

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Abfangen unzulässiger Parameter

    Hallo Community,

    Bei meiner Parameterverarbeitung mittels getopt() habe ein Problem.

    Wenn ich in meinem String einen unzulässigen Parameter einfüge bricht getopt() die Parameter auswertung an dieser Stelle ab und verarbeitet nur die vorherigen Parameter.

    aktueller Programmcode:
    PHP-Code:
    #!/usr/bin/php
    <?PHP
        
        define
    ('OK'0);
        
    define('WARNING'1);
        
    define('CRITICAL'2);
        
    define('UNKNOWN'3);

    $shortopts  "";
    $shortopts .= "H:";  // hostname
    $shortopts .= "u:";  // database_user
    $shortopts .= "p:";  // database_passwort
    $shortopts .= "d:";  // database_name
    $shortopts .= "q:";  // query
    $shortopts .= "r:";  // regex
    $shortopts .= "w:";  // warningvalue
    $shortopts .= "c:";  // criticalvalue
    $shortopts .= "s:";  // string switch

    $arrayOptions getopt($shortopts);

    if (
    count($arrayOptions) == 0)
    {
        echo
    "USAGE\n";
        echo
    "******\n";
        echo
    "\n";
        echo
    "-H = hostname  \n";
        echo
    "-u = database User  \n";
        echo
    "-p = database password  \n";
        echo
    "-d = database  \n";
        echo
    "-q = SQL-query  \n";
        echo
    "-r = regular expression \n";
        echo
    "-w = warning value \n";
        echo
    "-c = critical value \n";
        echo
    "-s = string switch [0 = only numbers in regex allowed; 1 = regex can also contain a string] \n";
        
        exit(
    UNKNOWN);
    }
    elseif (
    count($arrayOptions) < 9)
    {
        
    $arrayelements count($arrayOptions);
        echo 
    "$arrayelements /n";
        echo 
    "Some Parameters missing!";
        exit(
    UNKNOWN);
    }
        try
        {
            
    $db = new PDO("mysql:host=$arrayOptions[H];dbname=$arrayOptions[d];charset=utf8""$arrayOptions[u]""$arrayOptions[p]");
            
    $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
        }
        catch (
    PDOException $p)
        {
            echo
    " No connection established.";
        }
            
        
    $query_result $db->query($arrayOptions['q']);

        
    $result $query_result->fetch(PDO::FETCH_ASSOC);

            
        
    $db null;
            
        
    $result_regexpreg_grep("/$arrayOptions[r]/",$result);  

        foreach(
    $result_regex as $key=>$value
        {

            if(
    $arrayOptions['s'] == 0)
            
            {
            if(
    $value >= $arrayOptions['c'])
                {
                echo
    "CRITICAL: <$value>\n ";
                exit(
    CRITICAL);
                }
            elseif(
    $value >= $arrayOptions['w'])
                {
                echo
    "WARNING: <$value>\n ";
                exit(
    WARNING);
                }
            else
                {
                echo
    "OK: <$value>\n ";
                exit(
    OK);
                }
            }
            if(
    $arrayOptions['s'] == 1)
            {
                if(
    strcmp ($value$arrayOptions['c']) !=0)
                {
                echo
    "CRITICAL: <$value>\n ";
                exit(
    CRITICAL);
                }
                elseif(
    strcmp ($value$arrayOptions['w']) !=0)
                {
                echo
    "WARNING: <$value>\n ";
                exit(
    WARNING);
                }
                else
                {
                echo
    "OK: <$value>\n ";
                exit(
    OK);
                }
            }
            else
            {
            echo
    "Parameter -s only 0|1 allowed.";   
            }
        }
    ?>
    korrekte Eingabe wäre:
    Code:
    ./test.php -H 127.0.0.1 -u test -p test -d test -q "select * from testdb" -r [0-9] -w 10 -c 5 -s 0
    Bei falschen Parametern wie z.B.
    Code:
    ./test.php -H 127.0.0.1 -u test -p test -d test -q "select * from testdb" -r [0-9] -k 7 -w 10 -c 5 -s 0
    Wird die Meldung
    Code:
    Some Parameters missing!
    ausgegeben und die Variable $arrayelements enthält lediglich 6 Elemente.

    Alle Parameter nach -k werden ignoriert.

    Wie kann ich bei falsche Parameter abfangen um eine Fehlerbehandlung durchzuführen. (z.B. Message an User: "Parameter -k nicht zulässig")?

    Bin auf die Funktion
    PHP-Code:
    array_keys 
    gestoßen, allerdings weiß ich nicht wie ich damit mein Array nur auf zulässige Keys prüfen kann.

    Hab überlegt ob man über die Negierung der Funktion
    PHP-Code:
    array_keys 
    mittels foreach-Abfrage alle Keys prüft und wenn ein nicht zulässiger Parameter auftaucht dies an den User meldet.

    Vielen Dank im vorraus für die Hilfe.


  • #2
    Dokumentiertes Verhalten von getopt.
    Note:
    The parsing of options will end at the first non-option found, anything that follows is discarded.
    Da bleibt dir wohl nur noch $argv
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Danke für den Hinweis.

      Kommentar


      • #4
        lad dir doch Symfony Console herunter

        http://symfony.com/doc/current/compo...roduction.html

        erstell dir ein kommando und definiere die Argumente

        hast dann sogar eine hilfe mit dabei usw..
        apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

        Kommentar


        • #5
          Für ein Skript wie obiges Frameworkkomponenten einzubinden halte ich für etwas Kopflastig.
          Ein Array aus argv zu erzeugen welches so aufgebaut ist wie es getopt liefert ist schnell gemacht und dann gibt es noch genug Funktionen/Klassen im Netz (z.B. getopt-php) welche ähnlich wie getopt arbeiten.
          PHP-Klassen auf github

          Kommentar


          • #6
            naja ich find halt die moeglichkeit nett mit php some.php --help und kriegst dann die hilfe und verfugbaren kommandos, kannst definieren welche eingabe Optional, welche Required ist usw usw und farben kann man auch einbauen
            apt-get install npm -> npm install -g bower -> bower install <package> YOLO https://www.paypal.me/BlackScorp | Mein Youtube PHP Kanal: https://www.youtube.com/c/VitalijMik

            Kommentar

            Lädt...
            X