Frank: richtigen Query erstellen <-- bitte ist wichtig

Hallo zusammen,

hab ein sehr kniffiliges Problem.

Hab ein formular, mit 4 eingabe feldern.
(name, vorname, ort, land)

so, jetzt muss ich irgendwie mein Query erstellen, das er alles findet, so wie ich es angebe.

ok, wenn ich jetzt z.b. nur das Land angebe, soll er alle User in der DB finden und ausgeben, die in Deutschland leben.
Aber wenn ich dazu noch vielleicht den Namen angebe, soll er alle mit dem Namen finden die in Deutschland wohnen.

Und das halt auch mit den anderen Feldern, so das man kombinieren kann, was man angeben will bzw. kann.

Kennt da jemand eine Lösung.
Hab schon Kollegen gefragt, aber der meinte ich sollte das mit if-Abfragen abfragen und dann die entsprechenden querys senden.

bitte helft mir.
mfg
Frank

  1. Kennt da jemand eine Lösung.
    Hab schon Kollegen gefragt, aber der meinte ich sollte das mit if-Abfragen abfragen und dann die entsprechenden querys senden.

    da hat er ja auch recht. wo liegt das problem?

    Gruß,

    Julian

    1. Kennt da jemand eine Lösung.
      Hab schon Kollegen gefragt, aber der meinte ich sollte das mit if-Abfragen abfragen und dann die entsprechenden querys senden.

      da hat er ja auch recht. wo liegt das problem?

      das problem liegt darin, das es eine menge tipp arbeit ist, und unsauber wirkt.
      und wenn ich dann mal ein feld dazu nehme, ist das wieder eine riesen arbeit das einzubinden.

      da muss es doch irgendein trick geben.

      1. a hat er ja auch recht. wo liegt das problem?

        das problem liegt darin, das es eine menge tipp arbeit ist, und unsauber wirkt.
        und wenn ich dann mal ein feld dazu nehme, ist das wieder eine riesen arbeit das einzubinden.

        da muss es doch irgendein trick geben.

        mysql kann keine if-abfragen. drum: eher nein.

        machst du das in PHP?

        1. mysql kann keine if-abfragen. drum: eher nein.

          machst du das in PHP?

          ja mach ich

          1. mysql kann keine if-abfragen. drum: eher nein.

            machst du das in PHP?

            dann mußt du doch die kriterien sowieso an das query übergeben. oder wie regelst du das?

            paste mal kurz deinen query-string wie er in php ausschaut.

            1. paste mal kurz deinen query-string wie er in php ausschaut.

              so sieht er aus:
              $sql = "Select * from users where nachname = '".$_POST['name']."' AND land = '".$_POST['land']."'";

              so bekomme ich aber nur die raus, wenn ich name und land gleichzeitig angeben.
              will aber eins davon auch freilassen können, damit man nur nach einen kriterium suchen kann, und nicht nach 2 , 3 oder allen 4.

              1. paste mal kurz deinen query-string wie er in php ausschaut.

                so sieht er aus:
                $sql = "Select * from users where nachname = '".$_POST['name']."' AND land = '".$_POST['land']."'";

                so bekomme ich aber nur die raus, wenn ich name und land gleichzeitig angeben.
                will aber eins davon auch freilassen können, damit man nur nach einen kriterium suchen kann, und nicht nach 2 , 3 oder allen 4.

                dann mach doch $sql = "SELECT... WHERE";
                $sql .= $_POST["name"] ? 'nachname = "'.$_POST["name"].'" AND ' : "";
                und so weiter
                (das jetzt nur mal ganz vereinfacht dargestellt.

                noch geschickter ist es natürlich, wenn du alle datenbank-feldnamen genau so wie die formfelder benennst und das in nen array packst.
                also <input type="text" name="feld[nachname]">
                etc..

                dann kannst du
                im php-teil ein
                foreach ($_POST["feld"] as $feldname => $feldinhalt) {
                   $sql .= $feldname." = "'.$feldinhalt.'" AND ';
                }

                oder ähnliches machen.

                dann ist dein php-teil unabhängig von formular und datenbank...
                aber vielleicht ist das auch zuviel des guten :)

                1. Hello,

                  na, ganz so einfach sollte man sich das aber nicht machen, wenn einem seine Datenbank lieb ist.

                  Vorgehensweise:
                  Erstmal entscheiden, ob alle Felder in Frage kommen sollen, oder nur die indizierten. Ich würde für zweiteres plädieren, da man ja ohnehin
                  irgendwann festlegen muss, welche Felder in Frage kommen

                  1. Man beschafft sich mit "show columns from $table" die Spaltennamen
                     Typen, und welche Spalten einen Index haben. Da steht dann in
                     KEY (PRI,MUL,UNI). Man muss das ein bisschen umstapeln. Die
                     funktion get_info() müsste hier im Archiv zu finden sein (von mir)

                  2. Man baut sich ein Filterformular auf

                  <input type="text" name="filter[$spaltenname]>

                  das kann man in einer foreach() Schleife generieren lassen für alle
                     Felder des $info-Records, die einen KEY-Eintrag haben.

                  3. Wenn der POST jetzt die Daten im Script abliefert, muss man nur
                     für alle $_POST["filter"] schauen, ob die Felder existieren durch
                     Abgleich mit get_info(). Wenn eins dabei ist, dass im $info-Record
                     nicht existiert, muss das Script wegen Fake cancelled werden.
                     Sonst baut man sich nun die Where-Bedingung auf:

                  $where = "";
                     $filter = strip($_POST["filter"]);   ## Funktion strip() siehe Archiv

                  foreach($filter as $key => $value)
                     {
                       if ((strlen(trim($value))>0) and in_array($key,$info))
                       {
                         ## hier kann man noch einen Typ-Abgleich machen!
                         ## if (checktype($key,&$val,$info) ## habe ich noch nicht fertig
                         $where .= " $key = '".mysql_escape_string($value)."',";
                       }
                     }

                  if (strlen($where)>0)
                     {
                       $where = " where ".substr($where,0,-1);
                     }

                  $sql = "Select $fields from $table $where";

                  Und Schuss.

                  So müsste es klappen
                  Verbesserungsvorschläge erwünscht.

                  Liebe Grüße aus http://www.braunschweig.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  1. Hello,

                    wie Ihr das von mir inzwischen ja kennt, hatte die erste Idee noch ganz schön viele Macken, aber hier ist ein Scriptschnipsel, der funktioniert:

                    <?php

                    $table ="TEST";

                    $filter["name"] = "Hansm%";
                       $filter["vorname"] = "Hans";
                       $filter["strasse"] = "Rosenhügel";

                    $info["name"]["type"] = "string";
                       $info["name"]["key"] = "MUL";

                    $info["vorname"]["type"] = "string";
                       $info["vorname"]["key"] = "MUL";

                    $info["strasse"]["type"] = "string";
                       $info["strasse"]["key"] = "MUL";

                    foreach($filter as $key => $value)
                       {
                         $value=trim($value);
                         if ((strlen($value)>0) and (strlen($info[$key]["key"])==3))
                         {
                           ## hier sollte man noch einen Typ-Abgleich machen!
                           ## if (checktype($key,&$val,$info) ## habe ich noch nicht fertig
                           ## Like dürfte z.B bei numerischen Feldern nicht erlaubt sein
                           ## Und das Datum könnte man richtigstellen, falls möglich
                           ## Und Buchstaben in numerischen Typen prüfen
                           ## ...

                    $eq=(strpos($value,"%")!==false)?"like":"=";
                           $where .= " $key $eq '".mysql_escape_string($value)."' and";
                         }
                       }

                    if (strlen($where)>0)
                       {
                         $where = " where ".substr($where,0,-4);
                       }

                    $sql = "Select $fields from $table $where";

                    echo htmlentities($sql);
                    ?>

                    Liebe Grüße aus http://www.braunschweig.de

                    Tom

                    --
                    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                    1. Hello,

                      so, die 2. Version steht jetzt auf dem Server unter
                      http://bitworks.de/~selfHTML/where.php.txt

                      Nur die Database-Connection ($con) anstelle der Includes einsezzen, Tabellenname ($table) und Felder ($fields) angeben und los gehts.

                      ToDo (1):
                      Welche Vergleich gibt es und wie kann man die am besten dem Formular beibringen? Select-Option?

                      da wären:
                      <  kleiner

                      größer

                      =  gleich
                      <> ungleich
                      %  like

                      Hab ich was vergessen?

                      ToDo (2):
                      Optik mit CSS-Klassen einsetzen
                      Liste mit Limit ausgeben
                      Buttons in die Liste für Detailanzeige
                      Checkboxen in die Liste für Listenlöschen
                      Sortierung nach Index einstellen (idx1, idx2)

                      Was könnte man denn sonst noch brauchen?

                      Liebe Grüße aus http://www.braunschweig.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        2. Hallo,

          mysql kann keine if-abfragen. drum: eher nein.

          http://www.mysql.com/doc/en/Control_flow_functions.html

          gruß,
          Severin

          --
          Realität ist das, was nicht verschwindet, wenn man aufhört, daran zu glauben.
          --Philip K. Dick