phpbar.de logo

Mailinglisten-Archive

[php] verknuepfte suche

[php] verknuepfte suche

Andreas Kempf php_(at)_phpcenter.de
Tue, 23 Jul 2002 18:10:57 +0200


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