Zusammengesetzte Suchausdrücke

Cherrywine

Mitglied
Hallo,

ich arbeite mit WordPress samt dem Plugin Pods, womit man vom Backend aus Tabellen in der DB anlegen und befüllen kann, um für einen Kunden eine Datenbank zu realisieren. Die Suchfunktion (ist nicht die normale von WordPress) sieht momentan so aus:

PHP:
<?php 
if (isset($_GET["s"])) {
$result = addslashes($_GET["s"]); 
}
$Record = new Pod('inventar');
$Record->findRecords('id ASC', 15,
"t.feld1 LIKE '%$result%' OR 
t.feld2 LIKE '%$result%' OR
t.feld3 LIKE '%$result%' OR
echo $Record->showTemplate('uebersicht');
echo $Record->getPagination();
?>

Dadurch werden einzelne Suchbegriffe (etwa "Bonn") natürlich gut gefunden.

Jetzt soll das aber so umgestrickt werden, dass auch zusammengesetzte Suchausdrücke verwendet werden können, wie man es von Google her kennt: die Suche nach "Bonn Augsburg" soll alle Treffer auflisten, in denen die Begriffe Bonn und Augsburg auftauchen. Bislang findet das Ganze aber logischerweise nur Treffer, wo genau dieser String "Bonn Augsburg" drinsteht und nichts, wo die beiden Begriffe irgendwo im Text verstreut sind.

Wie kann ich das umsetzen? :confused:


Viele Grüße
cherrywine
 
Den Suchstring anhand der Leerzeichen teilen, [phpf]explode[/phpf], und dann für jeden Suchbegriff die Suchanfrage starten, mit einer Schleife z. B. [phpf]foreach[/phpf], die Ergebnisse zusammenfügen oder am besten alles an einen Array anhängen und wie gewohnt ausgeben.

Übrigens reicht [phpf]addslashes[/phpf] NICHT aus um SQL Injektionen zu verhindern!
Falls das dein Skript nicht automatisch macht, solltest du die Werte unbedingt filtern.
[phpf]mysqli_real_escape_string[/phpf] heißt die Funktion.
Erkundige dich am besten, ob die Datenbankklasse nicht auch so eine Funktion hat.
 
Hallo,

danke für deine Antwort! explode() ist genau das, was ich gesucht habe. :)

Mein Problem ist jetzt, dass ich ja nicht weiß, wie viele Suchausdrücke ein User eingibt. Momentan funktioniert meine Suche aber nur, wenn genau so viele Suchausdrücke verwendet werden, wie ich Positionen des Arrays abfrage.

