MySql Stichwortsuche ?

grauercorsar

Grünschnabel
Hallo,

ich habe ein Problem. Habe auch schon mehere Scriptcodes und Foren durchsucht, aber immer noch nicht das richtige gefunden.

Kurz zur Vorgeschichte.
Ich schreibe eine Firmendatenbank oder ein ähnliches elektr. Branchenbuch.
In diesem Branchenbuch können sich Firmen mit Ihrem Namen, Anschrift, url, Ansprchpartner... eintragen. das klappt auch alles und ist auch soweit fertig.

User oder auch Kunden sollen nun die Datenbank abfragen können.

Dies wollte ich mittels einer Stichwortsuche machen.

der User gibt einen oder mehere Begriffe in das Formular ein und alle Firmen mit den angegebenen Stichworten sollen ausgegeben werden.

Mit einem Stichwort ist das kein Problem, das klappt alles.

Doch ich schaffe es einfach nicht, dass man zwei oder auch mehrere Stichworte eingeben kann und dann genau nur der Firmenname ausgegeben wird, der nur diese beiden Stichworte enthält.


ich habe das erstmal so gelöst, um die Stichworte aufzsplitten:

PHP:
$such_array = explode(' ',$searchterm);  

for($i=0; $i<count($such_array); $i++){
  $selectlinks="SELECT * from firma where beschreib like '%$such_array[$i]%' order by firma DESC limit $start,$numentries";

Nun ist aber das Problem bei mir, dass wenn zwei oder mehrere Firmen den gleichen Inhalt in Ihrem Namen haben, dass diese dann ausgegeben werden.

Beispiel:

Firmen in Datenbank

Seniorenservice Max Mustermann
Gartenpflegegestaltung Hans Mustermann
Firma Heinz Mustermann

existieren. gesucht wird mit den Worten: garten mustermann

Dann würden bei meinem Code alle Firmen auftauchen.

gebe ich als suchworte mustermann garten

gibt er nur

Gartenpflegegestaltung Hans Mustermann

aus, da garten der zuletzt abgefragte Begriff in dem Array ist und somit wohl als letztes zählt, Denke ich mal ? :(

aber so soll es ja nicht sein, der user soll ja jede beliebige reihenfolge der stichworte eingeben können.

Es muss also noch eine andere Lösung geben um die suchbegriffe anders sla suchstring aufzuschlüsseln als in einem array? Oder vielleicht war mein Ansatz schon richtig und es fehlt nur noch eine Kleinigkeit?

Ich freue mich über jede Antwort!

Beste Grüße
 
Ich würde es wiefolgt einmal versuchen:
PHP:
$searchterm = str_replace(" ", "%", $searchterm);
$sql = "SELECT * FROM firma WHERE beschreib LIKE '%" . $searchterm . "%' ORDER BY firma DESC LIMIT $start,$numentries";

Ich hoffe dir damit geholfen zu haben.

Gruß
Marvin
 
Zuletzt bearbeitet:
Dank Dir erstmal,

aber leider klappt es immer noch nicht so richtig,

nun gibt das script leider die andere Reihenfolge als oben aus:

bei mustermann garten gibt er leider nichts aus.

was nun?

ich weiß nicht warum?

vielleicht weil garten nun am Ende steht aber in der Datenbank nicht am Ende?

Gibts noch andere Möglichkeiten die Stichworte auf zusplitten?
 
Du könntest auch mit einer OR-Anweisung einfach beide Varianten überprüfen, also Wort1%Wort2 und Wort2%Wort1. Allerdings wird dies bei drei oder noch mehr Suchbegriffen ziemlich kompliziert. Ein kleiner Algorithmus wirkt da sicher Wunder. :)
 
PHP:
function searchstring ($searchterms)
{
   foreach ($searchterms as $searchterm)
   {
       foreach ($searchterms as $srchterm)
       {
          if ($searchterm != $srchterm)
	  {
	     $o[] = "'%" . $searchterm . "%" . $srchterm . "%'";
	  }
       }
   }
   return $o;
}

$array = array(a,b,c);
$output = searchstring($array);
foreach ($output as $moeglichkeit)
{
   $test = (!empty($test)) ? $test . " OR spaltenname LIKE " . $moeglichkeit : "spaltenname LIKE " . $moeglichkeit;
}
echo "<b>" . $test . "</b>";

Das gibt bei mir folgendes aus:
spaltenname LIKE '%a%b%' OR spaltenname LIKE '%a%c%' OR spaltenname LIKE '%b%a%' OR spaltenname LIKE '%b%c%' OR spaltenname LIKE '%c%a%' OR spaltenname LIKE '%c%b%'

Ich glaube das wären alle Möglichkeiten für die Stichworte "a", "b" und "c" :)

Ist wahrscheinlich nicht die eleganteste Lösung, aber sie sollte funktionieren.
Wenn jemand eine bessere Lösung hat, dann soll er sie uns nicht vorenthalten. ;)
Würde mich echt mal interessieren, wie's auf 'großen' Seiten gemacht wird.

Gruß
Marvin

P.S.: Wenn ich so drüber nachdenke, glaube ich mit AND wäre es kürzer :)
 
