Olaf Heinrich: MySQL Abfrage Select mit IF Teil

``Hallo zusammen,

Folgende Situation: Ich möchte in einer MySQL Abfrage einen quasi "variaben Teil" einbauen. Stellt Euch folgende Situation fvor:

Ein Benutzer wählt aus verschiedenen DropDownboxen feste Werte aus, nach denen sich die MySQL Abfrage aufbaut. Ungefähr so:

  
$sql = "SELECT kd_ID, kd_firma, kd_name, kd_strasse, kd_plz, kd_ort, kd_geraettyp, kd_geraetnummer, kd_service_intervall, kd_servicestatus1, kd_servicestatus2, status from $DB_TBLName where kd_firma='".$_POST["kd_firma"]."' AND kd_geraettyp LIKE '%CS%' AND kd_typ = 'Service' AND status = 'activated'  
OR  
kd_firma='".$_POST["kd_firma"]."' AND kd_geraettyp LIKE '%Coffea S%' AND kd_typ = 'Service' status='activated' ORDER by ".$_POST["export_oderby"]." ".$_POST["export_oderto"]."";  

Es geht speziell um den Teil "status='activated'...
Dieser Teil soll nur dann als Teil der MySQL Abfrage verwendet werden, wenn der Benutzer zuvor in einer Dropdownliste das AKTUELLE Jahr tatsächlich ausgewählt hat.
Nun könnte ich zuvor eine Abfrage mit PHP machen. So álla:
if($_POST["zeitraum"] == date("Y")){$sql = möglichkeit 1 mit status}else{$sql = möglichkeit zwei ohne status}

Will ich aber nicht, da ich schon 12 verschiedene Abfragen und select Anweisugnen habe. Wie kann ich diesen Teil also in die MySQL Abfrage selbst einbauen, so das dieser "status='activated'" nur dann mit einbezogen wird, wenn das ausgewählte Jahr der PHP Variable mit dem aktuellen Jahr übereinstimmt?

