SQL Abfrage dynamisch aufbauen
krw
- php
Ich betreibe ein kleines Beautyportal, bei dem die Besucher über eine interne Suchmaschine deutschlandweit Studios suchen können.
Innerhalb einer Maske kann der Besucher mittels CheckBox verschiedene Bereiche (zb. Kosmetik, Nagel, Fußpflege, Haare, Accessoires) auswählen, sowie den gewünschten Ort in ein Feld eingegeben.
Ich habe nun folgende ( in PHP eingebettete ) SQL Abfrage, bei welcher die where Klausel teilweise dynamisch aufgebaut werden soll.
Wählt der Besucher zb. den Bereich Kosmetik, wird in der where Klausel der Variableninhalt $SelKosmetik verwendet usw.
Das Problem besteht nun im "OR". Nachdem eine beliebige Kombination der fünf Wahlmöglichkeiten (Bereiche, die der Besucher wählen kann)gegeben sein muss, kann ich das OR NICHT (wie im untenstehenden Beispiel geschehen) einfach jeweils anhängen.
Anders gesagt: Das untenstehende Beispiel funktioniert nur, wenn ich alle oder nur die letzte Möglichkeit auswähle. Ansonsten haben ich ein OR zuviel.
Gibt es da eine Lösung ?
$OrderFeld = "f.Firmenname";
$ProjektCount = 0;
if (isSet($kosmetik) && ($kosmetik == "X"))
{
$SelKosmetik = "fp.ProjektNr = 7 OR";
$ProjektCount++;
}
if (isSet($nail) && ($nail == "X"))
{
$SelNail = "fp.ProjektNr = 29 OR";
$ProjektCount++;
}
if (isSet($feet) && ($feet == "X"))
{
$SelFeet = "fp.ProjektNr = 90 OR";
$ProjektCount++;
}
if (isSet($hair) && ($hair == "X"))
{
$SelHair = "fp.ProjektNr = 38 OR";
$ProjektCount++;
}
if (isSet($accessoires) && ($accessoires == "X"))
{
$SelAccessoires = "fp.ProjektNr = 217";
$ProjektCount++;
}
$abfrage = sprintf ("%s %s %s %s %s %s %s %s %s %s %s %s %s",
"SELECT f.FNr, f.KdNr, f.Firmenname, f.Zusatz, f.Url, a.Strasse, a.PLZ, a.Ort",
"FROM FIRMA f",
"INNER JOIN FIRMA_PROJEKT fp ON f.FNr = fp.FNr",
"INNER JOIN PROJEKT p ON fp.ProjektNr = p.ProjektNr",
"INNER JOIN ADRESSE a ON f.Adresse = a.AdrIndex",
"WHERE (a.Ort LIKE '%$Ort%' OR a.Plz LIKE '$Ort%') AND",
$SelKosmetik,
$SelNail,
$Selfeet,
$SelHair,
$SelAccessoires,
"GROUP BY f.FNr HAVING count( f.FNr ) >$ProjektCount-1",
"order by $OrderFeld");
$res = mysql_query($abfrage);
$num1=mysql_num_rows($res);
Servus,
Gibt es da eine Lösung ?
Speichere die einzelnen Bedingungen in einem Array und verwende implode um sie mit OR zu verketten.
Also z.B.
[code=php]
$where = array();
if (isset($kosmetik) && ($kosmetik == 'X')) {
$where['kosmetik'] = 'fp.ProjektNr = 7';
}
// etc.
$query = ''
// ...
.'WHERE '
. '(a.Ort LIKE '%$Ort%' OR a.Plz LIKE '$Ort%') AND '
. implode(' OR ', $where)
.'GROUP BY '
// ...
;
[/code]
Gruss
Patrick
yo,
interessant, nachdem du weiter unten uns nicht mal ein feedback gegeben hast, ob die vorgeschlagenen lösungen funktionieren (wobei ich sehen kann, dass du den vorgeschlagenen OR benutzt), suchst in einem neuen thread nuter einen neuen namen wieder hilfe ?
setzt die WHERE klaussel dynamisch zusammen und wenn alles dranne hängt, entferne mit php string funktionen das letzte auftretende OR.
noch einen hinweis, nur bei mysql gibt es bei deiner select-abfrage kenie fehlermeldung, da du nicht nach allen spalten gruppierst, die du auch ausgibst.
Ijla
Hallo Ilja,
habe Deinen Vorschlag implementiert.
Funktioniert gut ! Hätte man selbst draufkommen können.
Was die Abfrage angeht, war mir die Sache einfach irgendwann zu verfahren. Zum einen habe ich - zugegebenermaßen - mein Problem von Anfang an zu unsauber beschrieben, zum anderen "spielen" da ( ich meine Foren allgemein - oft Leute mit, die nach dem Motto "einfach mal was sagen, muss ja nichts mit der Sache zu tun haben" primär der allgemein Raum greifenden Tendenz "Quantität statt Qualität" Rechnung tragen, dem pragmatisch orientiertem Zeitgenossen jedoch nur wenig zur Freude gereichen.
Mit der jetztigen Lösung bin ich sehr zufrieden, da selbige auch mit meinen ca 100.000 Datensätzen halbwegs performant läuft.
Nochmals vielen dank für Deine Hilfe!
Kai
yo,
zum anderen "spielen" da ( ich meine Foren allgemein - oft Leute mit, die nach dem Motto "einfach mal was sagen, muss ja nichts mit der Sache zu tun haben" primär der allgemein Raum greifenden Tendenz "Quantität statt Qualität" Rechnung tragen, dem pragmatisch orientiertem Zeitgenossen jedoch nur wenig zur Freude gereichen.
ich will dir da nicht widersprechen, dass es antworten gibt, die nicht gerade zur lösung des problems beitragen. und gerade wenn man die antworten dringend braucht, können eniem dabei einge ganz schön auf die nerven gehen. insofern kann ich dich verstehen. auf der anderen seite hilft es, wenn man trotz dieser tatsache versucht zu differenzieren, um nicht die noch zu vergraulen, die einem weiterhelfen könnnen, wenn auch nicht gleich immer der erste ansatz gelingt.
oder auf gut deutsch gesagt, man muss sich seine semmeln warm halten...
Ilja
oder auf gut deutsch gesagt, man muss sich seine semmeln warm halten...
Heisst das nicht "Buletten" in Berlin?
Sogar wir haben jetzt verstanden um was es ging:
"Anders gesagt: Das untenstehende Beispiel funktioniert nur, wenn ich alle oder nur die letzte Möglichkeit auswähle. Ansonsten haben ich ein OR zuviel."
Das Problem war also der unter Umständen entstehende Sysntaxfehler durch ein OR wenn keine Bedingung mehr folgt. LOL
(War also doch ganz gut einen neuen Beitragsstrang zu eröffnen, da der alte vermutkst war. ;)
Hallo,
oder auf gut deutsch gesagt, man muss sich seine semmeln warm halten...
Heisst das nicht "Buletten" in Berlin?
Nein, in Buletten gehören zwar Semmeln rein, der Berliner nennt sie Schrippen (oder berlinerisch korrekt Schrüppen).
Gruß aus Berlin,
Markus