[ERLEDIGT] multiple Suche

  • Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Runshak

Mitglied
7 April 2020
90
4
8
32
Hallo,

ich habe bisher zwar schon was mit SQL/PHP und einem Suchenfeld gemacht, bisher konnte man jedoch immer nur einen einzigen Begriff suchen.

Bsp:

$search = (isset($_POST["suche"]) && is_string($_POST["suche"])) ? $_POST["suche"] : ""; $search2 = (isset($_POST["suche2"]) && is_string($_POST["suche2"])) ? $_POST["suche2"] : ""; $search3 = (isset($_POST["suche3"]) && is_string($_POST["suche3"])) ? $_POST["suche3"] : "";

$sql="SELECT * FROM products WHERE PName='$search' OR ImagePath='$search' OR ImageName='$search3' OR PNummer='$search2' OR PPreis='$search' ";

Mein Wunsch wäre folgendes:

Ich habe eine Datenbank mit Gebäuden. Jetzt suche ich aber nach einem bestimmten Gebäude, welches ich angezeigt haben möchte.

bisher konnte ich nur (zb.) "Einfamilienhaus" suchen

Jetzt würde ich aber gerne "Einfamilienhaus, Pink, Garten" suchen.

in meiner bisherigen Suche war es zwar möglich, dass der Suchbegriff aus zwei getrennten Wörtern/Zeichen besteht wie zb. "Produkt 1", aber man kann nicht nach "Produkt 1, Produkt 2" suchen.

Mit den drei $search Variablen habe ich das multiple suchen, was ich haben möchte so ein bisschen gemacht. Nur halt auf drei Suchfelder aufgeteilt. Ich hätte gerne alles in einem Suchfeld.

Ich hoffe ihr könnt mir weiterhelfen
 
Zuletzt bearbeitet:

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.515
479
83
68
Das ließe sich selbstverständlich machen, aber es gibt einiges was dagegen spricht:
  • Du müsstest dann berücksichtigen, dass der Benutzer eine Fehleingabe macht, z. B. Semikolon statt Komma verwendet oder sich nicht an die Reihenfolge hält und z. B. "Einfamilienhaus, Garten, Pink" eingibt. Das ließe sich zwar alles abfangen aber würde die Sache unnötig kompliziert machen.
  • Um die Eingabe benutzerfreundlicher zu machen und Fehleingaben auszuschließen könntest Du Auswahlfelder (selects) statt einfachen Eingabefeldern verwenden. Das ginge nicht, wenn alle Suchbegriffe in einem Eingabefeld eingegeben würden.
 

Runshak

Mitglied
7 April 2020
90
4
8
32
Naja das ganze ist nur Lokal für mich selbst gedacht. Wird niemals online gehen. Muss also keine Fehler abfangen. Würde es also einfach mit Komma trennen.
 

Sempervivum

Senior HTML'ler
18 Oktober 2016
2.515
479
83
68
Das ist dann natürlich etwas anderes. Mit PHP-explode kannst Du den Eingabestring problemlos zerlegen und die Datenbankabfrage dann so machen, wie Du sie jetzt hast.
 
  • Like
Reaktionen: Runshak

Runshak

Mitglied
7 April 2020
90
4
8
32
Also fürs erste hat das ganz wunderbar geklappt. Nur die SQL Abfrage muss ich jetzt dahingehend anpassen, dass die Reihenfolge beliebig sein kann und auch die Menge der Daten

ich habe Bsp. 1 von https://www.php.net/manual/de/function.explode.php verwendet.




<?php $search = (isset($_POST["suche"]) && is_string($_POST["suche"])) ? $_POST["suche"] : ""; $teile = explode(",", $search) ?> <form action = "Index.php" method = "post"> <input type="text" name="suche" class="insearch" placeholder="Search"> <br> <br> <p class="pLog"> <button class="buttonLog" name="submit" type="submit"> Search </button> </p> </form> <?php $sql="SELECT * FROM buildings WHERE Type='$teile[0]' OR Color='$teile[1]' OR Garden='$teile[2]' OR Size='$teile[3]' OR Rooms='$teile[4]' "; $query=mysqli_query($conn, $sql); ?>

Wenn ich nur nach $sql="SELECT * FROM buildings WHERE Titel='$teile[0]' "; suche funktioniert es wie gewünscht

bei dem langen $sql bekomme ich eine Undefined offset: 1 Fehlermeldung. Ich steig da nicht ganz durch wie ich die SQL Abfrage umstellen muss, damit ich was sinnvolles mit dem Array verknüpfen kann.
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.664
196
63
Du kannst nicht einfach $teile[0], $teile[1], $teile[2] und $teile[4] verwenden. Wenn du nur zwei Begriffe eingegeben hast, dann hast du nur Werte in $teile[0] und $teile[1]
 
  • Like
Reaktionen: Runshak

Runshak

Mitglied
7 April 2020
90
4
8
32
Okay, ich habe die Sache nochmal umgebaut und habe jetzt ein funktionierendes Resultat bekommen. Klar man kann es noch verbessern und zum Beispiel Abfragen abfangen, welche nur einen einzelnen Buchstaben enthalten oder dergleichen...

Code:
    $teile = explode(",", $search);
    $teil1 = "";
    $teil2 = "";
    $teil3 = "";
    $teil4 = "";
    $teil5 = "";

