Suche mit Eingabefeldern

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

  • Suche mit Eingabefeldern

    Mir fehlt als php- und MySQL-Anfänger eine gute Idee:

    Ich kann Eintragungen in meine MySQL-Datenbank machen – funktioniert.
    Ich kann die Ausgabe aller Datensätze machen – funktioniert.
    Auch die Suche per

    $sql = 'SELECT * FROM tabelle1 WHERE ort="Berlin" AND plz="10115"';
    $abfrage = mysql_query($sql) or die("Fehler: " . mysql_error());

    funktioniert.

    Jetzt möchte ich eine Suche durch führen und vorher über Eingabefelder abfragen, was denn gesucht wird.

    Meine Besucher erhalten Eingabefelder wie im Eingabeformular, z.B. ort=? oder plz=?

    Jetzt fehlt mir zwischen der Eingabe mit $ort = $_POST['ort']; und

    $sql = 'SELECT * FROM tabelle1 WHERE ort="Berlin" AND plz="10115"';

    der Zwischenteil im Script, wie der eingegebene Ort an die Suche übergeben wird. Möglicherweise ganz einfach zu realisieren, aber ich habe als Anfänger da noch keinen Plan.
    Leider habe ich kein entsprechendes Script gefunden, das die Eingabe und die Suche irgendwo verbindet.

    Danke für die Hilfe

  • #2
    Ob Du es hinten offen lässt, wie im ersten Beispiel mit ort='".$ort; oder auch wieder mit Anführungszeichen abschließt, wie im zweiten Beispiel mit plz='".$plz."'"; sollte eigentlich egal sein. Hatte da mal gesucht und gesucht, mal sahen die Beispiele so aus und mal so. Funktioniert haben beide Varianten.

    Wie Du das kombinierst, musst Du wissen, falls beide Inputs übermittelt wurden.

    PHP-Code:
    <?php
     
    if (isset($_POST["ort"]) and !empty($_POST["ort"])) {
     
        
    $ort trim($_POST["ort"]);
        
    $ort preg_replace("/[^a-z\s-]/i"""$ort);
        
    $sql "SELECT * FROM tabelle1 WHERE ort='".$ort;
    }
    if (isset(
    $_POST["plz"]) and !empty($_POST["plz"])) {

        
    $plz trim($_POST["plz"]);
        
    $plz preg_replace("/[^0-9]/i"""$plz);
        
    $sql "SELECT * FROM tabelle1 WHERE plz='".$plz."'";    
    }
    ?>
    So wird es sich wohl auch schreiben lassen, habe ich nur noch nicht probiert.

    PHP-Code:
    $sql "SELECT * FROM tabelle1 WHERE plz='$plz'"
    Unter Umständen könntest Du zuerst beide abfragen und wenn das nichts bringt, weil eins von beiden nicht übergeben wurde, diese beiden mit elseif folgen lassen.

    PHP-Code:
    if (isset($_POST["ort"]) and isset($_POST["plz"])) {
     
        ...
    }
        elseif (...
    ort...) {
            
        ...
        }
        elseif (...
    plz...) {
            
        ...
        } 
    Zuletzt geändert von Melewo; 01.04.2013, 12:34.

    Kommentar


    • #3
      Suche mit Eingabefeldern

      Danke erst mal für die schnelle Antwort. Bin bis jetzt noch nicht dazu gekommen, das weiter zu programmieren.
      Wenn es funktioniert stelle ich mal für alle Interessenten das komplette Script hier zur Verfügung, da ich eine solche Lösung in keinem Tutorial bisher gefunden hatte.

      Kommentar


      • #4
        Suche mit Eingabefeldern

        Hatte erst jetzt wieder Zeit - sorry. Mein Script sieht jetzt so aus mit den Einfügungen von oben (Login-Daten und Tabellenname geändert):

        Code:
        ?php
        $db_host = "localhost";
        $db_user = "user123456";
        $db_pass = "password123";
        $db_name = "db123456-main";
        
        if (isset( $_POST['eintragen'] ))
        {
            // Maskierende Slashes aus POST entfernen
            $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;
            
            // Inhalte der Felder aus POST holen
            $name = $_POST['name'];
            $plz = $_POST['plz'];
           
            
            /* ************************************************************************************************ */
            /* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
            /* ************************************************************************************************ */
            
            // Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
            // Verbindung oeffnen und Datenbank ausweahlen
            $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
            if ($conID)
            {
                mysql_select_db( $db_name, $conID );
            }
                
            if (isset($_POST["name"]) and !empty($_POST["name"])) {
         
            $ort = trim($_POST["name"]);
            $ort = preg_replace("/[^a-z\s-]/i", "", $name);
            $sql = "SELECT * FROM tabelle1 WHERE name='".$name;
        }
        if (isset($_POST["plz"]) and !empty($_POST["plz"])) {
        
            $plz = trim($_POST["plz"]);
            $plz = preg_replace("/[^0-9]/i", "", $plz);
            
            $sql = "SELECT * FROM tabelle1 WHERE plz='".$plz."'";    
        }    
        // Anfrage an die DB schicken und die Rueckmeldung in eine Variable ablegen
        $abfrageergebnis = mysql_query( $sql, $conID );
        // Ermitteln wie viele Datensaetzen gefunden wurden
        $anzahl = mysql_num_rows( $abfrageergebnis );
        echo "<p>Es wurden <strong>" .$anzahl. "</strong> Datensätze gefunden!</p>";
        
        // Tabelle erstellen fuer die Ausgabe
        echo '<table border="1">';
        echo "<tr><th>Name</th><th>PLZ</th>";
        // Ab hier werden die Datensaetze zeilenweise ausgeben (auch fetchen genannt)
        while ($datensatz = mysql_fetch_array( $abfrageergebnis ))
        {    
            // Jeder Datensatz entspricht einer Tabellenzeile
            echo "<tr>";
            
            echo "<td>" .htmlspecialchars( $datensatz['name'] ). "</td>";
            echo "<td>" .htmlspecialchars( $datensatz['plz'] ). "</td>";
            
            echo "</tr>";
        }
        // Tabelle schliessen
        echo "</table>";
        
        ?>
        </body>
        </html>
        Jetzt erhalte ich folgende Fehlermeldung:

        Parse error: syntax error, unexpected $end in /data/multiserv/users/1046682/projects/2363976/www/suche2.php on line 69

        Line 69 ist hinter dem Programmende </html>

        Ich selbst habe keinen Schreibfehler gefunden. Woran könnte es liegen?

        Danke für die Hilfe!

        Kommentar


        • #5
          Bei diesem Fehler gilt immer als erstes: Geschweifte Klammern zählen!
          I don't believe in rebirth. Actually, I never did in my whole lives.

          Kommentar


          • #6
            Zu diesem Statement fehlt die schließende Klammer.

            PHP-Code:
            if (isset( $_POST['eintragen'] ))

            Entweder so name='".$name; ohne ."'" oder so plz='".$plz."'" mit ."'", für eine Schreibweise solltest Du Dich entscheiden. Hatte nur beide Beispiele gebracht, wobei ich eigentlich die letzte nehme, auch in einer Reihe von Beispielen so sah, mir es dann aber zuweilen nach etwas zu viel an Anführungszeichen aussieht.

            Kommentar


            • #7
              Suche mit Eingabefeldern

              Danke. Jetzt habe ich zwar nach diesem guten Hinweis auch festgestellt, da? die erste geschweifte Klammer geöffnet, aber nirgends wieder geschlossen wird.
              Aber wo setze ich jetzt die Klammer zum schließen hin? Ich bekomme überall Fehlermeldungen.
              Danke!

              Kommentar


              • #8
                So wie es ausschaut eigentlich hier:

                PHP-Code:
                // Tabelle schliessen
                echo "</table>";
                }
                ?>
                </body>
                </html> 
                Müsstest mal alles einrücken, was von {eingeschlossen werden soll}, nehme jedoch an, alles in Abhängigkeit von $_POST['eintragen'].

                Kommentar


                • #9
                  Suche mit Eingabefeldern

                  Mal sehen, ob ich die Klammern im Code unterschiedlich farbig hinbekomme:

                  ?php
                  $db_host = "localhost";
                  $db_user = "user123456";
                  $db_pass = "password123";
                  $db_name = "db123456-main";

                  if (isset( $_POST['eintragen'] ))
                  [COLOR="Red"]{[/COLOR]
                  // Maskierende Slashes aus POST entfernen
                  $_POST = get_magic_quotes_gpc() ? array_map( 'stripslashes', $_POST ) : $_POST;

                  // Inhalte der Felder aus POST holen
                  $name = $_POST['name'];
                  $plz = $_POST['plz'];


                  /* ************************************************************************************************ */
                  /* *** Hier sollten und MUESSEN die Benutzereingaben geprueft werden um Schadcode abzufangen!!! *** */
                  /* ************************************************************************************************ */

                  // Sind alle Eingaben durch die Validierung gekommen werden sie in die DB geschrieben
                  // Verbindung oeffnen und Datenbank ausweahlen
                  $conID = mysql_connect( $db_host, $db_user, $db_pass ) or die( "Die Datenbank konnte nicht erreicht werden!" );
                  if ($conID)
                  [COLOR="Green"]{[/COLOR]
                  mysql_select_db( $db_name, $conID );
                  [COLOR="green"]}[/COLOR]

                  if (isset($_POST["name"]) and !empty($_POST["name"])) [COLOR="blue"]{[/COLOR]

                  $ort = trim($_POST["name"]);
                  $ort = preg_replace("/[^a-z\s-]/i", "", $name);
                  $sql = "SELECT * FROM tabelle1 WHERE name='".$name;
                  [COLOR="Blue"]}[/COLOR]
                  if (isset($_POST["plz"]) and !empty($_POST["plz"])) [COLOR="Magenta"]{[/COLOR]

                  $plz = trim($_POST["plz"]);
                  $plz = preg_replace("/[^0-9]/i", "", $plz);
                  [COLOR="Magenta"]}[/COLOR]

                  $sql = "SELECT * FROM tabelle1 WHERE plz='".$plz;
                  [COLOR="rgb(255, 0, 255)"]}[/COLOR]
                  // Anfrage an die DB schicken und die Rueckmeldung in eine Variable ablegen
                  $abfrageergebnis = mysql_query( $sql, $conID );
                  // Ermitteln wie viele Datensaetzen gefunden wurden
                  $anzahl = mysql_num_rows( $abfrageergebnis );
                  echo "<p>Es wurden <strong>" .$anzahl. "</strong> Datensätze gefunden!</p>";

                  // Tabelle erstellen fuer die Ausgabe
                  echo '<table border="1">';
                  echo "<tr><th>Name</th><th>PLZ</th>";
                  // Ab hier werden die Datensaetze zeilenweise ausgeben (auch fetchen genannt)
                  while ($datensatz = mysql_fetch_array( $abfrageergebnis ))
                  [COLOR="black"]{ [/COLOR]
                  // Jeder Datensatz entspricht einer Tabellenzeile
                  echo "<tr>";

                  echo "<td>" .htmlspecialchars( $datensatz['name'] ). "</td>";
                  echo "<td>" .htmlspecialchars( $datensatz['plz'] ). "</td>";

                  echo "</tr>";
                  }
                  // Tabelle schliessen
                  echo "</table>";

                  ?>
                  </body>
                  </html>
                  [/CODE]

                  Es sind alle Klammern da und vollständig bis auf die rote Klammer ganz am Anfang. Wo kann ich die schließen? Wenn ich sie direkt vor ?> setze erhalte ich als Anzeige eine weiße Seite, woanders Fehlermeldungen.

                  Die Schreibweise habe ich auch versucht zu ändern. So ok?

                  Danke!

                  Kommentar


                  • #10
                    Suche mit Eingabefeldern

                    mit

                    Code:
                        echo "</tr>";
                    }
                    // Tabelle schliessen
                    echo "</table>";
                    }
                    
                    ?>
                    </body>
                    </html>
                    erhalte ich jetzt

                    Parse error: syntax error, unexpected '}' in /data/multiserv/users/1046682/projects/2363976/www/suche2.php on line 56

                    das ist die Zeile mit:

                    while ($datensatz = mysql_fetch_array( $abfrageergebnis ))

                    Kommentar


                    • #11
                      Damit diese Seite nicht weiß bleibt:

                      PHP-Code:
                      // Tabelle schliessen
                      echo "</table>";

                      } else {echo 
                      "Es wurde noch keine Post versendet oder empfangen.\n";}
                      ?>
                      </body>
                      </html 
                      >

                      Kommentar


                      • #12
                        Suche mit Eingabefeldern

                        Auch wenn ich das an der Stelle 1:1 so einfüge erhalte ich weiterhin:

                        Parse error: syntax error, unexpected '}' in /data/multiserv/users/1046682/projects/2363976/www/suche2.php on line 56

                        In der Datenbank befinden sich ja ca. 50 Datensätze, die ich auch mit einem einfachen Lesescript auslesen kann und es funktioniert problemlos. Die DB wird aber noch größer, so dass ich jetzt einerseits die Funktion "Blättern" noch irgendwie einbauen muss als auch die hier beschriebene Suche nach konkreten Eintragungen.

                        Kommentar


                        • #13
                          Du bringst mich aber auch zum Schwitzen.

                          Beispiel: Warum steht eine Seite $name und andere Seite $ort, wenn doch $_POST["name"] in $ort gespeichert ist?

                          Zitat von ich1d3 Beitrag anzeigen
                          PHP-Code:
                              if (isset($_POST["name"]) and !empty($_POST["name"])) {
                           
                              
                          $ort trim($_POST["name"]);
                              
                          $ort preg_replace("/[^a-z\s-]/i"""$name);
                              
                          $sql "SELECT * FROM tabelle1 WHERE name='".$name;

                          Und wozu diese Zeilen, dafür sind doch die beiden if-Abfragen als Fallunterscheidung und zur Kontrolle ob gefüllt oder nicht gedacht.

                          Zitat von ich1d3 Beitrag anzeigen
                          PHP-Code:
                              // Inhalte der Felder aus POST holen
                              
                          $name $_POST['name'];
                              
                          $plz $_POST['plz']; 
                          Zuletzt geändert von Melewo; 08.04.2013, 18:09.

                          Kommentar


                          • #14
                            Suche mit Eingabefeldern

                            Hallo Melewo,

                            erst mal Dankeschön für die Geduld!
                            Ich werde aber noch nicht ganz schlau. Von oben hatte ich den Codeschnipsel 1:1 übernommen in mein Script

                            PHP-Code:
                            <?php
                             
                            if (isset($_POST["ort"]) and !empty($_POST["ort"])) {
                             
                                
                            $ort trim($_POST["ort"]);
                                
                            $ort preg_replace("/[^a-z\s-]/i"""$ort);
                                
                            $sql "SELECT * FROM tabelle1 WHERE ort='".$ort;
                            }
                            if (isset(
                            $_POST["plz"]) and !empty($_POST["plz"])) {

                                
                            $plz trim($_POST["plz"]);
                                
                            $plz preg_replace("/[^0-9]/i"""$plz);
                                
                            $sql "SELECT * FROM tabelle1 WHERE plz='".$plz."'";    
                            }
                            ?>
                            und dann nur statt $ort das feld $ name ausgewechselt. Das Feld "name" ist auch in meiner Datenbank vorhanden, genau wie plz.

                            Was ist jetzt falsch gelaufen? Im Script habe ich peinlich darauf geachtet, dass name = name und plz = plz bleibt.
                            Auch die berühmten Komma- und Semikolon-Fehler habe ich versucht zu vermeiden. Mit der geschweiften Klammer hat es mich diesmal erwischt.

                            Aber an dieser Stelle stecke ich einfach fest und das ist ja noch nicht das letzte Problem, an dem ich rumdoktere (übrigens ehrenamtlich ohne Vergütung).
                            Vielleicht bekommen wir es doch noch gebacken. Es ist halt blöd, wenn man nur alle paar Jahre mal was macht und einem dann die praktischen Erfahrungen fehlen. Leider habe ich auch kein fertiges Script zum "Umstricken" gefunden, sondern immer solche Code-Schnipsel, die man dann irgendwo selbst einbauen soll und dann passieren halt solche Sachen wie hier. Sorry.

                            Kommentar


                            • #15
                              So, nun habe ich mir heute so richtig die Zeit verspielt, doch das sollte zumindest funktionieren. Habe extra 1 Tabelle mit "name" und "plz" in einer Testdatenbank mit vier Einträgen angelegt, nur um das Listing zu testen. Nun erzähle mir nicht, dass das nicht funktionieren würde.

                              PHP-Code:
                              <!DOCTYPE html>
                              <html>

                              <head>
                              <title>Test</title>
                              </head>

                              <body>
                              <form action="a.php" method="post">
                              <input type="text" name="name">
                              <input type="text" name="plz">
                              <input type="submit" name="eintragen" value="eintragen">
                              </form>
                              <?php error_reporting(E_ALL);

                              $db_host "localhost";
                              $db_user "user123456";
                              $db_pass "password123";
                              $db_name "db123456-main";
                              $abf false;

                              if (isset(
                              $_POST["eintragen"])) {

                                  
                              $sql mysqli_connect($db_host$db_user$db_pass$db_name
                                         or die(
                              "Die Datenbank konnte nicht erreicht werden!");

                                  if (isset(
                              $_POST["name"]) and !empty($_POST["name"])) {

                                      
                              $ort trim($_POST["name"]);
                                      
                              $ort preg_replace("/[^a-z\s-]/i"""$ort);
                                      
                              $abf "SELECT * FROM test... WHERE name='".$ort."'";
                                  }
                                  if (isset(
                              $_POST["plz"]) and !empty($_POST["plz"])) {

                                      
                              $plz trim($_POST["plz"]);
                                      
                              $plz preg_replace("/[^0-9]/i"""$plz);
                                      
                              $abf "SELECT * FROM test... WHERE plz='".$plz."'";
                                  }

                                  if (
                              $sql != false and $abf != false) {

                                      if (
                              $result mysqli_query($sql$abf)) {

                                          
                              $anzahl mysqli_num_rows($result);
                                          echo 
                              "<p>Es wurden <strong>".$anzahl."</strong> Datensätze gefunden!</p>\n";

                                          echo 
                              "<table border=\"1\">\n".
                                               
                              "<tr><th>Name</th><th>PLZ</th>\n";

                                          while (
                              $datensatz mysqli_fetch_assoc($result)) {

                                              echo 
                              "<tr>".
                                              
                              "<td>".htmlspecialchars($datensatz["name"])."</td>".
                                              
                              "<td>" .htmlspecialchars($datensatz["plz"])."</td>".
                                              
                              "</tr>\n";
                                          }
                                      
                              mysqli_free_result($result);
                                      echo 
                              "</table>\n";
                                      }
                                   
                              mysqli_close($sql);
                                  }
                                  else {echo 
                              "Es wurden keine verwertbaren Daten vom Formular übermittelt.\n";}

                              else {echo 
                              "Es wurde noch keine Post versendet oder empfangen.\n";}
                              ?>
                              </body>
                              </html>
                              Zuletzt geändert von Melewo; 08.04.2013, 20:40.

                              Kommentar

                              Lädt...
                              X