Lange IF-Schleife :-(
chr!s
- php
0 rakkaus0 Sönke Tesch0 rakkaus0 Sönke Tesch0 rakkaus
0 lulu0 Sönke Tesch
Guten Tag
Ich habe ein Veranstaltungskalender programmiert. Mittels Pulldownmenues (<select>) können Suchkriterien eingegeben werden wonach sich die MYSQL-Abfrage (SELECT) richtet. Insgesamt stehen drei Menues zur Verfügung. 1. Datum, 2. Veranstaltungstyp, 3. Ort. Wird nichts ausgewählt werden alle Daten angezeigt. Nun gibt es da so einige Kombinationsmöglichkeiten wie z.B. nur Datum ausgewählt, Datum und Ort ausgewählt, Datum, Veranstaltungstyp und Ort ausgewählt etc. In einer langen IF-Schleife habe ich alle Fälle erfasst die auftreten können (hoffe es zumindest). Irgendwie scheint mir diese Lösung aber etwas umfangreich. Gäbe es nicht eine einfachere (intelligentere) Variante für die Datenbankabfrage ohne dass das Programm einen so lange Schleife durchlaufen muss?
Hier der relevante Code:
// Datenbankabfrage
if (empty($veranstaltungstyp)) {
if (empty($datum)) {
if (empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (!empty($veranstaltungstyp)) {
if (empty($datum)) {
if (empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (empty($veranstaltungstyp)) {
if (!empty($datum)) {
if (empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (empty($veranstaltungstyp)) {
if (empty($datum)) {
if (!empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (!empty($veranstaltungstyp)) {
if (!empty($datum)) {
if (empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (!empty($veranstaltungstyp)) {
if (empty($datum)) {
if (!empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (empty($veranstaltungstyp)) {
if (!empty($datum)) {
if (!empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
if (!empty($veranstaltungstyp)) {
if (!empty($datum)) {
if (!empty($loc)) {
$query = "select ... from ... where ... order by ..."
}
}
}
warum schachtest sie nicht in einander???
es ist doch ein einfacher Baum immer nur mit 2 Möglichkeiten, dann wird es schon viel kürzer...
abc,abC aBc,aBC Abc,AbC ABc,ABC
// Datenbankabfrage
if ((empty($veranstaltungstyp))&&(empty($datum)) && (empty($loc)))
{select...}
if ((empty($veranstaltungstyp))&&(empty($datum)) && !(empty($loc)))
{select...}
if ((empty($veranstaltungstyp))&&!(empty($datum)) && (empty($loc)))
{select...}
if ((empty($veranstaltungstyp))&&!(empty($datum)) && !(empty($loc)))
{select...}
if (!(empty($veranstaltungstyp))&&(empty($datum)) && (empty($loc)))
{select...}
if (!(empty($veranstaltungstyp))&&(empty($datum)) && !(empty($loc)))
{select...}
if (!(empty($veranstaltungstyp))&&!(empty($datum)) && (empty($loc)))
{select...}
if (!(empty($veranstaltungstyp))&&!(empty($datum)) &&!(empty($loc)))
{select...}
Ich habe ein Veranstaltungskalender programmiert. Mittels Pulldownmenues (<select>) können Suchkriterien eingegeben werden wonach sich die MYSQL-Abfrage (SELECT) richtet. Insgesamt stehen drei Menues zur Verfügung. 1. Datum, 2. Veranstaltungstyp, 3. Ort. Wird nichts ausgewählt werden alle Daten angezeigt. Nun gibt es da so einige Kombinationsmöglichkeiten wie z.B. nur Datum ausgewählt, Datum und Ort ausgewählt, Datum, Veranstaltungstyp und Ort ausgewählt etc. In einer langen IF-Schleife habe ich alle Fälle erfasst die auftreten können (hoffe es zumindest). Irgendwie scheint mir diese Lösung aber etwas umfangreich. Gäbe es nicht eine einfachere (intelligentere) Variante für die Datenbankabfrage ohne dass das Programm einen so lange Schleife durchlaufen muss?
Vorneweg: if ist keine Schleife, Schleifen haben die Eigenschaft, Programmteile zu wiederholen, das ist bei if nicht der Fall. if ist also lediglich eine bedingte Programmverzweigung :)
Wenn es Dir bei Deinem MySQL-Befehl um den where..-Teil geht, dann kannst Du den Befehl ganz einfach aus Bauklötzchen zusammensetzen:
$query=""; // Vorsichtshalber leeren wegen Komma (s.u.)
if ($veranstaltungstyp)
{
$query.="typ=".$veranstaltungstyp;
};
if ($datum)
{
if ($query) $query.=","; // Schon was drin? Ja: Komma einfügen.
$query.="datum=".$datum;
};
if ($loc)
{
if ($query) $query.=",";
$query.="loc=".$loc;
};
if ($dbr=mysql_query("select xy from tabelle where ".$query))
...
Gruß,
soenk.e
ist viel schöner wie meine lösung
ist viel schöner wie meine lösung
.."als meine Lösung", aber trotzdem Danke ;)
Gruß,
soenk.e
ist viel schöner wie meine lösung
.."als meine Lösung", aber trotzdem Danke ;)
immer diese "preißen"
:-)
rakkaus
Huhu
ich baue so etwas immer gerne mit arrays und join zusammen
also z.B.
$where=array();
if ($veranstaltungstyp){
$where[] ="typ=".$veranstaltungstyp;
}
if ($datum){
$where[]="datum=".$datum;
}
if ($loc){
$where[] ="loc=".$loc;
}
$query=join(' AND ',$query);
noch schöner wird es wenn man die fraglichen Spalten als Array vorliegen hat.
Also z.B.
$cols=array ('Ort','Typ','Datum');
$sql= 'SELECT * FROM Meine_Tabelle ';
$where=array();
foreach ($cols as $k){
$v = $HTTP_POST_VARS[$k];
if ($v){
$where[] = sprintf( " %s='%s' ",$k,$v );
}
}
if($where){
$sql.= ' WHERE '.join(' AND ',$where);
}
Viele Grüße
lulu
Huhu
$query=join(' AND ',$query);
muss natürlich
$query=join(' AND ',$where);
lauten.
Viele Grüße
lulu
Korrektur:
$query=""; // Vorsichtshalber leeren wegen Komma (s.u.)
if ($veranstaltungstyp)
{
$query.="typ=".$veranstaltungstyp;
};
if ($datum)
{
if ($query) $query.=","; // Schon was drin? Ja: Komma einfügen.
Ein Komma ist hier natürlich Murks, da muß ein "and" (oder ähnliches) hin:
if ($query) $query.=" and ";
if ($dbr=mysql_query("select xy from tabelle where ".$query))
...
Herrje ;]
soenk.e