richtigen Query erstellen <-- bitte ist wichtig
Frank
- datenbank
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
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
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.
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?
mysql kann keine if-abfragen. drum: eher nein.
machst du das in PHP?
ja mach ich
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.
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.
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 :)
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
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
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
Hallo,
mysql kann keine if-abfragen. drum: eher nein.
http://www.mysql.com/doc/en/Control_flow_functions.html
gruß,
Severin