eval ist evil?

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

  • eval ist evil?

    hallo zusammen,

    ich will mir die datenverwaltung per formular mit funktionen vereinfachen (php, nicht javascript), die die wiederkehrenden aufgaben erledigen, z.b.

    - < tr>< td>,
    - beschreibende texte anzeigen,
    - unterschiedliche datentypen berücksichtigen (formularseitig: text, textarea, checkbox, radio etc, mysql-seitig: text- / numerische / datumfelder etc)
    - vorbelegte inhalte für eingabefelder bereitstellen bzw. (wenn gesendet) anzeigen,
    - erfassungserleichterung: bb-code in textarea
    - offensichtliche erfassungsfehler korrigieren
    - feldlängenbegrenzung
    - zahlen und daten formatieren etc.

    den funktionen übergebe ich parameter wie beschreibende texte, feldname, feldinhalt, grössenlimit ...

    die funktionen liefern als return einen array, dessen inalte ich z.b für insert und update der tabelle verwende, ein weiteres arrayfeld soll eine fehlermeldung liefern.

    nach einigen mühen klappt es bis hier so, wie ich es mir vorgestellt habe.

    jetzt mein problem:

    ich will zusätzliche prüfungen einbauen, die sich auf ein datenfeld (z.b. eintragung MUSS) oder auf das zusammenspiel von datenfeldern (z.b. DATUM_BIS >= DATUM_VON) beziehen. die prüfbedingungen will ich als weiteren parameter (als php-code) übergeben und in der funktion mit eval() abarbeiten lassen.

    gesucht und gefunden habe ich mehrere / viele beiträge in den foren und im manual, probiert habe ich etliche schreibweisen, geschafft habe ich nichts, weil ich das prinzip von eval nicht verstanden habe. ich bitte nur um eine eval-beispielschreibweise für diese eigentlich simple aufgabe. sinngemäß will ich die folgende bedingung
    1. als parameter übergeben,
    2. in der funktion abarbeiten lassen und
    3. das pruefergebnis im return-array ausgeben:

    PHP-Code:
    $pruefergebnis = empty($feld) ? "Eingabe erforderlich" ""
    gruss oskar40

    kapieren - nicht kopieren

  • #2
    Re: eval ist evil?

    Original geschrieben von oskar40
    bitte nur um eine eval-beispielschreibweise für diese eigentlich simple aufgabe.
    ich denke nihct, dass eval() hier sinnvoll ist.

    wenn du schon ein array zurück gibst, hänge diese info doch irgendwo in das array einfach ein.

    hier mal ein ansatz ....
    PHP-Code:
    // dies in der funktion
    $arr = array();
    $arr[] = array('feldname' => 'feldvalue',
                   
    'iserror'  => empty($feld) ? true false);
    $arr[] = array('feldname1' => 'feldvalue1',
                   
    'iserror'  => empty($feld1) ? true false);

    return 
    $arr;

    // --------------

    // ausserhalb der funktion kannst du das array prüfen.

    $ausfkt funktionsaufruf($parameter);
    for (
    $i=0;$i<count($ausfkt);++$i)
    {
        if (
    $ausfkt[$i]['iserror'])
            echo 
    'dieses feld ist erforderlich';
        echo 
    $ausfkt[$i]['feldname'];

    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      @ abraxax

      danke erstmal,

      aber die lösung ist mir nicht flexibel genug.

      bei deinem ansatz lege ich die prüfung in die funktion, immer genau diese prüfung. es kann aber sein, das ich bei einem anderen feld oder einer ganz anderen tabelle ganz andere bedingungen prüfen will. z.b. bestimmte kombinationen von checkboxen, abhängigkeit von numerischen werten oder daten ...

      mit dem eval-ansatz hätte ich situationsabhängig alle freiheiten, mit der fest eingebauten bedingung bin ich an die hart codierte funktion gebunden.

      geht eval nicht?
      gibt es evtl einen ganz anderen ansatz für flexible bedingungen?

      danke fürs mitdenken
      gruss oskar40

      kapieren - nicht kopieren

      Kommentar


      • #4
        Re: eval ist evil?

        Original geschrieben von oskar40
        die prüfbedingungen will ich als weiteren parameter (als php-code) übergeben und in der funktion mit eval() abarbeiten lassen.
        halte ich für keine gute idee ... was ist, wenn ich böse und dir in dein form
        bösen code eintrage, den du dann per eval verarbeitest?

        ich habs bei mir so gelöst, dass zu prüfende felder einen anhang bekommen:
        normalesfeld vs. pruefefeld_F01
        .... F01 steht für eine prüfung auf ausgefüllt oder nicht ... F02 prüft auf
        strlen ... F09 auf regex ... usw. ... lässt sich beliebig erweitern.

        die bedingungen dazu übergebe ich per array an eine class, die dann die
        post-daten untersucht und das ergebnis zurückwirft ... vielleicht hilft dir
        das weiter.
        Kissolino.com

        Kommentar


        • #5
          Original geschrieben von oskar40
          [...] bei deinem ansatz lege ich die prüfung in die funktion, [...]
          genau. alles was in eine fkt oder class passt, immer rein damit.

          eine prüfung ausserhalb erhöht nämlich nciht gerade den lesefluss...
          INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


          Kommentar


          • #6
            eure vorschläge kann ich für meine situation noch nicht umsetzen. vielleicht habe ich meine absicht nicht deutlich genug gemacht und wir denken aneinander vorbei.

            es geht nicht um ein offenes forum, sondern um die anmeldung meiner kunden, die nur nach registrierung ihre eigenen infos auf meiner site ins netz stellen, mit login, sessions, mehrseitigen formularen. die kunden tragen ihre texte, termine, beträge, klassifizierungen in mehrere tabellen meiner db ein, keine codes. diese qualitativ unterschiedlichen inhalte sollen logisch zueinander passen.

            die codes lege nur ich fest. sie dienen mir dazu, die vollständigkeit und die plausibilität der kundendaten zu prüfen und den eintragenden nach der eingabe feedback zu geben und korrekturen zu ermöglichen. prüfungen sind z.b.: passen mehrere datumangaben zusammen? sind klassifizierungen plausibel, die die kunden eingetragen haben? etc, es geht also um mehr als MUSS/KANN-felder. ich kenne noch nicht alle einsatz-situationen und deren prüfbedingungen (und kann sie daher noch nicht in die funktionen einbauen). ich habe die funktionen so allgemein konzipiert, dass ich sie auch in anderen situationen nutzen kann.

            @ wurzel: deine befürchtungen (böser code) treffen bei dieser aufgabenstellung nicht zu. die eintragenden geben keinen code ein, ihre inhalte müssen nur den bedingungen meines codes entsprechen. beispiele: mein code für textfeld_1 kann ganz anders sein als für textfeld_2. checkbox_1 muss zu radiobutton_7 passen, betrag_3 muss mit datum_von und datum_bis passen. diesen code will ich formulieren, nicht der besucher.

            mit klassen kenne ich mich überhaupt noch nicht aus, das lernen würde mich jetzt zu sehr aufhalten.

            @ abraxax: ja, die funktion soll die prüfung durchführen, ich möchte der funktion nur variabel die kriterien als parameter vorgeben und vom prüfergebnis (im return-array der funktion) das speichern oder eine fehlermeldung abhängig machen. dann passt es z.b auch mit dem lesefluss.

            vielleicht sind meine erwartungen zu hoch?
            ist eval das falsche werkzeug?
            ist eval zu "exotisch"?
            gruss oskar40

            kapieren - nicht kopieren

            Kommentar


            • #7
              ist eval das falsche werkzeug?
              ist eval zu "exotisch"?
              eval() ist grundsätzlich evil ... wer eval() verwendet, kommt mit seinem code nicht wirklich richtig klar.

              man kann alles ohne eval() machen. allerdings gibt es auch die 0.2% ausnahmen, die wir jetzt nicht berücksichtigen.

              Wurzelchen hat ne schöne class geschrieben, die alles mögliche abprüft und ein bereinigtes array der daten zurückgibt. hier wird auch geprüft, ob ein text eine bestimmte länge hat, usw. und das alles nur mit einer class. wenn ich mich nicht irre, war's mal seine erste. oder? *zuwurzelschaut*

              vielleicht kann er dir noch einmal ein paar anstöße geben. ich habe die class nicht mehr wirklich im kopf....
              INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


              Kommentar


              • #8
                eval() ist grundsätzlich evil ... wer eval() verwendet, kommt mit seinem code nicht wirklich richtig klar.
                das ist mir zu pauschal und berücksichtigt meinen bedarf nicht. ich würde gern verstehen, warum eval evil ist, bisher habe ich nur unverständliche lösungen bzgl der syntax gefunden oder ähnliche "verurteilungen".

                mit meinem code in der funktion komme ich klar, alle bisherigen anforderungen werden erfüllt (längenprüfung etc). mit dem code, der die funktion aufruft (incl. parameter) komme ich auch klar, ebenso mit dem code, der die funtionsergebnisse auswertet.

                nochmal ein beispiel mit datum-feldern: DATUM_BIS muss ausgefüllt sein und nach DATUM_VON liegen. wenn es nur um diese prüfung ginge, könnte ich sie mit php in die funktion legen, und als parameter mitgeben, ob die prüfung ausgeführt werden soll oder nicht. aber es gibt auch andere datumfelder, die anderen kriterien folgen sollen. diese kriterien will ich situationsabhängig festlegen und in der funktion prüfen.

                was soll an diesem vorgehen falsch sein? in euren bisherigen vorschlägen erkenne ich nicht die flexibilität, sie machen einen allgemeingültigen eindruck, auch die andeutungen zur klasse.

                hat denn keiner einen konstruktiven vorschlag?

                die "starren" vorschläge habe ich verstanden und kann sie umsetzen, auch ohne klasse. ich meine aber es sollte mehr möglich sein.

                bitte nochmal denken
                gruss oskar40

                kapieren - nicht kopieren

                Kommentar


                • #9
                  Original geschrieben von oskar40
                  nochmal ein beispiel mit datum-feldern: DATUM_BIS muss ausgefüllt sein und nach DATUM_VON liegen. wenn es nur um diese prüfung ginge, könnte ich sie mit php in die funktion legen, und als parameter mitgeben, ob die prüfung ausgeführt werden soll oder nicht. aber es gibt auch andere datumfelder, die anderen kriterien folgen sollen. diese kriterien will ich situationsabhängig festlegen und in der funktion prüfen.
                  dann gebe der funktion noch einen weiteren parameter mit, der die art der überprüfung bestimmt, und werte diesen in der funktion aus (mit switch() z.b.), und führe je nachdem eine andere prüfung durch.

                  ein eval() halte ich hier nach wie vor für überflüssig.
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    zu eval:
                    ich sehe es so, dass eval
                    - quasi ein parser im parser ist
                    - in dem moment unnötig wird, in dem ich meine struktur ordentlich aufbaue
                    - die übergabe/einbindung von php-code aus/in einem formular/template ein potentielles sicherheitsrisiko darstellt ... unabhängig vom einsatzort (geschützter bereich, offener bereich, intranet, o.ä.)

                    zum thema class:
                    das ist in der tat ziemlich simpel ... eine klasse ist ja kaum mehr als eine zusammengefasste, vernünftig strukturierte funktionsbibliothek, die dir im handling jedoch zu "normalen" funktionen eine menge vorteile bringt (zB global verwendbare variablen innerhalb der class) ... wenn du eh schon mit
                    funktionen arbeitest, ist der umstieg sehr einfach, wenn erstma "this" begriffen hat.

                    zum formchecker:
                    die meisten prüfaufgaben sind trivial:
                    - eingabe ja/nein
                    - mindestanzahl zeichen
                    - email/url validierung
                    - ...

                    komplizierter sind abhängigkeiten (hast du ja auch schon erkannt). hier gilt es, regeln zu definieren. am besten überlegst du dir erstmal, was an eventualitäten zu prüfen ist.

                    beispiel startdatum vs enddatum:
                    feldnamen: sdatum_1_1, edatum_1_2
                    - die erste 1 ruft eine bestimmte funktion auf
                    --- diese funktion prüft alle felder gegeneinander, die als ersten "parameter" eine _1 aufweisen
                    - der zweite wert _1, _2, _x bestimmt die reihenfolge, also
                    -- 1 muss kleiner sein als 2, 2 kleiner als 3 ....

                    genauso lassen sich abhängigkeiten von textfelder überprüfen
                    feldname: text1_4711, text2_4711
                    die funktion, die an 4711 gekoppelt ist, prüft zB ob eins der 4711-felder ausgefüllt ist oder eine mindestlänge hat oder ...

                    das system lässt sich beliebig erweitern, bis es kollabiert es macht imho keinen sinn, ALLE eventualitäten zu berücksichtigen. je nach aufgabenstellung ist es uU sinniger, komplexe prüfungen separat durchzuführen.

                    btw: ich verschieb jetzt mal nach brainstorming
                    Kissolino.com

                    Kommentar


                    • #11
                      nachschlag

                      damit meine frage deutlicher wird, habe ich meinen code gekürzt und "gepseudet", vielleicht können wir uns damit besser verständigen:

                      PHP-Code:
                      function feld_date($beschreib,$feldname,$inhalt,$submit,$pruef)
                      /* die parameter bedeuten:
                      $beschreib: der text den der user als feldbeschreibung bekommt 
                      $feldname: so heisst das feld in der db-tabelle
                      $inhalt: inhalt aus der db, wenn datensatz existiert, sonst leer 
                      $submit: 0=formular zur eingabe bereit / 1=anzeige nach dem submit
                      $pruef: dieser code soll mit eval (?) ausgeführt werden
                      */
                      {
                        
                      // linke spalte der tabelle: $beschreib anzeigen
                        // rechte spalte der tabelle: inhalte eingeben bzw anzeigen:
                        
                      if ($submit==0)
                        {
                           
                      // < input-feld definieren, ggf vorbelegung mit db-inhalt für update
                        

                        else 
                        {
                          
                      // eingegebenen inhalt anzeigen
                          // daten für return-array aufbereiten (für update bzw insert)
                          // return-array ($erg[0], $erg[1], $erg[2]) füllen mit daten für update bzw insert

                          ########### hier beginnt mein problem:
                          // HIER WILL ICH EINE PRÜFUNG DES FELDES EINFÜGEN, BEISPIEL:
                          // $pruef = $DATUM_BIS <= $DATUM_VON ? "Ende muss nach dem Start sein" : "";
                          // $erg[3] = $pruef;
                          ########### bis hier geht mein problem

                        
                      }
                        return(
                      $erg);
                      }


                      // das formular ist mit action=PHP_SELF und method=post definiert

                      // sql-string für insert bzw update anlegen, fehlerarray für feedback anlegen

                      // funktion für das ERSTE datumfeld aufrufen und auswerten:
                      $pruef="hier_soll_stehen_dass_DATUM_VON_eingetragen_sein_muss";
                      $atmp=feld_date("Start-Datum","DATUM_VON",$DATUM_VON,$submit,$pruef); 
                      sql-string für insert update für $DATUM_VON ergänzen ($atmp[0bis $atmp[2])
                      if (
                      $atmp[3] != ""$fehlerarray[] = $atmp[3];
                       
                      // funktion für das ZWEITE datumfeld aufrufen und auswerten:
                      $pruef="hier_soll_stehen_dass_DATUM_BIS_nach_DATUM_VON_liegen_muss";
                      $atmp=feld_date("Ende-Datum","DATUM_BIS",$DATUM_BIS,$submit,$pruef); 
                      sql-string für insert update für $DATUM_BIS ergänzen ($atmp[0bis $atmp[2])
                      if (
                      $atmp[3] != ""$fehlerarray[] = $atmp[3];

                      // nachdem alle felder abgearbeitet sind: 
                      entweder fehler-feedback an den user oder 
                      insert bzw update an datenbank 
                      (abhängig von count($fehlerarray)) 
                      gruss oskar40

                      kapieren - nicht kopieren

                      Kommentar


                      • #12
                        jetzt war ich zulange offline und habe eure posts nicht mehr gesehen.

                        @ wahsaga: habe ich verstanden, ist ein ähnlicher ansatz wie bereits beschrieben. danke.

                        @wurzel: deine befürchtung bestätigt meine überlegungen:
                        das system lässt sich beliebig erweitern, bis es kollabiert es macht imho keinen sinn, ALLE eventualitäten zu berücksichtigen. je nach aufgabenstellung ist es uU sinniger, komplexe prüfungen separat durchzuführen.
                        schade, ich dachte eval wäre eine relativ elegante lösung, ich kann nur nicht damit umgehen. wenn eval riskanter ist, werde ich wohl den konventionellen weg nehmen. und vieleicht kann ich mich ja doch mal zum klassen-lernen entschliessen. (es gibt noch soviel anderes mit priorität)

                        danke euch allen, ich werde trotzdem beobachten, ob sich ein eval-verteidiger findet
                        gruss oskar40

                        kapieren - nicht kopieren

                        Kommentar

                        Lädt...
                        X