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

Sempervivum

Senior HTML'ler
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
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
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.
 

Runshak

Mitglied
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
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]
 

Runshak

Mitglied
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
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
 

AndreasB

Mitglied
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 :)
 

basti1012

Senior HTML'ler
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:

Runshak

Mitglied
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
 
Werbung:

Neueste Beiträge

Oben