phpbar.de logo

Mailinglisten-Archive

[php] Suchfunktion

[php] Suchfunktion

Guido Haeger GH-lists_(at)_ecora.de
Mon, 20 Nov 2000 15:31:09 +0100


Udo Mueller schrieb

> Es soll in der Form +auto -verkauf gehen so das alles was mit
> auto zu tun hat aber nicht mit verkauf kommt  (Wie eben bei
> allen suchmaschinen)
>
> Weis jemand wie ich das anstellen muß das dies auch funktionier?

Ja, Du mußt den Suchstring, den Du vom Client bekommst in SQL Umwandeln.
Ich hatte mal ansatzweise eine kleine Funktion dafür geschrieben.
Versteht ansatzweise folgende Operatoren " +, -, AND, OR" und zusätzlich
Phrasen.

Recyceltes Mail:

Nachfolgendes als Anfang mal schnell zusammengetippt. Das hat allerdings
noch einige gravierende Nachteile, u.a:

- kann keine Klammern auflösen, wodurch komplexere Statements nicht
möglich sind

- Fehlerbehandlungsroutinen fehlen vollständig

- standardmäßig wird per AND verknüpft


function generateDbQuery($table, $field, $string)
{
$string = preg_replace("= {2,}=", " ", trim($string));

preg_match_all("=((((AND )|(OR )|(NOT ))|([+-]))?((\"[^\"]+\")|([^\" ]))
+)=", $string, $back);
$query = "SELECT $field FROM $table WHERE";
$flag = 0;
$max = count($back[1]);

for($i = 0; $i < $max; $i++)
{
  $val = $back[1][$i];

  // debug-Ausgabe:
  // echo "|$val|<br>\n";

  if(preg_match("=^((AND )|(\+))\"?([^\"]+)\"?$=", $val, $matches))   {
  if($flag == 0)
  {
    $query .= " ($field LIKE '%$matches[4]%')";
  }
  else
  {
    $query .= " AND ($field LIKE '%$matches[4]%')";
  }
  }
  elseif(preg_match("=^((NOT )|(\-))\"?([^\"]+)\"?$=", $val, $matches))
{
  if($flag == 0)
  {
    $query .= " ($field NOT LIKE '%$matches[4]%')";
  }
  else
  {
    $query .= " AND ($field NOT LIKE '%$matches[4]%')";   }
  }
  elseif(preg_match("=^(OR )(.*)$=", $val, $matches))
  {
  if($flag == 0)
  {
    $query .= " ($field LIKE '%$matches[4]%')";
  }
  else
  {
    $query .= " OR ($field LIKE '%$matches[4]%')";
  }
  }
  else
  {
  if($flag == 0)
  {
    $query .= " ($field LIKE '%$val%')";
  }
  else
  {
    $query .= " AND ($field LIKE '%$val%')";
  }
  }
  $flag = 1;
}

return $query;
}

echo generateDbQuery("table", "field", 'sdffd +"A B" -C +D -"E F" AND
hurz NOT purz');


Ausgabe:

SELECT field FROM table WHERE (field LIKE '%sdffd%') AND (field LIKE '%A
B%') AND (field NOT LIKE '%C%') AND (field LIKE '%D%') AND (field NOT
LIKE '%E F%') AND (field LIKE '%hurz%') AND (field NOT LIKE '%purz%')

Guido Haeger




php::bar PHP Wiki   -   Listenarchive