PHP SQL script Tabellen spalten einzeln durchsuchen

  • hallo,

    ich habe mir inzwischen das folgende Script geholt:

    http://tutorial.world.edu/web-…-search-mysql-php-script/


    Folgende Funktion bräuchte ich:

    Ich brauch mehrere Suchfelder felder bei denen jedes einzelne nur eine Spalte durchsucht-Also Suchfeld 1 sucht Spalte 1, Suchfeld2 Spalte2 etc. Dann soll mir das Suchergebnis angezeigt werden, aber das komplette, also die komplette Zeile.


    Das gesamte Script ist folgendes:


    <html>

    <head>

    <title> How To Create A Database Search With MySQL & PHP Script | Tutorial.World.Edu </title>

    </head>

    <body>

    <form action="search-database.php" method="post">

    Search: <input type="text" name="search" placeholder=" Search here ... "/>

    <input type="submit" value="Submit" />

    </form>

    <p><a href="http://tutorial.world.edu/web-development/how-to-create-database-search-mysql-php-script/">PHP MySQL Database Search</a> by <a href="http://tutorial.world.edu">Tutorial.World.Edu</a></p>

    </body>

    </html>



    <?php

    //load database connection

    $host = "localhost";

    $user = "root";

    $password = "";

    $database_name = "databasename";

    $pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

    ));

    // Search from MySQL database table

    $search=$_POST['search'];

    $query = $pdo->prepare("select * from book where title LIKE '%$search%' OR author LIKE '%$search%' LIMIT 0 , 10");

    $query->bindValue(1, "%$search%", PDO::PARAM_STR);

    $query->execute();

    // Display search result

    if (!$query->rowCount() == 0) {

    echo "Search found :<br/>";

    echo "<table style=\"font-family:arial;color:#333333;\">";

    echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Title Books</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Author</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Price</td></tr>";

    while ($results = $query->fetch()) {

    echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo $results['title'];

    echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo $results['author'];

    echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo "$".$results['price'];

    echo "</td></tr>";

    }

    echo "</table>";

    } else {

    echo 'Nothing found';

    }

    ?>


    Ich hatte das Suchfeld verdoppelt und diese Suchfunktion nochmal gemacht, so dass es dann so aus sieht:


    <html>

    <head>

    <title> How To Create A Database Search With MySQL & PHP Script | Tutorial.World.Edu </title>

    </head>

    <body>

    <form action="search-database.php" method="post">

    Search: <input type="text" name="search" placeholder=" Search here ... "/>

    <input type="submit" value="Submit" />

    </form>

    <body>

    <form action="search-database.php" method="post">

    Search: <input type="text" name="search2" placeholder=" Search here ... "/>

    <input type="submit" value="Submit" />

    </form>


    <p><a href="http://tutorial.world.edu/web-development/how-to-create-database-search-mysql-php-script/">PHP MySQL Database Search</a> by <a href="http://tutorial.world.edu">Tutorial.World.Edu</a></p>

    </body>

    </html>


    <?php

    //load database connection

    $host = "localhost";

    $user = "root";

    $password = "";

    $database_name = "databasename";

    $pdo = new PDO("mysql:host=$host;dbname=$database_name", $user, $password, array(

    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

    ));

    // Search from MySQL database table


    $search=$_POST['search'];

    $query = $pdo->prepare("select * from book where title LIKE '%$search%' LIMIT 0 , 10");

    $query->bindValue(1, "%$search%", PDO::PARAM_STR);

    $query->execute();


    $search=$_POST['search2'];

    $query = $pdo->prepare("select * from book where author LIKE '%$search%' LIMIT 0 , 10");

    $query->bindValue(1, "%$search%", PDO::PARAM_STR);

    $query->execute();


    // Display search result

    if (!$query->rowCount() == 0) {

    echo "Search found :<br/>";

    echo "<table style=\"font-family:arial;color:#333333;\">";

    echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Title Books</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Author</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;background:#98bf21;\">Price</td></tr>";

    while ($results = $query->fetch()) {

    echo "<tr><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo $results['title'];

    echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo $results['author'];

    echo "</td><td style=\"border-style:solid;border-width:1px;border-color:#98bf21;\">";

    echo "$".$results['price'];

    echo "</td></tr>";

    }

    echo "</table>";

    } else {

    echo 'Nothing found';

    }

    ?>


    Problem bei diesem Versuch: Währen dich beim Eingeben im unteren Suchfeld auch nur ein eindeutiges Ergebnis kriege, bekomme ich wenn ich im oberem feld was eingebe die Komplette Liste erneut


    bin ich einer Mission Impossible, also gar keine Möglichkeit oder kann man da doch was deichseln?


    Gibts es zum Beispiel die Möglichkeit, dass ich bei der suche ein "Suche in" dazu machen kann, also dass zusätzlich abgefragt wird in welcher Spalte gesucht wird?

    Oder gäbe es die Möglichkeit die Suchfunktion mit einem Dropdown Filter zu kombinieren? Also dass der Dropdown Filter erstmal die Spalte angibt in der gesucht werden soll und dann die Suche eingegeben wird?

  • Man könnte da auch mit Checkbxen machen . Wenn du zb Spalte 1,2,3 durchsuchen willst klickst du halt die Checkboxen an und er durchsucht dann die ganzen Spalten nach dein Suchwort. Das ist alles machbar und auch kein großer aufwand.


    EDIT .Wollte mal kucken ob ich das noch kann http://sebastian1012.bplaced.n…te_juli2018/sucheindb.php

    So habe ich mir das gedacht. Mit der Checkbox kannst du jetzt in einer Oder alle 3 Spalten suchen. Gib mal HUND oder sowas ein,der durchsucht sowas wie ein Duden.Eigentlich kannst du nach was suchen was du willst der findet fast immer was

  • Ja gut .Dann muß er die Checkbox wegmachen und ein Textfeld darein setzen ,das sollte dann ja nicht das problem sein.

    Oder beides zum aktivieren der Suche in der 2 Spalte bleibt die Checkbox da und bekommt beim anklicken ein Suchfeld dazu .Habe das mal oben im Script geändert.

  • Ist auch Blödsinn. So etwas sollte allein schon aufgrund der Usability auf PHP-Seite passieren.

    Wenn Suchfelder leer sind, werden diese einfach nicht in die WHERE-Klausel übernommen, das muss man nicht mit irgendwelchen Checkboxen den Benutzer entscheiden lassen.


    Beispiel

    Man hat 3 Suchspalten, also bedient man sich dreier Input-Felder:

    Code
    1. <input type="text" name="frmSearchFields[firstname]" placeholder="Vorname">
    2. <input type="text" name="frmSearchFields[lastname]" placeholder="Nachname">
    3. <input type="text" name="frmSearchFields[city]" placeholder="Stadt">

    PHP könnte dann beispielhaft so aussehen:

    nicht getestet, aber so in etwa würde ich das prinzipiell aufbauen.

    vorname, nachname und city sollten in dem Fall natürlich bereits die Spaltennamen sein.

  • Mal kurze frage dazu. Ich habe ja jetzt 3 Suchfelder da drinne.

    Ich weiß ja das man beim Speichern in der DB immer auf Injektionen achten soll mit

    Code
    1. htmlspecialchars($_POST['suche']);

    Da man in der Beispiel Db jetzt nix mehr reinspeichert und auch kein schädlicher Code drinne gespeichert ist , wollte ich wissen ob man bei so einer Suche auf Injektionen achten muß. Oder brauch man das hier nicht weil man die DB Daten ja nicht ändert und auch nur mit SELECT drauf zugreift ??

  • Auf Injektion sollte man immer achten, sobald man mit benutzerdefinierten Daten arbeitet, was in diesem Fall das Formular ist.

    Auch die WHERE-Klausel kann dahingehend manipuliert werden, dass ein DELETE im Anschluss ausgeführt wird.

    Auch PreparedStatements sollten immer verwendet werden.


    htmlspecialchars() is allerdings nicht für/gegen solche Injektions gedacht.

  • Was meinst du den das dieCheckboxen weiter angezeigt werden.

    Wenn man auf suche klickt wird man ja zum php Script weiter geleitet der dann die Ausgabe macht.

    Sollen dann da die Checkboxen trotzdem weiter zu sehen sein?

    Damit wieder weiter suchen kann wenn man will ,ohne die zurück Taste zu drücken ? Ich glaube da sollte wohl das Affenformular helfen.( Ich könnte aber auch falsch liegen ).

    Oder wie meinst du das? Wenn man jetzt nach der Suche wieder zurück geht sind die Boxen natürlich wieder da,aber das meinst du ja bestimmt nicht

  • Das Affenformular-Prinzip ist auch aus meiner Sicht hier das sinnigste.

    Gut,dann lag ich ja richtig.

    Pad kannst du nochmal kucken gehen ob du das so meinst.Habe das mal geändert. Fals das so richtig ist muß mal einer über den Code kucken weil ich den so nicht posten darf. Es könnte Sql Infektiös sein dswegen muß da erst einer rüber kucken ob das so richtig ist.


    Außerdem müßte man die Sql anfrage wahrscheinlich ändern,weil ich über if abfragen 3 verschiedene querys zu Auswahl habe.Ich denke das es bestimmt einfacher geht. Da ich aber noch nicht so weit bin sollte mal einer von den Fachmänner die Sql Abfrage anpassen Bzw ändern

  • Unter Berücksichtigung des Affenformular-Prinzips, würde ich den PHP-Teil in etwa auf diesem Schema aufbauen:

    Der HTML-Teil dazu sähe in etwa so aus:

  • ja das sieht um einiges kürzer aus als wie bei mir.

    Ich wahr mir bei mir auch gar nicht sicher ob man die query Zeile ein leeres input Textfeld rein setzen darf.

    Also ich meine wenn das Textfeld leer ist ob man dann trotzdem die Spalte abfragen darf. Deswegen habe ich über if bedingungen jedesmal eine andere query Zeile erzeugt ,wo man halt nur eine oder zwei oder 3 Spalten abfragt.

    Aber es scheint ja auch so zu gehen.