Zuletzt bearbeitet:
Hallo grauercorsar,
so wie ich das verstehe willst Du eine Abfrage, die alle Firmen liefert, bei denen JEDES der Suchwörter irgendwo in "beschreib" vorkommen. Das SQL-Statement für Dein Beispiel müsste also so aussehen:
Code:
SELECT
 *
FROM
 firma
WHERE
     bescheib LIKE '%garten%'
 AND beschreib LIKE %mustermann%'
LIMIT
 ...usw.
Dein Ansatz mit dem Aufspalten des Suchstrings in ein Array war schon ganz richtig. In der Schleife musst Du dann das SQL-Statement zusammenbasteln, etwa so:
PHP:
$such_array = explode(' ',$searchterm); 

$sql = "SELECT * FROM firma WHERE";

for($i=0; $i<count($such_array); $i++) {
	$sql .= (($i > 0) ? " AND " : " ");
	$sql .= ("beschreib LIKE '%" . $such_array[$i] . "%'");
}

$sql .= " ORDER BY firma DESC LIMIT $start,$numentries";
Danach solltest Du das fertige Statement in $sql haben.
Gan leicht ließe sich auch realisieren, dass der User bestimmen kann, ob mit UND oder ODER gesucht werden soll (ob also alle Suchwörter vorkommen sollen, oder ob es reicht, wenn eines der Wörter vorkommt. Einfach in der Zeile
$sql .= (($i > 0) ? " AND " : " ");
das Einsetzen von "AND" oder "OR" von einer Bedingung abhängig machen.

Soweit mein Tipp. Hoffe das klappt (hab's nicht getestet).

Viele Grüße,
Martin
 
Hallo an alle.

Vielen dank an die vielen und auch guten Lösungsansätze und Hilfestellungen!

Ihr habt mir alles sehr geholfen.

ich habs nach langem basteln nun so hinbekommen:

PHP:
$searchterm = addslashes($searchterm);
                       $searchterm = str_replace(",", "",$searchterm);
                        $searchterm = str_replace(";", "",$searchterm);
                       $searchterm = str_replace("+", "",$searchterm);
                        $searchterm = str_replace("-", "",$searchterm);
                        $searchterm = str_replace("%", "",$searchterm);
                        $searchterm = trim($searchterm);

Für die exakte Wortwahl:
PHP:
 $selectlinks = "SELECT * FROM firma WHERE beschreib LIKE '%" . $searchterm . "%' AND aktiv='1' ORDER BY firma DESC LIMIT $start,$numentries";
 $selectlinks2=mysql_query($selectlinks) or die(mysql_error());
...


Für die beliebeige Wortwahl, dass jedes Wort auch ennthalten sein kann:

PHP:
$such_array = explode(' ',$searchterm);

for($i=0; $i<count($such_array); $i++){
$selectlinks = "SELECT * FROM firma WHERE stich LIKE '%$such_array[$i]%' AND aktiv='1' and plz='$plz' ORDER BY firma DESC LIMIT $start,$numentries";
    }
 $selectlinks2=mysql_query($selectlinks) or die(mysql_error());
...

Und die engrenzungen nach denen er suchen soll und sortieren soll habe ich mit if() uns else if () Anweisungen gemacht, welche sich der User dann über radiobuttons auswählen kann.

Achso, da war ja noch was, hat einer von euch vielleicht ne Idee oder nen Code, wie ich aus zwei Radiobuttons mit einem Wert ein Radiobutton als Vorgabe mache? Ich meine, wenn ich ein Formular start, dass dann ein Radiobutton ständig ausgewählt ist, so zu sagen als default. Und der User auch ohne Wahl eine Standartsuche macht.

Gibts da nen Code in HTML für Formulare oder so ?

Beste Grüße
 
Hallo grauercorsar,
offensichtlich stehe ich ein bischen auf der Leitung. Ich kann nicht ganz nachvollziehen, warum Dein Code funktionieren soll.

Der zweite Teil (exakte Wortwahl) kann doch nur funktionieren, wenn $searchterm nur einen Begriff enthält oder wenn bei mehreren Begriffen diese in exakt der richtigen Reihenfolge eingegeben wurden und auch im Datensatzfeld genau hintereinander stehen.

Den dritten Code-Teil (beliebige Wortwahl) kann ich gar nicht begreifen. Was Du da in $selectlinks erhältst ist doch nur ein SELECT der nach dem letzten Suchwort in $serchterm sucht.

Funktioniert das wirklich so wie du wolltest?

Grüße,
Martin
 
Danke Silent Warrior.

Ja Resalb, mit der beliebeigen Wortwahl hast Du recht, aber ich lasse es jetzt so.

Damit muss ich halt leben. Wüsste nicht wie es sonst anders noch eingrenzen sollte. und bei der Belibigeb Wortwahl ist es doch eigentlich auch egal. Darum ist es ja auch eine beliebige Wortwahl.

Die exakte Wortwahl ja alles exakt aus. Eigentlich funktioniert die Suchabfrage so.

Bei weiteren fragen einfach posten oder mailen. Hab nen offenes Ohr.

Danke euch allen für die tatkräftige Unterstützung

Beste Grüße
 
Zurück