Gruß
Olli

  1. Hallo,

    was Du brauchst, ist ein Konzept, um die SQL-Abfrage aus sinnvoll gruppierten Elementen zusammenzusetzen. Dazu solltest Du nicht nur darüber nachdenken, welche Abfragen Du brauchst, sondern, worin sich diese unterscheiden.

    Bspw. musst Du, um variabel " AND status='activated'" hinzuzufügen, keine komplett neue Query formulieren.

    Gruß, LX

    --
    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: Unusual
    X-Please-Search-Archive-First: Absolutely Yes
  2. yo,

    grundsätzlich stört PHP code nur, wenn es um die sql abfrage geht, ist einfach mühsamer zu lesen und wir kennen damit auch nicht immer die variableninhalte.

    auf der anderen seite, würde ich das dbms nicht mit zusätzlicher beauftragen, wenn man das schon im vorfeld lösen kann. ich würde es im php code lösen. aber wenn du das vermeiden willst, ist CASE dein freund.

    Ilja

  3. hi,

    Nun könnte ich zuvor eine Abfrage mit PHP machen. So álla:
    if($_POST["zeitraum"] == date("Y")){$sql = möglichkeit 1 mit status}else{$sql = möglichkeit zwei ohne status}

    Will ich aber nicht, da ich schon 12 verschiedene Abfragen und select Anweisugnen habe.

    Du brauchst ja nicht 2 Statemants zu schreiben, sondern nur einer Variable einen Wert zuweisen:

    $Val = (isset($_POST["zeitraum"]) == date("Y")) ? "status='activated'" : '' ;

    $Val kannst du dann an gewünschter stelle in dein Statement einbauen.
    Eventuell kann man diese abfrage auch direkt ins Statement schreiben, müsstest du mal testen.

    Übrigens solltest du Werte aus dem $_POST-array _immer_ mit mysql_real_escape_string behandeln, selbst wenn du die Werte in einer Selectbox vorgibst.
    Auch diese Werte lassen sich vor dem absenden beliebig manipulieren.
    Wobei, wenn du Selectboxen hast, kannst du vorher noch vergleichen, ob das, was abgesendet wurde auch in den Selectboxen vorkommt.

    mfg

    --
    echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
    array(2) {
      ["SELFCODE"]=>
      string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
      ["Aight"]=>
      string(?) "I Have a Dream"
    }
    1. echo $begrüßung;

      Du brauchst ja nicht 2 Statemants zu schreiben, sondern nur einer Variable einen Wert zuweisen:
      $Val = (isset($_POST["zeitraum"]) == date("Y")) ? "status='activated'" : '' ;

      Das ergibt keinen Sinn beziehungsweise nicht das von dir vorgesehene Ergebnis. isset() liefert ein boolsches Ergebnis. Wenn du das mit dem Jahr vergleichst, kommt beim Jahr 0 ein anderes Ergebnis raus als an anderen Jahren (da kannst du von Glück reden, dass es das Jahr 0 nicht gibt) und an den restlichen Jahren ist das Ergebnis immer wahr. Das isset und der Jahresvergleich müssen zwei selbständige Vergleiche sein, deren Ergebnisse logisch verknüpft werden.

      $Val kannst du dann an gewünschter stelle in dein Statement einbauen.
      Eventuell kann man diese abfrage auch direkt ins Statement schreiben, müsstest du mal testen.

      Das wird schnell unübersichtlich, wenn man ein Statement umfangreich zusammenstückelt und das in einem Einzeiler notiert.

      Übrigens solltest du Werte aus dem $_POST-array _immer_ mit mysql_real_escape_string behandeln, selbst wenn du die Werte in einer Selectbox vorgibst.

      Das muss man mit jeglichen (String-)Werten machen, nicht nur mit denen aus dem $_POST-Array. Ausnahmen sind nur hart kodierte Strings, die keiner Beeinflussbarkeit unterliegen.

      Wobei, wenn du Selectboxen hast, kannst du vorher noch vergleichen, ob das, was abgesendet wurde auch in den Selectboxen vorkommt.

      Kann man machen, ist aber hier ein nicht unbedingt notwendiger Schritt, denn es geht nur um eine Abfrage. Beim Eintragen oder Ändern von Werten in eine(r) Datenbank ist eine Prüfung eher angebracht. Wenn jemand den einzufügenden Wert einer SELECT-Abfrage ändert, hat er sowieso kein Interesse am richtigen Ergebnis. Es stört dann auch nicht, wenn er ein falsches Ergebnis bekommt. Was anderes sind SQL-Injections, aber die kann man ja ausschließen. Ebenso wären Folgeschritte zu beachten, doch eigentlich ist es die Aufgabe des Folgeschritts, für eine Überprüfung der ihm übergebenen Werte zu sorgen. Es kann ja auch aus ganz anderen und unvorhergesehenen Gründen zu ungewünschten Werten kommen.

      echo "$verabschiedung $name";

      1. hi,

        danke für die korrektur.

        Das isset und der Jahresvergleich müssen zwei selbständige Vergleiche sein, deren Ergebnisse logisch verknüpft werden.

        Stimmt, wenn man es genau haben will, sollte man es auch genau prüfen. Mein Ansatz war nur ein denkanstoss für den OP.

        Das wird schnell unübersichtlich, wenn man ein Statement umfangreich zusammenstückelt und das in einem Einzeiler notiert.

        Wenn es ein sehr grosses Statement ist, sicher, aber wenn man nur ein oder zwei unterabfragen dieser art hat, finde ich, kann man damit ganz gut leben.
        Hier spreche ich aber ausschliesslich für mich, der sich erst seit knapp einem halben Jahr mit dieser Thematik beschäftigt.

        Das muss man mit jeglichen (String-)Werten machen, nicht nur mit denen aus dem $_POST-Array. Ausnahmen sind nur hart kodierte Strings, die keiner Beeinflussbarkeit unterliegen.

        Auch jegliche Variablen, die ich im Code beispielsweise selbst notiere?
        Beispielsweise:

        $Val = "O'Reilly";

          "SELECT  
                 name  
           FROM  
                 verlag  
           WHERE  
                 name = '" . $Val . "'  
          ";
        

        Müsste ich hier $Val auch escapen?
        Wenn ich mir dieses Beispiel so ansehe, gehe ich mal stark davon aus.

        Kann man machen, ist aber hier ein nicht unbedingt notwendiger Schritt, denn es geht nur um eine Abfrage.

        War auch nur ein Vorschlag am rande ;)

        mfg

        --
        echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
        array(2) {
          ["SELFCODE"]=>
          string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
          ["Aight"]=>
          string(?) "I Have a Dream"
        }