dynamische abfrage?

Brauni

Erfahrenes Mitglied
servus

folgendes problem:
ich hab mehrere kombifelder. Dort stehen verschiedene kriterien drinne wonach ich ein produkt suchen kann.
Nun wenn ich z.b. 4 kombifelder habe habe ich min. 16 möglichkeiten wie ich die kombifelder verknüpfen kann und ich muss auch min. 16 sql anweisungen schreiben wo ich zuvor überprüfe in welchen kombinationsfelder habe ich kriterien ausgewählt oder nicht und danach richtet sich dann die sql anweisung. --> sehr aufwendig!
Gibt es da nicht eine leichtete lösung?

thx
brauni
 
ein wenig mehr info währe gut gewesen :-)

klar kann mann sql abfragen dynamisch erstellen .. du kannst ja in den abfragen auch variablen einsetzen ...

z.b mysql_query("select * from tab where name='$name' ....");

Die genaue lösung hängt auch von den eingabefeldern und den gewünschten abfrage ab.
 
Ok nehmen wir an 4 Dropdown listen
mit den namen combi1 - combi4


ungetesteter code:

Code:
foreach($_POST as $k => $v)
{
  if(!$k)
    $sql = "select from bla where ".$field[$k]." = '$v'";
   if(($k)&&($k<(count($_POST)-1))
    $sql .=  " and $fied[$k] = '$v'";
   if($k==(count($_POST))
    $sql .= " and $field[$k] = '$v' order by $order;
}

Fiele mir spontan ein.
 
ich hab z.b 4 kombifelder
art
besatz
länge
rubrik

hier habe ich mehr als 16 möglichkeiten diese felder zu kombinieren. wenn ich alle produkte sehen will fülle ich nichts aus und klicke auf den button.
wenn ich alle produkte haben will, wo der besatz gold ist, werden alle produkte angezeigt wo der besatz gold ist.
mit meiner methode müsste ich zuvor überprüfen in welchen kombifeldern habe ich etwas ausgewählt (if selektion) und danach richte ich dann die sql abfrage.
diese methode wäre sehr langwierig zu programmieren!

@HolyFly
könntest du mir villeicht das coding erklären?
so ganz verstehe ich das coding leider nicht.

thx
brauni
 
Zuletzt bearbeitet:
Code:
Art:<select name='art'>
<option value='%'>Alles
<option value='bla'>bla
<option value='hi'>hi
.....
</select>
dann
PHP:
$erg = mysql_query("select * from tabelle where art='$art' and besatz='$besatz' ...

so in der richtung würde ich es machen..
 
klar:

Du hast ein array mit den namen der Spalten in der Datenbank die jeweils die werte behalten die du über das combifeld als filter anwendest
also in deinem fall

$fields[0] = " art ";
$fields[1] = " besatz ";
...

Danach gehst du alle per Formular geposteten Werte durch

foreach($_POST as $k => $v)

Wenn der Key ($k) 0 ist
dann beginnt das Query

$sql = "select * from tabelle where ".$field[0]." = '$v'"

also kommt da raus:
select * from tabelle where art = '[Wert aus dem 1. CombiFeld'

if(($k)&&($k<(count($_POST)-1))
Heisst Wenn der key nicht 0 und der key kleiner als arraygroesse der geposteten variablen -1 ist. Dann heisst das die where bedingung nicht am ende steht sondern in der mitte.
Das ist daher wichtig weil es nicht mehr where Spalte = Wert sondern and Spalte = wert heisst
$sql .= " and $fied[$k] = '$v'";

Zu guterletzt testest du noch ob das gepostete der letzte wert ist.
if($k==(count($_POST))
wo mir eben nen fehler auffällt sollte heissen
if($k==(count($_POST)-1))
Da count bei 1 anfängt zu zählen aber das array bei 0 anfängt.
Wenn dies der fall ist kannst du die order regel mit einbringen da es das letzte element ist.
$sql .= " and $field[$k] = '$v' order by $order;

Wobei mann das mit Order auch hätte anders regeln können.

Zum schluss hast du einen dynamischen query aller

select * from tabelle where art ='wert' and besatz ='wert' and laenge = 'wert' and rubrik = 'wert'

Wird z.b laenge nicht übergeben so lautet das query
select * from tabelle where art ='wert' and besatz ='wert' and rubrik = 'wert'

Sprich es passt sich dessen an was du an Werten übergibst und ist demnach soweit dynamisch das du es vergrössern kannst indem du einfach eine Combibox mit ins formular einbaust und die zugehörige DB-Spalte mit in das Fied array übernimmst
 
@holyfly

jo aber die variable wird auf jeden fall übertragen und bei select feldern ist auch immer ein wert gegeben..
daher werden immer 4 werte übergeben ...

ps: bei textfeldern wird auch die var übertragen nur leer ...
 
ok danke!!

eine kleine frage hätte ich noch wegen einer like anweisung:
$query = "SELECT * FROM cat WHERE text Like '*' & '$text' & '*'";

eigentlihc müsste er doch im feld text nach dem inhalt der variable $text suchen. in access funzt diese anweisung ohne probleme nur wieso nicht in php??

thx
brauni
 
$query = "SELECT * FROM cat WHERE text Like '*' & '$text' & '*'";

mysql mag keine sterne

wenn du ein inhalt suchst in der der inhalt der var text drin ist musst du bei mysql mit % arbeiten

$query = "SELECT * FROM cat WHERE text Like '%$text%'";

so gehts in mysql..
 
Zurück