Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT * FROM ... mit if-Anweisung

Einklappen

Neue Werbung 2019

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

  • SELECT * FROM ... mit if-Anweisung

    Hallo,

    ich möchte ein Suchfunktion programmieren bei welcher man an Hand von mehreren Auswahlkriterien bestimmte Datensätze aus der DB holt.

    Klingt eigentlich recht simple. NUR wenn z.B. die Auswahlmöglichkeit Anrede mit Herr bzw. Frau gegeben ist und der User allerdings keines von beiden anklickt, so sucht die SELECT Anweisung alle Datensätze raus, bei denen weder Herr noch Frau ausgewählt ist.
    Ich möchte aber hingegen, dass wenn nichts ausgewählt wurde, alle Datensätze mit Herr sowie alle Datensätze mit Frau ausgegeben werden.

    Beudetet für mich --> wenn nichts ausgewählt wurde, darf das Auswahlkriterium "anrede" nicht mit in WHERE von der SELECT Anweisung auftauchen.

    Hab es mir so gedacht:

    PHP-Code:
    $abfrage "SELECT * FROM xy WHERE ";

    if (!empty(
    $anrede)){$abfrage ."anrede = '$anrede'";}else{$abfrage $abfrage;}

    $db_erg mysql_query($abfrage);


    while (
    $zeile mysql_fetch_array($db_ergMYSQL_ASSOC))
    {
    echo 
    $zeile['xy'];

    Er gibt mir immer die Fehlermeldung:

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/etc./such.php on line 701

    Line 701: "while ($zeile = mysql_fetch_array($db_erg, MYSQL_ASSOC))"

  • #2
    Das darfst du so nicht verwenden, weil falls es keine Anrede gibt, sieht dein Query so aus:
    Code:
    select * from xy where
    Du könntest am Schluss noch 1=1 hinzufügen und an AND bei deiner Bedingung/bei den Bedingungen, dann wäre der Query richtig.

    Kommentar


    • #3
      1. ist nicht so gut, lieber die einzelnen Spalten angeben.
      $abfrage = "SELECT * FROM xy WHERE ";
      2. Wenn $anrede leer ist sieht dein SQL so aus:
      Code:
      "SELECT * FROM xy WHERE "
      3. Das würde es einfacher machen:
      PHP-Code:
      $abfrage "SELECT * FROM xy";
      if (!empty(
      $anrede)) {
          
      $abfrage .= ' WHERE anrede = "' $anrede '"';

      "My software never has bugs, it just develops random features."
      "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

      Kommentar


      • #4
        Danke das mir dem WHERE habe ich mittlerweile auch erkannt

        mein Code ist mittlerweile so:

        PHP-Code:
        $abfrage "SELECT * FROM xy ";

        if (
        $anrede != "leer"){$abfrage ."WHERE ";}else{$abfrage $abfrage;}
        if (
        $anrede != "leer"){$abfrage ."anrede = '$anrede'";}else{$abfrage $abfrage;}

        $db_erg mysql_query($abfrage);


        while (
        $zeile mysql_fetch_array($db_ergMYSQL_ASSOC))
        {
        echo 
        $zeile['xy'] ."<br>";
        }
        echo 
        "<br>";
        echo 
        $abfrage;
        echo 
        "<br>";
        echo 
        var_dump($anrede); 
        Nun kommt zumindest keine Fehlermeldung mehr!!

        ALLERDINGS:

        wenn ich anrede nicht auswähle, so erhalte ich wie gewünscht alle Daten. Wenn ich aber nur Herr oder Frau auswähle erhalte ich trotzdem alle.

        Er nimmt dass WHERE und die Bedingung dazu nicht an?!?

        Habe bei der $_POST bestimmt $anrede , wenn leer, als "leer" bestimmt.

        Im var_dump von $anrede gibt er auch "leer" aus.
        Aber in der ausgabe von $abfrage steht immer nur "SELECT * FROM xy" ?!?

        Ach ja - habe das WHERE separat bestimmt weil es ja mehrere auswahlmöglichkeiten gibt und wenn schon bei zweien die $anrede leer ist aber die andere bestimmt, dann würde das WHERE in der SELECT Anweisung fehlen. Muss natürlich später eintragen wenn alle auswahlmöglichkeiten leer sind soll kein WHERE sein und wenn nur eine bestimmt soll es kommen.

        Kommentar


        • #5
          Zitat von ragtek Beitrag anzeigen

          Du könntest am Schloss noch 1=1 hinzufügen und an AND bei deiner Bedingung, dann wäre Query richtig.
          Wie meinst du das mit dem 1=1 ?!?

          Kommentar


          • #6
            Hab es ich dummer Hund

            habe immer nur
            if ($anrede != "leer"){$abfrage ."WHERE ";}
            anstatt
            if ($anrede != "leer"){$abfrage = $abfrage ."WHERE ";}
            geschrieben.

            Klar dass er es nicht übernommen hat.

            Kommentar


            • #7
              kannst auch statt
              PHP-Code:
              $abfrage $abfrage ."WHERE "
              vereinfachend schreiben:

              PHP-Code:
              $abfrage .= "WHERE "
              Warum nimmst du eigentlich, die else-Bedingung mit rein?

              PHP-Code:
              else{$abfrage $abfrage;} 
              Die kann man doch auch einfach weglassen und dann bleibt $abfrage einfach $abfrage oder irre ich mich?

              Dann würde ich die 2 Zeilen noch zusammenfassen in:

              PHP-Code:
              if ($anrede != "leer"){$abfrage ."WHERE anrede = '$anrede'";}else{$abfrage $abfrage;} 
              1 = 1 war sicherlich nur dafür gedacht, dass die WHERE-Klausel gefüllt ist. 1 = 1 trifft ja immer ein, beeinflusst die Abfrage aber nicht.

              Kommentar


              • #8
                So nachdem die erste Hürde geschaftt kommt die Zweite - der Code ist mittlerweile wie folgt:

                PHP-Code:
                $abfrage "SELECT * FROM xy ";

                if (
                $anrede != "leer" OR $alter_von != ""){$abfrage $abfrage ."WHERE ";}
                if (
                $anrede != "leer"){$abfrage $abfrage ."anrede = '$anrede'";}
                if (
                $alter_von != "" AND $anrede != "leer"){$abfrage $abfrage ." AND ";}
                if (
                $alter_von != ""){$abfrage $abfrage ."alter >= '$alter_von'";}

                $db_erg mysql_query($abfrage);


                while (
                $zeile mysql_fetch_array($db_ergMYSQL_ASSOC))
                {
                echo 
                $zeile['xy'] ."<br>";
                }
                echo 
                "<br>";
                echo 
                $abfrage;
                echo 
                "<br>";
                echo 
                var_dump($anrede);
                echo 
                var_dump($alter_von); 
                Ohne etwas einzugeben gibt er immer noch alles aus --> KORREKT!!

                Wenn ich nach anrede suche ---> KORREKT!!

                Wenn ich irgendwas mit alter mach --> FALSE!!!

                Auch wenn ich mal nur nach alter suche - ohne anrede gibt er mir die Fehlermeldung:

                Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/www/etc/such.php on line 708

                Line 708: while ($zeile = mysql_fetch_array($db_erg, MYSQL_ASSOC))

                Allerdings sieht der SELECT Befehl so aus:

                SELECT * FROM chat WHERE alter >= '16'

                eigentlich richtig oder täusche ich mich?

                Die var-dumps sehen auch gut aus:

                string(4) "leer"
                string(2) "16"

                Was will er nun wieder??

                Kommentar


                • #9
                  oder kann es daran liegen, dass alter_von in der DB INT und nicht VARCHAR ist?

                  Kommentar


                  • #10
                    es muss ja ein integer sein, da du auf einen String kein Größer gleich anwenden kannst. Am besten du testest die ganzen fehlerhaften SQL Aufrufe als erstes über phpmyadmin. Wenn diese richtig sind, könne wir auch hier weitermachen. :=)

                    PHP-Code:
                    SELECT FROM chat WHERE alter >= '16'
                    SELECT FROM chat WHERE alter >= 16 

                    Kommentar


                    • #11
                      es muss ein Integer sein, da du einen String nicht nach gröer oder kleiner gleich abfragen kannst.
                      Teste Deine SQL-Anweisungen doch bitte erstmal in phpmyadmin
                      PHP-Code:
                      SELECT FROM chat WHERE alter >= '16' 
                      PHP-Code:
                      SELECT FROM chat WHERE alter >= 16 

                      Kommentar


                      • #12
                        Zitat von bulb Beitrag anzeigen
                        es muss ja ein integer sein, da du auf einen String kein Größer gleich anwenden kannst. Am besten du testest die ganzen fehlerhaften SQL Aufrufe als erstes über phpmyadmin. Wenn diese richtig sind, könne wir auch hier weitermachen. :=)

                        PHP-Code:
                        SELECT FROM chat WHERE alter >= '16'
                        SELECT FROM chat WHERE alter >= 16 
                        ich habe alles mit INT und Varchar getestet - auch andere Variablen getestet - bei denen geht es?!

                        Die anderen getesteten variablen waren aber schon in der DB enthalten.
                        alter habe ich erst mit dieser Funktion angelegt in der DB.

                        Habe auch den Cache etc geleert um zu sehen - aber es tut nicht??

                        Kann es an was anderem liegen - gibt es bei phpmyadmin auch cache den ich leeren kann???

                        Hatte soetwas eigentlich noch nie...

                        Kommentar


                        • #13
                          Zitat von bulb Beitrag anzeigen
                          es muss ein Integer sein, da du einen String nicht nach gröer oder kleiner gleich abfragen kannst.
                          Teste Deine SQL-Anweisungen doch bitte erstmal in phpmyadmin
                          PHP-Code:
                          SELECT FROM chat WHERE alter >= '16' 
                          PHP-Code:
                          SELECT FROM chat WHERE alter >= 16 
                          Habe es nun im phpmyadmin getestet

                          es tut mit dieser schreibweise:


                          WHERE `alter` >=25

                          wenn ich es auch so im Code einbaue tut es...danke!!!!!

                          Kommentar


                          • #14
                            warum nur? *grübel*
                            Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                            Kommentar


                            • #15
                              Da gibt es nichts zu „grübeln“, wenn man lesen kann: MySQL :: MySQL 5.1 Reference Manual :: 8.3 Reserved Words
                              [SIZE="1"]RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?[/SIZE]

                              Kommentar

                              Lädt...
                              X