Hilfe bei Suchscript in MySQL-DB

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

  • 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
    Zuletzt geändert von 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]

    Kommentar


    • #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
      Zuletzt geändert von dieter_koen; 27.07.2009, 23:28.

      Kommentar


      • #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]

        Kommentar


        • #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

          Kommentar


          • #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
            Zuletzt geändert von dieter_koen; 28.07.2009, 09:20.

            Kommentar


            • #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.

              Kommentar


              • #8
                Zitat von dieter_koen Beitrag anzeigen
                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); 
                Zuletzt geändert von h3ll; 28.07.2009, 10:48.

                Kommentar


                • #9
                  Ich hätte das so gelöst:
                  PHP-Code:
                  <?php
                  $array
                  =array();
                  $sql='';
                  foreach (array(
                  'spalte1','spalte2','spalte3') as $spalte)
                   
                  $test=!empty($_POST[$spalte]) ?$array[]=$spalte."='".mysql_real_escape_string($_POST[$spalte])."'":'';
                  if (
                  count($array)>0)
                    
                  $sql "SELECT * from anmeldungen WHERE ".implode(" AND " $array);
                  if (
                  $sql)
                  // Abfrage
                  else
                  // fehlermeldung
                  ?>
                  Prüfung über empty ist besser da isset darauf reagiert ob die Variable überhaupt existiert und nicht darauf ob diese leer ist.

                  Kommentar

                  Lädt...
                  X