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

[ERLEDIGT] multiple Suche

Runshak

Mitglied
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:
Werbung:
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.
 
Werbung:
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.
 
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]
 
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?
 
Werbung:
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
 
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 :)
 
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:
Werbung:
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
 
Zurück
Oben