Rolf B: Suchmaschine in DB

Beitrag lesen

Hallo PHP-Neuling,

die Grundsatzfrage ist natürlich: Ist deine DB für diese Anfrage richtig strukturiert? Eine Tabelle mit 80 Spalten hat schon leichte Normalisierungs-Smells, aber um zu wissen ob das deine Tabelle ist, die da müffelt, oder doch die Kartoffeln hinter mir im Homeoffice-Keller, dazu müsstest Du uns deine Datenstruktur offenlegen 😉

Die nächste Frage ist: Wenn der Anwender mehr als ein Suchfeld ausfüllt, ist das dann eine UND- oder eine ODER-Suche?

Und die dritte Frage: Warum überhaupt mehrere Suchfelder? Google sucht ja auch nicht über Suchfelder, sondern es sucht Freitext. Eine Freitextsuche ist natürlich nicht so einfach gebaut, und sie sollte auch nicht 1:1 auf die Datenbank gehen, sondern auf einen Suchindex, also eine dafür optimierte Tabelle.

Bleiben wir für den Anfang mal bei den 80 Spalten, von denen Du 24 durchsuchen willst, und 24 zugehörige Eingabefelder. Du hast in deinem Beispiel-SQL OR geschrieben, also soll es wohl eine ODER Verknüpfung werden.

In solchen Fällen baut man den SQL Befehl dynamisch zusammen. Du hast einen Rumpfbefehl

$sql = "SELECT ID, NAME, STRASSE, POPO FROM Tabelle1 WHERE ";

und baust nun für jedes ausgefüllte Suchfeld den entsprechenden Teil der WHERE Klausel auf. mysqli_real_escape_string nicht vergessen!

$bedingungen = ARRAY();

if (isset($_POST['STRASSE'])) {
   $bedingungen[] = "STRASSE LIKE '" 
                  . mysqli_real_escape_string($db, $_POST['STRASSE'])
                  . "%'";
}
// etc etc etc

// Und zum Schluss klebst Du alles mit OR zusammen und hängst es an's SQL an:
$sql .= implode(" OR ", $bedingungen);

Und die Query jagst Du dann auf die DB. Ich habe es jetzt so aufgeschrieben, dass ich an jede Eingabe ein % anhänge. Da musst Du gucken wie Du es haben willst. Soll der Anwender die Wildcards selbst eingeben, möchtest Du auf der Oberfläche einen Schalter für "ist gleich" und "enthält" haben - danach richtet sich die Aufbereitung des Feldinhaltes für die DB Suche.

Das SQL prüft dann nur die Spalten, für die auch was eingegeben wurde. Bei vielen Rows kann es aber trotzdem etwas dauern, die DB macht hier einen Table Scan.

Rolf

--
sumpsi - posui - obstruxi