IF Abfrage in einer WHERE-Abfrage

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

  • IF Abfrage in einer WHERE-Abfrage

    Hi Leute,

    ich habe eine Seite, auf der Daten aus einer DB abgefragt werden. Vor dieser Abfrage-Seite habe ich aber noch eine Filter-Seite, auf der man Suchkriterien einschränken kann.

    Wenn nun Einschränkungen getroffen wurden, möchte ich diese in der DB-Abfrage berücksichtigen. Nun würde ich gerne eine IF-Abfrage in meiner WHERE Anweisung verwenden. Da bekomme ich aber einen Fehler. Mache ich da etwas falsch oder geht das nicht?

    Hier mein Code:

    PHP-Code:
    if ($firm_name_filter == "all" AND $activemenue_filter == "all" AND $year_filter == "all") { // Wenn keine Einschränkung getroffen wurde...

        // Menueitemlist_Sub werden eingelesen
        
    $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub";
        
    $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
        
    $numrows mysql_num_rows($ergebnis_menueitemlist_sub);

    } else { 
    // Wenn Einschränkungen getroffen wurden...

        // Menueitemlist_Sub werden eingelesen
        
    $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub WHERE if ($firm_name_filter != "all") { firm_name = '$firm_name_filter'} if ($activemenue_filter != "all") { activemenue = '$activemenue_filter'} if ($year_filter != "all") { year = '$year_filter'}";
        
    $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
        
    $numrows mysql_num_rows($ergebnis_menueitemlist_sub);


    Bei der Anweisung nach dem "} else {" wird immer gefragt, ob die Filterauswahl nicht "all" ist und wenn es so ist, dann soll er die Anfrage hinschreiben.

    Falls das so nicht geht, wäre ich für eine andere Lösung gerne offen!

    Big Tnx 4 Help!

    MfG Lukas

  • #2
    Tach , das geht schon nur nicht so ;-)
    PHP-Code:
        $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub WHERE if ($firm_name_filter != "all") { firm_name = '$firm_name_filter'} if ($activemenue_filter != "all") { activemenue = '$activemenue_filter'} if ($year_filter != "all") { year = '$year_filter'}"
    Da du php-code einfach mit in den sql-string mit aufgenomen hast.
    Eine Möglichkeit,
    Zuerst der Anfang der Sql-Query der ja gleich bleibt
    PHP-Code:
        $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub  "
    Dann die einzelnen Felder Abfragen und gegebnenfalls die Query verlängern, am besten mit einem array damits keinen Probleme mit den ANDs setzten gibt:
    PHP-Code:
    $where=array();
    if (
    $firm_name_filter != "all"
    $where[]="firm_name = '$firm_name_filter'";}

    if (
    $activemenue_filter != "all"
    $wheere[]="activemenue = '$activemenue_filter'";} 

     if (
    $year_filter != "all"
    $where[]="year = '$year_filter'";} 
    Zu guter letzt schauts ob was in $where steht und hängtst es an die query dran:
    PHP-Code:
    $abfrage_menueitemlist_sub.=(count($where)?" WHERE ".implode(" AND ",$where):""); 
    fertig
    H I L F E
    GD FreeType Antialising
    Gesuch PHP Entwicklungsumgebung
    ------------------------------------------
    Der Cmabrigde rael tset, sruf whoin du wlilst

    Kommentar


    • #3
      Hi RobertTheHero!

      Vielen, vielen Dank für deine Antwort! Würde dir gerne sagen, dass alles super funkt, geht aber leider nicht .
      Vielleicht kannst du mir nochmal helfen! Habe nun das Skript so gebaut:

      PHP-Code:
      // Filter-Kriterien werden geholt

      $fim_name_filter $_POST["ffirm_name_filter"];
      $activemenue_filter $_POST["factivemenue_filter"];
      $year_filter $_POST["fyear_filter"];

      $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub WHERE ";

      $where=array();
          if (
      $fim_name_filter != "all") { 
              
      $where[]="firm_name = '$firm_name_filter'";
          }

          if (
      $activemenue_filter != "all") { 
              
      $wheere[]="activemenue = '$activemenue_filter'";
          } 

          if (
      $year_filter != "all") { 
               
      $where[]="year = '$year_filter'";
          }


      $abfrage_menueitemlist_sub.=(count($where)?implode(" AND ",$where):"");
      $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
      $numrows mysql_num_rows($ergebnis_menueitemlist_sub); 
      Ich musste doch noch die letzten zwei Zeilen anfügen oder? Sonst gibt es ja kein MySQL Query! Habe es aber auch so versucht, wie du es geschrieben hast. Er findet keinen einzigen Eintrag!

      Wäre außerdem noch super, wenn du mir die Zeile mit dem "count" kurz erklären könntest. Blicke das nämlich überhaupt nicht durch!

      Tnx 4 Help!
      MfG Lukas

      Kommentar


      • #4
        Tach,

        also
        PHP-Code:
        $abfrage_menueitemlist_sub.=
          (
        count($where)?implode(" AND ",$where):""); 
        ist nix anderes als
        PHP-Code:
        if (count($where)>0)
          
        $abfrage_menueitemlist_sub.=implode(" AND ",$where);
        else
          
        $abfrage_menueitemlist_sub.=""
        Also im kLartext, check ob was im $where array drin steht, wenn ja füge alle einträge im Array mit der implode anweisung zusammen und häge sie an den string $abfrage_menueitemlist_sub.

        Ansonsten wenn das nicht klappt, du hast nen tippfehler bei der 2. if abfrage, haste
        PHP-Code:
                $wheere[]="activemenue = '$activemenue_filter'"
        und schau die nochmal den anfangstring der sql - abfrage an ich habe am ende das "where" weggelassen und füge das vor dem implode ein, ausserdem zum Fehler debuggen, gibt dir mal
        den string $abfrage_menueitemlist_sub
        auf dem bildschirm aus,nachdem er zusammengesetzt wurde. Dann lässt sich einfacher gucken was nicht klappt,
        ausserdem mysql_error() nach der abfrage wäre auch nicht schlecht.
        ok ?
        H I L F E
        GD FreeType Antialising
        Gesuch PHP Entwicklungsumgebung
        ------------------------------------------
        Der Cmabrigde rael tset, sruf whoin du wlilst

        Kommentar


        • #5
          danke nochmals für deine Antwort!

          Habe das WHERE nun rausgenommen:

          PHP-Code:
          $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub"
          Wo soll ich das WHERE nun einfügen?

          PHP-Code:
          $abfrage_menueitemlist_sub.=(count($where)?implode(" AND ",$where):""); 
          was heißt eigentlich das Fragezeichen nach ($where)?
          und stimmt das so, wenn ich das hier dazufüge?

          PHP-Code:
          $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
          $numrows mysql_num_rows($ergebnis_menueitemlist_sub); 

          Grüße Lukas

          Kommentar


          • #6
            Einfügen so wie bei meiner ersten antwort beschrieben.
            PHP-Code:
            $abfrage_menueitemlist_sub.=(count($where)?" WHERE ".implode(" AND ",$where):""); 
            Das Fragezeichen ist ne verkürzte if abfrage.

            zum Fehler debugen statt:
            PHP-Code:
            $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
            $numrows mysql_num_rows($ergebnis_menueitemlist_sub); 
            schreib mal
            PHP-Code:
            echo "Query: ".$ergebnis_menueitemlist_sub." <br> \n";
            $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
            $numrows mysql_num_rows($ergebnis_menueitemlist_sub); 
            damit du sehen kannst ob die abfrage auch richtig gebildet wird,
            und wenns immer noch nicht klappt, brauch ich dann mal die ausgabe des echos, wie du das script aufrufts, den mysql_error() output, und am besten noch die DB-struktur. Aber eigentlich muss das so dann klappen.

            gruss rth
            H I L F E
            GD FreeType Antialising
            Gesuch PHP Entwicklungsumgebung
            ------------------------------------------
            Der Cmabrigde rael tset, sruf whoin du wlilst

            Kommentar


            • #7
              Hi Robert!

              Danke für deine Antwort!

              Also das Skript sieht nun so aus:

              PHP-Code:

              // Filter-Kriterien werden geholt

              $firm_name_filter $_POST["ffirm_name_filter"];
              $activemenue_filter $_POST["factivemenue_filter"];
              $year_filter $_POST["fyear_filter"];

              $where=array();
                  if (
              $fim_name_filter != "all") { 
                      
              $where[]="firm_name = '$firm_name_filter'";
                  }

                  if (
              $activemenue_filter != "all") { 
                      
              $where[]="activemenue = '$activemenue_filter'";
                  } 

                  if (
              $year_filter != "all") { 
                       
              $where[]="year = '$year_filter'";
                  }


              $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub";

              $abfrage_menueitemlist_sub.=(count($where)?" WHERE ".implode(" AND ",$where):"");
              $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
              $numrows mysql_num_rows($ergebnis_menueitemlist_sub);
              echo 
              "Query: ".$ergebnis_menueitemlist_sub." <br> \n"
              Habe das Query-Echo mal ans Ende der Abfrage gestellt, da er ja meiner Meinung nicht $ergebnis_menueitemlist_sub ausgeben kann, bevor es überhaupt generiert wird. Mache ich es so, bekomme ich folgendes Echo:

              Query: Resource id #17

              mache ich es so, wie du es beschrieben hast, ist das Query leer (es steht nur "Query: " da.

              Vielleicht könntest du mal die Änderungen am Code, den ich in diesem Beitrag geschrieben habe, vornehmen, da ich noch ein Newbie bin und manchmal nicht genau mitkomme, wozu manche Befehle gut sind. Wäre außerdem noch super, wenn du bei IF-Abfragen die herkömmliche Schreibweise verwendest, da mir die Kurzform nicht übersichtlich genug ist.

              Der Code funktioniert so, wie er jetzt ist, manchmal schon,manchmal nicht...

              Sorry, wenn ich so viele Fragen und Bitten an dich habe, aber du bist mir echt eine riesengroße Hilfe!!! DANKE!

              Falls du im Moment keine Zeit hast, lass es bitte. Es ist zwar wichtig, aber ich möchte dir nicht deine Zeit stehlen!

              MfG Lukas

              P.S. Hast du vielleicht ICQ? Hier meine #: 115243676

              Kommentar


              • #8
                Jupp mit dem ausgeben haste recht, mein fehler, das sollte heisen
                PHP-Code:
                echo "Query:".$abfrage_menueitemlist_sub." <br> \n"
                weil ich sehen möchte wie die endültige SQL query aussieht.

                der kurze code
                PHP-Code:
                $abfrage_menueitemlist_sub.=(count($where)?" WHERE ".implode(" AND ",$where):""); 
                sieht lang so aus
                PHP-Code:
                if (count($where)>0)
                  
                $abfrage_menueitemlist_sub.=" WHERE ".implode(" AND ",$where);
                else
                  
                $abfrage_menueitemlist_sub.=""
                Wenn du die Änderungen dann mit dem echo gemacht hast, dann schreib mir mal was der ausgibt, wenn es nicht klappt.

                gruss rth
                H I L F E
                GD FreeType Antialising
                Gesuch PHP Entwicklungsumgebung
                ------------------------------------------
                Der Cmabrigde rael tset, sruf whoin du wlilst

                Kommentar


                • #9
                  Hi Robert, nun kommen wir der Sache schon näher !

                  Code:

                  PHP-Code:
                  // Filter-Kriterien werden geholt

                  $firm_name_filter $_POST["ffirm_name_filter"];
                  $activemenue_filter $_POST["factivemenue_filter"];
                  $year_filter $_POST["fyear_filter"];

                  echo 
                  "Firma: $firm_name_filter";
                  echo 
                  "<br>";
                  echo 
                  "Active-M: $activemenue_filter";
                  echo 
                  "<br>";
                  echo 
                  "Jahr: $year_filter";
                  echo 
                  "<br>";

                  $where=array();
                      if (
                  $fim_name_filter != "all") { 
                          
                  $where[]="firm_name = '$firm_name_filter'";
                      }

                      if (
                  $activemenue_filter != "all") { 
                          
                  $where[]="activemenue = '$activemenue_filter'";
                      } 

                      if (
                  $year_filter != "all") { 
                           
                  $where[]="year = '$year_filter'";
                      }


                  $abfrage_menueitemlist_sub="SELECT mainbuttonid, buttonid, activemenue, filename, year, sort_number_menueitemlist_sub FROM $tablename_menueitemlist_sub";

                  if (
                  count($where)>0)
                    
                  $abfrage_menueitemlist_sub.=" WHERE ".implode(" AND ",$where);
                  else
                    
                  $abfrage_menueitemlist_sub.="";


                  echo 
                  "Query:".$abfrage_menueitemlist_sub." <br> \n";
                  $ergebnis_menueitemlist_sub mysql_query($abfrage_menueitemlist_sub) or die(mysql_error());
                  $numrows mysql_num_rows($ergebnis_menueitemlist_sub); 
                  Das Query ist immer richtig, außer wenn $firm_name_filter = "all" ist, wird "WHERE firm_name = 'all' "drangehängt, obwohl es ja in der IF-Abfrage ausgeschlossen werden sollte...

                  Habe mir den Code schon genau angeschaut, kann aber keinen Fehler finden! Vielleicht sieht dein geschultes Auge da etwas .

                  Big TNX,

                  Lukas

                  Kommentar


                  • #10
                    PHP-Code:
                    if ($fim_name_filter != "all") { 
                    tippfehler, fehlt das 'r' bei firm.
                    Ich denke daran wirds liegen.
                    Du solltest beim debuggen, mal
                    PHP-Code:
                    error_reporting(E_ALL); 
                    setzten, dann gibt php nämlich 'notices' aus, wenn ne unbekannte
                    variable auftritt, und so sieht man dann schneller tippfehler.

                    gruss rth
                    H I L F E
                    GD FreeType Antialising
                    Gesuch PHP Entwicklungsumgebung
                    ------------------------------------------
                    Der Cmabrigde rael tset, sruf whoin du wlilst

                    Kommentar


                    • #11
                      Hi Robert,

                      es funktioniert so!!! Vielen, vielen Dank!

                      Eine Frage habe ich noch, wo muss ich das bei Bedarf hinschreiben? error_reporting(E_ALL);

                      Liebe Grüße,
                      Lukas

                      Kommentar


                      • #12
                        Sehr schön, war ja ne lange Geburt
                        Also das error_reporting(E_ALL), am besten an den Anfang des Scriptes.
                        Aber kannste hinsetzte wo willst.
                        Zur Erklärung
                        http://www.php.net/manual/de/functio...-reporting.php

                        Schönen Tag noch.

                        rth
                        H I L F E
                        GD FreeType Antialising
                        Gesuch PHP Entwicklungsumgebung
                        ------------------------------------------
                        Der Cmabrigde rael tset, sruf whoin du wlilst

                        Kommentar


                        • #13
                          Hi Robert,

                          danke für den Link. Habe die Seite auch gerade gefunden .
                          Funkt nun alles super! Nochmals vielen Dank!

                          Liebe Grüße, Lukas

                          Kommentar

                          Lädt...
                          X