Kleine Logikprobleme mit IF-Anweisung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kleine Logikprobleme mit IF-Anweisung

    Hallo an Alle!

    Hab bei meiner Suchabfrage ein logisches Problem.

    Ich habe drei Felder (a,b,c), die jeweils entweder leer sind
    oder eben gefüllt.
    (Sind so html- input-Felder verschiedener Art)

    Es gibt da ja dann 7 Kombinationen (bzw. alles leer als 8. Möglichkeit)
    a,
    b,
    c,
    a+b+c,
    a+b,
    a+c,
    b+c

    Rein schematisch will ich folgendes machen:

    PHP-Code:

    if(a&b&c)
    sql(a&b&c) }
    elseif(
    a&b)
    sql(a&b) }
    elseif(
    a&c)
    sql(a&c) }
    elseif(
    b&c)
    sql(b&c) }
    elseif(
    & !& !c)
    sql(a) }
    elseif(
    & !& !c)
    sql(b) }
    elseif(
    & !a& !b)
    sql(c) }
    else
    {
    sql(keine Einschränkung=alles anzeigen)
    }

    ?> 
    Bevor ich da jetzt drauf loscode, wollte ich mal vorsichtig fragen:
    Ist das logisch korrekt? Könnte man es noch minimieren?

    Hab es mit verschachtelten IF-Anweisungen versucht, aber entweder
    hab ich irgendwann nicht mehr durchgeblickt oder es ist mindestens
    ebenso aufwendig.

    Vielleicht schreit auch jetzt schon jemand mit verdrehten Augen:
    SO macht man das überhaupt nicht! AAaargh!

    Dann bitte ich um Aufklärung!

    Vielen Dank schonmal,
    Gruß,
    Coniaric
    Gruß, Coni
    ~~ codito ergo sum - ich code, also bin ich! ~~

  • #2
    mach es einfach so:

    PHP-Code:
    $query SELECT FROM tabelle WHERE 1=1

    if ($a!="") { $query $query." AND a=".$a; }
    if (
    $b!="") { $query $query." AND b=".$b; }
    if (
    $c!="") { $query $query." AND c=".$c; }

    $result mysql_query($query); 
    Zuletzt geändert von magman; 13.04.2004, 12:47.

    Kommentar


    • #3
      Hi,

      nehmen wir an, du willst ne SQL-Abfrage machen:

      Beispielfüllung:
      PHP-Code:
      blumen
      rote
      max 1 Tag alt

      $sql 
      "SELECT ... WHERE a='blumen' AND b='rote' AND c ='1'";

      -------------------------------

      $where '';
      if(
      or or c){
        if(
      a$where.="WHERE a='$a'";
        if(
      b){
          if(
      $where <> ''$where.=" AND b='$b'";
          else 
      $where.="WHERE b='$b'";
        if(
      c){
          if(
      $where <> ''$where " AND c='$b'";
          else 
      $where "WHERE c='$c'";
        }
      }

      $sql "SELECT ... $where"
      Hab ich jetzt nur aus'm Kopf geschrieben, dürfte aber klappen

      --------------------------

      Edit: Aber wenn du mindestens 1 WHERE-Klausel schon hast (siehe Magman), so nimm Magman's Lösung...
      Zuletzt geändert von lsgdcity; 13.04.2004, 12:50.

      Kommentar


      • #4
        Hm, das sieht genial aus.

        Kleines Problem hab ich dabei aber.
        Feld a ist ein Feld, in dem man ein Alter eingeben kann.
        Dabei muß ich aber erst aus der Datenbank das Geburtsdatum holen, Alter berechnen und kann dann erst vergleichen und die entsprechenden Daten aus der DB holen.

        (vielleicht auch per PHP später -> alter = 22, while auslesen berechnen und überprüfen, nur Treffer anzeigen)

        Feld "b" ist eine Checkbox, da muß ich zusätzlich noch die Zustände abfragen.
        Und Feld "c" ist ein select-Feld mit 3 Möglichkeiten...

        Ob ich das irgendwie noch dazwischenpriemeln kann, müßte ich probieren....

        Aber danke, die Lösung finde ich schonmal sehr schön!
        Gruß, Coni
        ~~ codito ergo sum - ich code, also bin ich! ~~

        Kommentar


        • #5
          @Lukas Schulze

          Ja, so hatte ich es auch versucht, aber wie gesagt, die Variablen müssen ja "aufbereitet" werden und sind teilweise von datenbankinternen Angaben abhängig, darum kann ich es nicht einfach in das SQL reinhauen.

          Die Wenigsten Probleme macht es, wenn garnichts drin steht.
          Mach ich einfach

          IF (!isset...)
          ...Abfragen...
          else
          alles anzeigen
          Gruß, Coni
          ~~ codito ergo sum - ich code, also bin ich! ~~

          Kommentar


          • #6
            Mhm, ist es denn von Bedeutung fuer die anderen Werte, wenn meinetwegen $a leer ist? Wenn nicht, also $b unc $c nicht beeinflusst werden, reichen auch 4 Schleifen:

            if(!$a) { ... }

            if(!$b) { ... }

            if(!$c) { ... }

            Nicht elseif, dieser Fall tritt nur ein, wenn der vorhergehende nicht eingetreten ist. Oder wenn es nur um eine Option geht die sich aendert, wenn eine dieser Variablen false ist:

            if(!$a || !$b || !$c)
            {

            ...

            }

            Wenn doch gegenseitige Beeinflussung auftritt oder einzigartige Ereignisse (wenn zum Beispiel eine ganz bestimmte Option gesetzt werden muss wenn nur $a false ist) wirst du wohl nicht um diese 7 Kombinationen drumherum kommen.

            Pass aber auf, was du in deinen Bedingungen schreibst. & ist ein Bit-Operator und amcht etwas voellig anderes - was du meinst ist && oder AND, genauso mit || oder OR. Beachte auch die Rangfolge dieser Operatoren, am besten immer so schreiben:
            if(!$a && ($b && $c)) schreiben - so gehst du Konfloikten in der Bedeutung dieser Ausdruecke aus dem Weg.

            Kommentar


            • #7
              *lach*
              Danke, nein, die Operatoren sind mir schon klar, war ja nur eine schematische Darstellung.

              Vereinfacht funktioniert mein Skript schon, hab da nur sehr viele (kopierte) Zeilen mit IF-Anweisungen und wollte mal wissen, ob es das auch kürzer gibt!

              Wenn ich das mache:

              if(!$a) { ... }

              dann muß ich trotzdem irgendwo das SQL für "a" festlegen und dann wäre ja

              if($a)

              genauso wahr wie if($a && $b) (bzw. negiert)

              Bei
              if(!$a) { ... } müßten ja noch die Unterkombinationen
              geprüft werden, es gibt noch b+c, b, c und ich hätte wieder viele IFs.


              Ich glaube, ich experimentiere mit der Lösung von Magman, die scheint wirklich genial zu sein, weil es ja bei einer negativen Abfrage einfach garnichts reinschreibt....
              Zuletzt geändert von Coniaric; 13.04.2004, 13:08.
              Gruß, Coni
              ~~ codito ergo sum - ich code, also bin ich! ~~

              Kommentar

              Lädt...
              X