Also, ich habe jetzt:
PHP:
<?php 
if (isset($_GET["s"])) {
$result = addslashes($_GET["s"]); 
$teil = explode(" ", $result); 
}
$Record = new Pod('inventar');
$Record->findRecords('id ASC', 15,
"t.feld1 LIKE '%$teil[0]%' OR t.feld1 LIKE '%$teil[1]%' OR t.feld1 LIKE '%$teil[2]%' OR 
t.feld2 LIKE '%$teil[0]%' OR t.feld2 LIKE '%$teil[1]%' OR t.feld2 LIKE '%$teil[2]%' OR 
t.feld3 LIKE '%$teil[0]%' OR t.feld3 LIKE '%$teil[1]%' OR t.feld3 LIKE '%$teil[2]%'"); 
echo $Record->showTemplate('uebersicht');
echo $Record->getPagination();
?>
... und nur, wenn drei Wörter eingegeben werden, stimmt die Ausgabe. Ansonsten werden alle Seiten aufgelistet. Mh.
Wie genau meinst du das mit dem foreach hier?

Viele Grüße
Cherrywine
 
Hallo,

danke für den Tipp; bei der Volltextsuche scheitere ich momentan an der Syntax. Via PHPMyAdmin habe ich den entsprechenden Felder einen Fulltextindex zugewiesen, aber wie muss jetzt die Suchfunktion selber aussehen?

Die beiden Varianten hier funktionieren schon mal nicht:
PHP:
$Record->findRecords('id ASC', 15, "MATCH (t.feld1) AGAINST ('%$teil[0]%')");

PHP:
$Record = 'SELECT feld1 FROM wp_pod_tbl_inventar WHERE MATCH (feld1) AGAINST ('%$teil[0]%')';


Viele Grüße
Cherrywine
 
...aber wie muss jetzt die Suchfunktion selber aussehen?

Hallo,

jetzt habe ich dir doch schon ganz konkret die Lösung genannt und sogar verlinkt. Wieso nimmst Du dir dann nicht mal 10 Minuten Zeit und liest die Erklärungen und Anwendungsbeispiele durch (auch und vor allem die User Kommentare, die oft sehr gute, praxisorientierte Lösungen beinhalten)? Da wird doch alles erklärt was man wissen muss und sollte was unklar sein, weisst Du ja jetzt nach was Du konkret googlen kannst.

Oder möchtest Du es gar nicht selbst lösen, sondern suchst nur einen Dummen, der dir deine Arbeit abnimmt und eine Lösung auf dem silbernen Tablett präsentiert? :confused:
 
@phpBuddy Er hat nach Hilfe und nicht nach einer fertigen Lösung gefragt. Also was soll dieser Ton?


Ich würde bei der Lösung von Felix bleiben und die eingegebenen Suchbegriffe mittels explode in ein Array übertragen. Mit der COUNT Funktion kannst du die Anzahl der eingegebenen Suchbegriffe ermitteln und damit dann eine Schleife bilden.

PHP:
$teil = EXPLODE(" ", $result);

$sql = "SELECT CONCAT(feld1, " ", feld2, " ", feld3) AS feld FROM tabelle WHERE feld LIKE '%" .$teil[0] ."%'";

FOR ($a = 1; $a < COUNT($teil); $a++) {
   $sql = $sql ." OR feld LIKE '%" .$teil[$a] ."%'";
}

Die einzelnen Felder der Tabelle würde ich mit CONCAT zu einem Feld zusammenfassen. Damit sparst du dir die Prüfung jedes einzelnen Feldes.
 
@phpBuddy Er hat nach Hilfe und nicht nach einer fertigen Lösung gefragt. Also was soll dieser Ton?

Der Ton deswegen, weil er sich offensichtlich nicht mal ein paar Minuten Zeit genommen hat um die angebotene Hilfe, in Form der verlinkten Doku mit Erklärungen und Anwendungsbeispielen, anzuschauen. Hätte er das gemacht, hätte er nicht versucht mit %-Operatoren als Platzhalter zu arbeiten. Und selbst als das nicht funktioniert hat er nicht mal in die Doku geschaut um sich zu versichern, sondern ist direkt wieder in's Forum gekommen um "Hilfe-Nachschlag" zu holen. Genau dieses Verhalten meine ich, wenn ich von mangelnder Eigeninitiative spreche.


Ich würde bei der Lösung von Felix bleiben und die eingegebenen Suchbegriffe mittels explode in ein Array übertragen. Mit der COUNT Funktion kannst du die Anzahl der eingegebenen Suchbegriffe ermitteln und damit dann eine Schleife bilden.

PHP:
$teil = EXPLODE(" ", $result);

$sql = "SELECT CONCAT(feld1, " ", feld2, " ", feld3) AS feld FROM tabelle WHERE feld LIKE '%" .$teil[0] ."%'";

FOR ($a = 1; $a < COUNT($teil); $a++) {
   $sql = $sql ." OR feld LIKE '%" .$teil[$a] ."%'";
}

Die einzelnen Felder der Tabelle würde ich mit CONCAT zu einem Feld zusammenfassen. Damit sparst du dir die Prüfung jedes einzelnen Feldes.

Die LIKE-Variante ist die schlechteste die man für viele bis unbestimmte Suchwörter/Kriterien verwenden kann. Wieso das für mehrere/viele Suchwörter, ganz besonders mit vielen Datensätzen, so schlecht ist, erspare ich mir hier zu erklären. Dazu gibt es mehr als genug Info per Google und auch die Doku hält sehr viele Informationen zu diesem Thema bereit.

Sollte meine oben angebotener Lösungsvorschlag oder mein Kommentar falsch rüber gekommen sein, so bitte ich das zu entschuldigen. Nehmt einfach was ihr für richtig haltet und ignoriert meine vorherigen Beiträge. ;)
 
Für eine volle Suchfunktion ist natürlich die Volltextsuche die beste und vorallem performanteste Variante, allerdings eben auch die am schwierigsten umzusetzende.

Dass man die Volltextsuche bevorzugen sollte, hat phpBuddy ja schon erwähnt.
 
Zurück