Hallo,
ich habs geschafft - die Funktion tut das, was sie tun soll. Aber das sind seeehr viele Schleifen... ich kopiere mal den Code hier rein, vielleicht mag ihn ja mal jemand überfliegen. Falls das zu verwirrend ist, und niemand Lust hat, sich das anzusehen, kann ich das voll verstehen - ich bin sicher, es geht auch einfacher.
Vielleicht hat ja jemand eine Optimierungsidee?
Lg
Sven
if($_POST['search']) {
$search_string = strip_tags($_POST['search']);
// Länge des Strings ermitteln, wenn nötig auf 20 Zeichen begrenzen
$search_len = strlen($search_string);
if($search_len > 20) { $search_len = 20; }
// Prüfen ob Suchstring zu kurz
if($search_len < 3) {
$error[] = $error_tooshort;
}
// Nur weitermachen, falls keine Fehler vorliegen
if(count($error) == 0)
{
// String in Abschnitte unterteilen und in $search_substr[] speichern
for($i=0; $i < $search_len; $i++)
{
if(strlen(substr($search_string,$i,3)) >= 3)
{
$search_substr[] = substr($search_string,$i,3);
}
}
// UNION-Abfrage erzeugen
$sql = "";
for($i=0; $i<count($search_substr); $i++)
{
$sql .= "(SELECT name
FROM datenbank.test
WHERE name
LIKE '%".$search_substr[$i]."%')";
if($i < count($search_substr)-1) {
$sql .= " UNION ";
} else {
$sql .= " LIMIT 10";
}
}
// Abfrage durchführen: Für jeden Eintrag in der
// Datenbank wird geprüft, welche Teilstrings
// in den Eintrag hinein passen
$result = mysql_query($sql);
$num = mysql_num_rows($result);
if($num > 0)
{
while($row = mysql_fetch_array($result))
{
$j = 0;
for($i=0; $i<count($search_substr); $i++)
{
if(substr_count($row['name'],$search_substr[$i]) > 0)
{
$j++;
}
}
// In diesem zweidimensionalen Array werden
// gespeichert: Die Anzahl der Treffer und
// der dazugehörige Datenbank-Eintrag
$search_res[] = array($j,$row['name']);
}
} else
{
$error[] = $error_noresults;
}
// Array sortieren
rsort($search_res);
// Array ausgeben
for($i=0; $i<count($search_res); $i++)
{
for($j=0; $j<count($search_res[$i]); $j++)
{
echo $search_res[$i][$j];
}
}
}
}