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