Paul: Vergleichsoperatoren

Moin,
habe Probleme mit Vergleichsoperatoren in PHP.

Über ein Textfeld (z.B. 2) und eine Selectbox (z.B. >=) kann man in meiner Anwendung eine Datenbank abfragen (z.B. 1 >= 2). Als Ergebnis soll true oder false raus kommen.

Habe es mit folgenden Dingen versucht:

$s = $db.$operator.$eingabe;

$s = $bd.$operator.$eingabe;  
eval("\$s = \"$s\";");  

$db = eval($db);
$operator = eval($operator);
$eingabe = eval($eingabe);

$s = $bd.$operator.$eingabe;  
eval("\$s = \"$s\";");  

$db = settype($bd, "integer");
$eingabe = settype($eingabe, "integer");
$s = $$db.$operator.$eingabe;
eval("$s = "$s";");

$s = ($$db eq $eingabe);  
  
  
Nix hat geklappt.  
Vielleicht sollte man auch erst mal ertfragen was das für typen sind. Nur wie?  
  
Paul
  1. Hi,

    Habe es mit folgenden Dingen versucht:

    das erste davon bietet sich für einen Versuch zwar an, kann aber niemals auch nur im Ansatz funktionieren. Alle anderen Versuche solltest Du schon allein deswegen komplett aus Deinen Gedanken verbannen, weil eval() eingesetzt wird.

    Die "richtige" Methodik wäre ein Factory-Pattern, mittels welchem eine Berechnungsklasse für den jeweiligen Operator ausgewählt wird, die mit den Eingabewerten gefüttert wird und eine individuelle Methode zur Berechnung besitzt. In Deinem Fall reicht aber vermutlich ein undynamisches if-elsif-Konstrukt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Danke Euch!

  2. Paul,

    Über ein Textfeld (z.B. 2) und eine Selectbox (z.B. >=) kann man in meiner Anwendung eine Datenbank abfragen (z.B. 1 >= 2). Als Ergebnis soll true oder false raus kommen.

    eval() erwartet gültigen PHP-Code als Parameter, wenn du den Wert eines dynamisch erzeugten Vergleichs haben willst, musst du diesen mit return zurück geben. Beispiel:

    <?php  
    $ein = "3";  
    $db = "2";  
    $op = ">=";  
    $s = eval('return '.$ein.$op.$db.';');  
    var_dump($s);  
    ?>
    

    WARNUNG: Der an eval() übergebene String wird als PHP-Code auf dem Server ausgeführt, es ist daher unbedingt notwendig, dass du überprüfst, ob wirklich nur Vergleichsoperatoren vom Benutzer eingeben worden sind. Ich würde deswegen auf eval() ganz verzichten und stattdessen eine if- oder switch-Anweisung verwenden:

      
    if ($op = '>') {  
        $s = $ein > $db;  
    } elseif ($op = '<') {  
        $s = $ein < $db;  
    } elseif ($op = '>=') {  
        $s = $ein >= $db;  
    } elseif ($op = '<=') {  
        $s = $ein <= $db;  
    } elseif ($op = '==') {  
        $s = $ein == $db;  
    } elseif ($op = '!=') {  
        $s = $ein != $db;  
    } else {  
        // Eingabefehler  
    }
    

    Das lässt sich natürlich prima in eine Funktion kapseln (z.B.: compare ($val1, $val2, $op);)

    Schöne Grüße,

    Johannes