verschiedene suchbegriffe in einem input-Feld
dobra
- perl
0 Carl der Eine0 dobra
0 Struppi0 Buzzer
Hallo,
Ich habe eine Artikelsuche für meinen Shop gebaut, die auch soweit funktioniert :D
Aber ich schaffe es nicht, daß bei Eingabe von mehr als einem Suchwort jedes Wort einzeln gesucht wird.
Also wenn jemand nach "Baumwolle Viscose" sucht, sollen alle Artikel in den "baumwolle" und "viscose" vorkommt gefunden werden.
So wie ich es jetzt habe, wird nur "baumwolle viscose" in genau dieser Schreibweise gefunden.
(Groß/Kleinschreibung ignorieren habe ich drin)
Mein Eingabefeld schaut so aus:
<input type="text" style="width:100px;" size="10" name="suchbegriff" value="Suchbegriff" onFocus="this.value=''" class="textfeld">
Suche/Ausgabe:
my $suchbegriff = ssp::get_var_form('suchbegriff'); #ließt Suchbegriffeingabe aus >> hier finde ich keine Möglichkeit, mehrere Wörter aufzuschlüsseln <<
....
....
$suchbegriff=~ tr/[A-Z]/[a-z]/;
.. Umlaute usw ..
.. div andere Abfragen nach Preis, Suchkategorie ...
if(!length($suchbegriff)) {$suchbegriff = " "}
my $count = ssp::readSQLData("SELECT DISTINCT ITEMID, PRICE, WISUCHEN, ARTIKEL, BTEXT, KATEG, DESCR FROM PY2_ITEM WHERE $printkategorie $printmarke (PRICE >= '$preisx' && PRICE <= $preisy) && (BTEXT LIKE'%$suchbegriff%' || WISUCHEN LIKE'%$suchbegriff%' || ARTIKEL LIKE'%$suchbegriff%' || DESCR LIKE'%$suchbegriff%')","ITEMID","PRICE","WISUCHEN","ARTIKEL","BTEXT","KATEG","DESCR");
...
...
mit (WISUCHEN LIKE'%$suchbegriff1%' || WISUCHEN LIKE'%$suchbegriff2%' || WISUCHEN LIKE'%$suchbegriff3%' usw) würde das funktionieren.
Die entsprechenden if-Anweisungen - wenn ein zweiters Wort usw. kann ich, aber ich finde einfach keine Lösung, Suchbegriffe die durch Leerzeichen getrennt eingegeben werden, als $suchbegriff1, $suchbegriff2, usw zu definieren.
Vermutlich gibt es eine ganz einfache Lösung, aber ich komme einfach nicht dahinter, wie ich es machen kann.
Kann mir da bitte jemand helfen oder einen Tipp geben?
Vielen Dank in Voraus
dobra
Hallo Dobra,
es gibt für deine Problemlösung zwei Möglichkeiten:
1.) Du splittest mit der „split”-Funktion die eingegebenen Begriffe in einzelne Felder (Trennzeichen = " ") und frägst diese mit einem „if” verbunden mit „or” ab, oder
2.) du verwendest bei der Abfrage einen regulären Ausdruck (siehe Rebuläre Ausdrücke).
Viel Erfolg.
1.) Du splittest mit der „split”-Funktion die eingegebenen Begriffe in einzelne Felder (Trennzeichen = " ") und frägst diese mit einem „if” verbunden mit „or” ab, oder
Danke - genau DEN Tipp habe ich gebraucht
Das wichtigste hab ich geschfft :)
my $suchwort = ssp::get_var_form('suchbegriff');
@suchw=split(' ',$suchwort);
$suchwort1 = $suchw[0];
$suchwort2 = $suchw[1];
$suchwort3 = $suchw[2];
Der Rest sollte kein Problem mehr sein (hoffentlich)
Mein Eingabefeld schaut so aus:
<input type="text" style="width:100px;" size="10" name="suchbegriff" value="Suchbegriff" onFocus="this.value=''" class="textfeld">
Das sind nervige Inputfelder. Wenn man sich vertippt hat, wird jedesmal nach dem man das Input verlassen hat, die Eingabe komplett gelöscht. Das ist niohct sonderlich userfreundlich.
Suche/Ausgabe:
my $suchbegriff = ssp::get_var_form('suchbegriff'); #ließt Suchbegriffeingabe aus >> hier finde ich keine Möglichkeit, mehrere Wörter aufzuschlüsseln <<
Du benutzt irgendein Modul, das du weder erwähnst noch kannst du vorrausetzen das es jeder kennt.
$suchbegriff=~ tr/[A-Z]/[a-z]/;
es gibt lc
my $count = ssp::readSQLData("SELECT DISTINCT ITEMID, PRICE, WISUCHEN, ARTIKEL, BTEXT, KATEG, DESCR FROM PY2_ITEM WHERE $printkategorie $printmarke (PRICE >= '$preisx' && PRICE <= $preisy) && (BTEXT LIKE'%$suchbegriff%' || WISUCHEN LIKE'%$suchbegriff%' || ARTIKEL LIKE'%$suchbegriff%' || DESCR LIKE'%$suchbegriff%')","ITEMID","PRICE","WISUCHEN","ARTIKEL","BTEXT","KATEG","DESCR");
Du könntest statt LIKE auch REGEXP nutzen, ich weiß aber nicht wie sich das auf die Performance auswirkt.
Also z.b. so REGEXP '$suchbegriff_1|$suchbegriff_2'
Struppi.
Hallo,
Ich habe eine Artikelsuche für meinen Shop gebaut, die auch soweit funktioniert :D
Aber ich schaffe es nicht, daß bei Eingabe von mehr als einem Suchwort jedes Wort einzeln gesucht wird.
Wozu auch, für Volltextsuche gibt es das Modul Text::Query, damit kann der Besucher suchen wie mit Altavista, also mit komplexen Suchausdrücken (AND, OR, NEAR, +, -, NOT), die auch geklammert sein können.
Viele Grüße vom Buzzer