for ($i = 0; $i < sizeof($teile); $i++) {
        $teil1 .= "`Type` LIKE '%" . $teile[$i] . "%'";
        $teil2 .= "`Color` LIKE '%" . $teile[$i] . "%'";
        $teil3 .= "`Garden` LIKE '%" . $teile[$i] . "%'";
        $teil4 .= "`Size` LIKE '%" . $teile[$i] . "%'";
        $teil5 .= "`Rooms` LIKE '%" . $teile[$i] . "%'";

        if($i <  (sizeof($teile) - 1 ))
        {
            $teil1 .= "OR";
            $teil2 .= "OR";
            $teil3 .= "OR";
            $teil4 .= "OR";
            $teil5 .= "OR";
        }
    }
   
   
   
    $sql="SELECT * FROM mymovies WHERE " .$teil1 . "OR" . $teil2 . "OR" . $teil3 . "OR" . $teil4 . "OR" . $teil5;

Danke für eure Anregungen und Tipps. Manchmal braucht man einfach eine weitere Sichtweise oder nen kleinen Hinweis. Ich wünsche euch noch frohe Weihnachten und bleibt gesund!


PS.:

Kann mir jemand noch erklären warum ich so viele verschiedene Hochkommas etc in dem folgenden Part benötige?

$teil1 .= "`Type` LIKE '%" . $teile[$i] . "%'";

Die " sind klar. aber die Hochkommas `Type` musste ich erstmal auf der Tastatur suchen. Ist das was spezielles in PHP für das SQL statement oder was genau wird damit erreicht?
 

m.scatello

Senior HTML'ler
15 Februar 2017
1.664
196
63
Ist das was spezielles in PHP für das SQL statement oder was genau wird damit erreicht?
Datenbanken haben einen Satz reservierter Wörter, die man nicht als Tabellen- oder Spaltennamen benutzen darf. Es kann aber vorkommen, dass man z.B. einen Spaltennamen benutzen will, der zu den reservierten Wörtern gehört.

Beispiel:
Du hast ein Datum und möchtest jetzt die Tabellenspalte date nennen. Dummerweise gehört date zu den reservierten Wörtern. Also würde

select date from tabelle

zu einem Fehler führen. Das kann man aber umgehen, in dem man den Spaltennamen zwischen Backticks schreibt

select `date` from tabelle

und somit erkennt die Datenbank, dass du einen Namen meinst und nicht die date-Funktion

PS: bei manchen Datenbanken gehört date mittlerweile nicht mehr zu den reservierten Wörtern
 
  • Like
  • Love
Reaktionen: Runshak und AndreasB

AndreasB

Mitglied
24 März 2019
34
2
8
Diese Dinger nennen sich "Backticks" oder auch "Backquotes" und sind dafür da, Leerzeichen oder auch reservierte Wörter in oder als Tabellen und Spaltennamen zu verwenden.
Schau mal hier: https://stackoverrun.com/de/q/301067

Übrigens:
Sie sind keine Eigenart von PHP. (hier gehören sie eigentlich zu SQL, was man auch daran erkennen kann, dass die innerhalb des Strings stehen.)
In PHP werden sie in einen anderen Zusammenhang verwendet.
In Javascript werden sie seit ES6 auch in Template Strings verwendet.

edit: ups, m.scatello war schneller :)
 
  • Love
Reaktionen: Runshak

basti1012

Senior HTML'ler
26 November 2017
1.687
177
63
Minden
basti1012.de
Ich möchte mal etwas Code in Raum werfen.
Den Code aus post 8#, kann man das nicht so machen ?
PHP:
<?php

$arr=$_POST['search']='opel,rot,kp,123,3';
$val = array_filter(explode(',',$arr));
$spa = array_filter(['Type' => FILTER_FORCE_ARRAY,
        'Color' => FILTER_SANITIZE_STRING,
        'Garden' => FILTER_SANITIZE_STRING,
         'Size' => FILTER_SANITIZE_STRING,
        'Rooms' => FILTER_SANITIZE_STRING ]);

$alles = array_map(function($value, $key) {
                              return "`$key` like '%$value%'";
                           }, $val, array_keys($spa));
$query = 'SELECT * FROM `mymovies` WHERE ' . implode( ' or ', $alles );// * durch Spaltennamen ersetzen

print_r($query);//  SELECT * FROM `mymovies` WHERE `Type` like '%opel%' or `Color` like '%rot%' or `Garden` like '%kp%' or `Size` like '%123%' or `Rooms` like '%3%'


?>
Ich sage dazu jetzt PSYDO Code weil ich nicht ganz genau weiß ob das so der richtige weg ist.
Ich hoffe die Php'ler wissen so ungefähr wie ich das meine ?
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Runshak

Runshak

Mitglied
7 April 2020
90
4
8
32
Ich danke euch sehr für die super Erklärungen!

Das Projekt tut zur Zeit genau das, was er tun soll. Eventuell wird es in Zukunft nochmal erweitert werden, jedoch fehlt augenblicklich die Zeit mich privat darum zu kümmern. Ich wünsche euch nen guten Rutsch ins neue Jahr. Bleibt gesund und ich hoffe, dass ich weiterhin auf eure Hilfe hier im Forum zählen kann! Ihr (und auch die anderen Member hier im Forum) seid eine super Hilfe!
Man sieht sich im neuen Jahr