Hilfe bei Suchscript in MySQL-DB

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Hilfe bei Suchscript in MySQL-DB

    Einen wunderschönen guten Abend,


    Ich habe vor, bzw. Script steht schon, eine Suche via Formular durchzuführen, die anschließend die Daten mit der MySQL-Datenbank abgleicht und sie in einer Tabelle ausgibt.

    Das Formular besteht aus 5 Feldern, die alle in der Suche berücksichtigt werden sollen. Ist ein Feld leer, sollen alle Werte der Spalte in der DB ausgegeben werden.

    Allgemein sieht die Abfrage ja dann so aus:

    PHP Code:
    $sql "SELECT * FROM 'table' WHERE objekt1 = 'eingabe_suche1' AND WHERE objekt2 = 'eingabe_suche2' [...]"
    ]Das Problem besteht ja nun darin, dass sobald ein Feld in dem Formular nicht gesetzt wurde (soll auch keine Pflicht sein), der String in der Where-Clause (objekt1 = " " ) leer ist und schließlich keinen "leeren" Eintrag in der DB findet und es nicht zur Ausgabe kommt.
    Ich weiß leider nicht, wie ich dieses Problem umgehen kann oder ob es irgendetwas Ähnliches wie das * beim SELECT auch für die WHERE x = - Anweisung gibt.

    Ich hoffe ihr könnt mir irgendwie helfen, Google konnte es nicht (oder ich bin zu dumm zum Suchen).
    Und ja, dass Script soll auf dem Formular basieren!

    Vielen Dank schon mal für jede Antwort!

    Mit freundlichen Grüßen

    der Dieter
    Last edited by dieter_koen; 27-07-2009, 23:27.

  • #2
    Hallo Dieter,

    du kannst doch PHP prüfen lassen, ob der Wert leer ist und nur wenn nicht, die Bedingung in die where-Klausel übernehmen, also den String $sql konditional füllen, statt fest vorzugeben.

    Edit: das Schlüsselwort "WHERE" kommt dabei nur einmal vor, nicht nach jedem "AND".

    Gruß,

    Anja
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Comment


    • #3
      Erstmal danke für deine Antwort AmicaNoctis.
      Die gleiche Überlegung wie du hatte ich auch schon, doch dort tritt ein weiteres Problem auf:

      Wenn ich die Variablen wie folgt vergebe und die $sql konditionell fülle, sehe das ja beispielsweise so aus[stark vereinfacht]:
      PHP Code:
      if isset ($eingabe) {
        
      $where_clause_kon "WHERE objekt = eingabe1_suche AND"
      }
      //[...] (für jedes Statement durch) 
      Dann kommt die
      PHP Code:
      $sql "SELECT * FROM <table> $where_clause_kon [...]" 
      Nun müsste ich irgendwie noch die AND 's setzen.
      Würde jetzt z.B. nur das erste Feld ausgefüllt, würde die $sql ausgeschrieben so aussehen:

      PHP Code:
      $sql "SELECT * FROM <table> WHERE objekt = eingabe1_suche AND" 
      Dies würde einen Fehler hervorrufen, da AND nicht alleine stehen darf.
      Ich müsste also immer vorraussetzen, dass immer ganz bestimmte Felder ausgefüllt werden, was aber nicht Sinn der Sache ist.

      Ich hoffe ich habe dich nicht falsch verstanden , wenn doch dann versuch es mir bitte zu erklären
      Auf jeden Fall Dankeschön

      Mit freundlichen Grüßen

      der Dieter
      Last edited by dieter_koen; 27-07-2009, 23:28.

      Comment


      • #4
        Das lässt sich recht einfach beheben, indem du

        a) nach der schleife "1=1" einfügst, um nach dem letzten and eine Tautologie einzufügen, die das Statement semantisch nicht verändert.

        b) die Bedingungen in einem Array sammelst und dieses nach der Schleife mit " and " implodierst:
        PHP Code:
        $sql .= implode(" and "$einzelbedingungen); 
        Gruß,

        Anja
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Comment


        • #5
          du solltest bei der prüfung nicht mit isset() sondern mit empty() und/oder einen weiteren logik arbeiten. formulardaten sind immer "set", wenn die felder einen namen haben.

          mysql_real_escape_string ist auch nie verkehrt ;-)
          Kissolino.com

          Comment


          • #6
            Hey,

            danke nochmals für die Antworten
            Mit empty ist es wirklich besser, dann kann man sich das "blöde" && != " " sparen ;D, hatte ich ganz vergessen

            Mit dem Implodieren habe ich es versucht, jedoch gelingt es mir nicht so richtig.
            Ich weiß nicht, wie ich die Bedingung am besten setze.
            Folglich kommt auch der Fehler:
            [...] the right syntax to use near 'AND AND AND AND AND' at line 1

            Weil er ja wieder, sobald die Felder leer sind, eben 5x hintereinander die AND 's schreibt.
            Mein Code sieht also so aus:
            PHP Code:
            $array = array($suche1$suche2$suche3$suche4$suche5$suche6);
            $mysuche .= implode(" AND " $array);
            $sql = ("SELECT * from anmeldungen WHERE $mysuche"); 
            Vielen Dank schon einmal im Vorraus.


            MfG
            Last edited by dieter_koen; 28-07-2009, 09:20.

            Comment


            • #7
              Soo, also nochmals Vielen Dank für die Antworten, hat mir wirklich sehr geholfen.

              Ich habe es jetzt mit array_push gelöst, indem ich in jeder If-Abfrage das Array mit meinen Werten fülle.
              Die SQL-Abfrage baue ich mit implode zusammen.
              Falls jemand auch dieses Problem hat, hier der Code in vereinfacht:
              PHP Code:
              $array = array();
              //anstatt isset geht natürlich auch empty
              if(isset($_POST['eingabe1']) && $_POST['eingabe1'] != "") {
                
              $suche1 "<spaltenname> = '" "$_POST[eingabe1]'";
                
              array_push($array$suche1); 
                } 
              [...] 
              //für jedes Formularfeld die Bedingungen durchgehen

              //Teil der SQL-Abfrage aus Array zusammensetzen
              $mysuche .= implode(" AND " $array);
              //SQL-Abfrage durchführen
              $sql = ("SELECT * from anmeldungen WHERE $mysuche");
              [...] 
              Daten und Array ausgeben

              Klappt alles perfekt!

              Vielen Dank nochmal!

              Mit freundlichen Grüßen

              Dieter.

              Comment


              • #8
                Originally posted by dieter_koen View Post
                Soo, also nochmals Vielen Dank für die Antworten, hat mir wirklich sehr geholfen.

                Ich habe es jetzt mit array_push gelöst, indem ich in jeder If-Abfrage das Array mit meinen Werten fülle.
                Wozu brauchst du array_push???

                PHP Code:
                $where = array("1");
                $where[] = "spalte1 = 'wert1'";
                $where[] = "spalte2 = 'wert2'";

                $sql "SELECT * FROM tabelle WHERE " implode(" AND "$where); 
                Und du brauchst nicht für jedes Formularfeld ein eigenes if. Warum unnötige Tipparbeit machen, wenn das PHP für dich erledigen kann?

                PHP Code:
                $suchfelder = array(
                    
                'feld1' => 'spalte1',
                    
                'feld2' => 'spalte2',
                    
                'feld3' => 'spalte3',
                    
                'feld4' => 'spalte4'
                );

                $where = array("1");

                foreach (
                $suchfelder as $feld => $spalte) {
                    if (isset(
                $_POST[$feld]) && $_POST[$feld] != '') {
                        
                $where[] = sprintf("`%s` = '%s'"$spaltemysql_real_escape_string($_POST[$feld]));
                    }
                }

                $sql "SELECT * FROM tabelle WHERE " implode(" AND "$where); 
                Last edited by h3ll; 28-07-2009, 10:48.

                Comment

                Working...
                X