chr!s: Lange IF-Schleife :-(

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 ..."
}
}
}

  1. 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...}

  2. 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

    1. ist viel schöner wie meine lösung

      1. ist viel schöner wie meine lösung

        .."als meine Lösung", aber trotzdem Danke ;)

        Gruß,
          soenk.e

        1. ist viel schöner wie meine lösung

          .."als meine Lösung", aber trotzdem Danke ;)

          immer diese "preißen"

          :-)
          rakkaus

    2. 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

      1. Huhu

        $query=join(' AND ',$query);

        muss natürlich

        $query=join(' AND ',$where);

        lauten.

        Viele Grüße

        lulu

    3. 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