Mailinglisten-Archive |
On Tue, 23 Jul 2002 15:21:46 +0200, "Ringo Großer" <swek_(at)_gmx.net> wrote: >ein '...WHERE benennung LIKE %wort1%wort2%' findet ergo nicht >alles, was intelligentererweise zu finden wäre. > >hat jemand einen ansatz, wie man das löst, ohne auf die wortreihenfolge >fixiert zu sein und am besten noch über mehrere spalten einer datenbank >(benennung, hersteller, beschreibung)? > >freu mich auf vor- oder nachschläge. Nunja, du kannst ja so vorgehen, dass du dir erstmal das gewuenschte SQL-statement schreibst und danach ueberlegst, wie du das parametrisieren kannst. Letzlich ist das alles dann in ein, zwei for/next-schleifen und mit ein wenig if/else zu realisieren. Unten ist ein Snippet, was je nach Anzahl der Woerter, der definierten Suchfelder und +/- fuer ein- und auszuschliessende Begriffe die where-clause bastelt. Das ganze ist ein Ausschnitt aus einer Funktion, wobei die $cfg-Vars aus einer Konfig-Datei kommen. $saSearch[word] kommt aus einem Formular. $saSearch[word] = "foo bar -foofoo +foobar"; $cfgSearchAnd = 0; $cfgSearchFields = array("feld1","feld2","feld3"); // Hier gehts nun los: $svSQL = " where 1=1 "; // Klammer auf ** open bracket $svSQL .= "\n and (flag_display=1 "; $saSearchWords = explode(" ",$saSearch[word]); for ($i=0;$i<count($saSearchWords);$i++) { if ($i==0) { $svSQL .= "\n and ("; } elseif (substr($saSearchWords[$i],0,1) == "+") { $saSearchWords[$i] = substr($saSearchWords[$i],1, strlen($saSearchWords[$i])); $svSQL .= "\n and ("; } elseif (substr($saSearchWords[$i],0,1) == "-") { $saSearchWords[$i] = substr($saSearchWords[$i],1, strlen($saSearchWords[$i])); $svSQL .= "\n and not ("; } elseif ($cfgSearchAnd) { $svSQL .= "\n and ("; } else { $svSQL .= "\n or ("; } // Teil fuer alle Felder for ($x=0;$x<count($cfgSearchFields);$x++) { // Beim ersten mal kein "or" davor // No " or " in the first case if ($x==0) $svSQL .= "\n " . $cfgSearchFields[$x] . " like '%$saSearchWords[$i]%'"; else $svSQL .= "\n or " . $cfgSearchFields[$x] . " like '%$saSearchWords[$i]%'"; } // Klammer zu ** close bracket $svSQL .= ")"; } // Klammer zu ** close bracket $svSQL .= ")"; HTH, Andreas -- [amalesh] * andreas kempf * müggenkampstr 7a * 20257 hamburg http://www.amalesh.de * info_(at)_amalesh.de * tel: 040-401744412
php::bar PHP Wiki - Listenarchive