Ankündigung

Einklappen
Keine Ankündigung bisher.

Logischer Ausdruck aus DB überprüfen

Einklappen

Neue Werbung 2019

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

  • Logischer Ausdruck aus DB überprüfen

    Hallo,
    Folgende Ausgangslage: In einem DB-Feld speichere ich gewisse Bedingungen/Ausdrücke. Beispiel:
    $ausdruck = "$foo > 1";

    Jetzt möchte ich im Code diesen Ausdruck überprüfen, natürlich mit eingesetzten Werten für die Variabeln.

    if ($ausdruck) {
    usw...
    So gibt es ja immer true aus, da es den String ansich übrprüft und nicht den Ausdruck.

    Hat jemand eine Idee?
    c!w

  • #2
    das wird nur mit eval() gehen, die performance ist dabei aber nicht so der Knüller.

    Kommentar


    • #3
      na ja, man sollte sih folgendes merken:

      PHP-Code:
      eval() -> $evil 
      die funktion würde ich wegen dadurch entstehender sicherheitslücken meinerseits über alles vermeiden.

      Nils aka XraYSoLo

      Kommentar


      • #4
        Hallo,
        in diesem Format solltest du Bedingungen auch nicht in der DB speichern.

        Du könntest
        PHP-Code:
        <?php
        $foo 
        2;
        $ausdruck "$foo > 1"// "2 > 1"
        eval("\$condition = ($ausdruck)");
        if (
        $condition) {
          
        // ..
        ?>
        (ungetestet)

        Kommentar


        • #5
          Zitat von XraYSoLo
          na ja, man sollte sih folgendes merken:

          PHP-Code:
          eval() -> $evil 
          die funktion würde ich wegen dadurch entstehender sicherheitslücken meinerseits über alles vermeiden.

          Nils aka XraYSoLo
          Seh ich nicht anders. Ich halte es auch für besser das ganze Konstrukt umzubauen, weil es vermutlich auch keinesfalls zu einem gut lesbaren Code verhilft. Aber wenn man sowas trotz aller Kritik durchzieht, dann eben nur auf diesem Weg.

          Kommentar


          • #6
            Zitat von Zergling
            Hallo,
            in diesem Format solltest du Bedingungen auch nicht in der DB speichern.

            Du könntest
            PHP-Code:
            <?php
            $foo 
            2;
            $ausdruck "$foo > 1"// "2 > 1"
            eval("\$condition = ($ausdruck)");
            if (
            $condition) {
              
            // ..
            ?>
            (ungetestet)
            Danke, hat geklappt.
            Ich bin auch nicht glücklich, die Ausdrücke so in die Datenbank zu speichern. Geht aber in dem Fall nicht anders..

            Danke,
            c!w

            Kommentar


            • #7
              Zitat von c!w
              Geht aber in dem Fall nicht anders..
              Sagt wer? Es gibt eigentlich immer ein weg.

              Und bei dem Konstrukt rollen sich mir die Fußnägel auf.

              Kommentar


              • #8
                Zitat von CC84
                Zitat von c!w
                Geht aber in dem Fall nicht anders..
                Sagt wer? Es gibt eigentlich immer ein weg.
                Hehe, habe mit der Antwort fast gerechnet.
                Ok ich erkläre es mal.
                Ich habe gewisse Anmeldefenster (DB-Eintrag mit Start-und Endzeit). Jetzt muss ich gewisse Benutzer in diesen Anmeldefenstern zulassen. Dies geschieht über verschiedene Attribute, die dem Benutzer zugeordnet sind. Diese unterscheiden sich aber pro Anmeldefenster.
                Sprich, es werden nicht immer die gleichen Attribute ausgewertet, sondern je nach Anmeldefenster immer verschiedene.
                Dabei kann es noch sein, dass Bedinungen aneinander geknüpft werden. Der Operator kann dabei auch verschieden sein, also einmal > 2, in einem anderen Anmeldefenster < 2.

                Hast du eine Idee, wie man dass in einer DB abbilden kann?
                c!w

                Kommentar


                • #9
                  Indem du nur die Werte in der DB speicherst und die Logik über PHP erledigst. Alles andere is Mist.
                  mfg louis

                  Kommentar


                  • #10
                    Zitat von louis
                    Indem du nur die Werte in der DB speicherst und die Logik über PHP erledigst. Alles andere is Mist.
                    Ich kann aber die Logik so nicht direkt in PHP speichern. Wie denn?
                    Diese Anmeldefenster werden von einem Benutzer angelegt. Dabei muss er eben diese Bedingungen definieren können.

                    Kommentar


                    • #11
                      Zitat von c!w
                      Diese Anmeldefenster werden von einem Benutzer angelegt. Dabei muss er eben diese Bedingungen definieren können.
                      Genau das solltest du m al ein bisschen genauer erklären. Was sind denn diese ominösen Anmedlefenster? Und was muss der Benutzer dann definieren?
                      mfg louis

                      Kommentar


                      • #12
                        Mach mal ein konkretes Beispiel...

                        Kommentar


                        • #13
                          Ok, mache ich.

                          Benutzer A konfiguriert dieses Tool. Dabei definiert er Anmeldefenster, in denen Benutzer zugreifen können.
                          Attribut XYZ sind dabei Eigenschaften der Benutzer.

                          Anmeldefenster 1
                          Attribut X > 2
                          Attribut Y = true
                          Attribut Z < 6

                          Anmeldefenster 2
                          Attribut X < 1

                          Anmeldefenster 3
                          Attribut Y <= 2
                          Attribut Z = 2

                          Erfüllen die Attribute des Benutzers diese Bedinungen, darf er zugreifen, sonst nicht.

                          Wie würdet ihr sowas realisieren?

                          Kommentar


                          • #14
                            Eine Tabelle enthält die Anmeldefenster (wahrscheinlich so wie du es schon hast), eine andere die Bedingungen...

                            2. Tabelle:

                            anmeldefenster_id | Attribut | Vergleichsoperator | Wert

                            1 | Attribut X | > | 2
                            1 | Attribut Y | = | true

                            Dann fragst du für das entsprechende Anmeldefenster die Tabelle ab und überprüfst für Jede Zeile ob die Bedingung dem entspricht oder nicht. Ob die entsprechenden Werte verglichen werden müssen oder z.B. größer/kleiner sein sollen könntest du z.B. mit switch ermitteln.

                            Kommentar


                            • #15
                              mal davon abgesehen, dass du in 2 Wochen die Augen verdrehst, wenn du nochmal was an deinem Code machen sollst, weil du nur noch Bahnhof verstehst.

                              Zum anderen: Arrays heisst das Code wort

                              Wenn du alle Eigenschaften der Benutzer in ein Array schreibst, kannst du anschliessend bequem drauf zu greifen.

                              $benutzerEigenschaften[$benutzerid]['eigenschaftA'] = Wert;

                              dann musste nur speichern welche eigenschaft und deren Wert und schon ist gut, am besten in 3 Spalten Eigenschaft, Vergleichsoperator, Wert

                              und schon ist das ganze einigermassen sauber gelöst.

                              Kommentar

                              Lädt...
                              X