Zur Navigation

Datenbanksuche [7]

61 Jörg Kruse

Du benötigst eine Abfrage, in der du die Suchbedingungen mit OR verknüpfst:

WHERE title LIKE '%Eragon%' OR title LIKE '%Drachenreiter%'

Die Suchphrase musst du entsprechend vorher bearbeiten, so dass die Leerzeichen als Trennzeichen entsprechend ersetzt werden.

03.11.2008 12:48

62 Tilman

Hallo Jörg!

Leider habe ich davon keine Ahnung.
Weißt du, wo es dazu eine gute Seite gibt oder könntest du vielleicht zeigen, wie es geht?

14.12.2008 13:50

63 Jörg Kruse

Als erstes behandelst du die Suchabfrage mit einem trim() und einem
mysql_real_escape_string()

Für das Ersetzen der Leerzeichen reicht die Funktion str_replace(). Die Leerzeichen ersetzt du dabei durch den String "' OR title LIKE '%".

Danach musst du dann nur noch an den Anfang ein "WHERE title LIKE '" anfügen und ans Ende ein "%'" und schon hast du den für die SQL-Abfrage benötigten String.

14.12.2008 17:33

64 Tilman

Vielen Dank!

So, habe ich gemacht (zum Teil). Funktioniert auch. Was ich aber nicht verstehe, sind die Funktionen:

Zitat von Jörg
Als erstes behandelst du die Suchabfrage mit einem trim() und einem
mysql_real_escape_string()

Was machen diese Funktionen. Sind die wichtig? Schließlich funktionierts bei mir ja auch ohne diese Funktionen.

17.12.2008 17:29

65 Jörg Kruse

Ja, insbesondere mysql_real_escape_string() ist wichtig, um SQL-Injection zu verhindern. trim() benötigst du, um überflüssige Leerzeichen zu entfernen. Beide Funktionen werden im PHP Handbuch detailliert erklärt (oben unter "search for" eingeben).

17.12.2008 21:59 | geändert: 17.12.2008 22:00

66 Tilman

Hallo Jörg!

Muss ich es dann einfach so schreiben?
$suchwort == trim($suchwort);

$suchwort = str_replace(" ", "%' OR title LIKE '", $suchwort);


$getbooks = mysql_query("SELECT COUNT(*) FROM datenbank WHERE title LIKE '$suchwort%'",
mysql_real_escape_string($suchwort));
list($booknum) = mysql_fetch_row($getbooks);

22.12.2008 18:05

67 Jörg Kruse

mysql_real_escape_string() musst du vor der Ersetzung von " " durch "%' OR title LIKE '" anwenden, da letzteres SQL-Sonderzeichen enthält, die nicht maskiert werden sollen.

PS:
da fehlt auch noch ein "%":

$suchwort = str_replace(" ", "%' OR title LIKE '%", $suchwort);

22.12.2008 18:12

68 Tilman

Hallo Jörg!

So?
$suchwort = $_GET['q'];
$suchwort = trim($suchwort);
mysql_real_escape_string($suchwort);
$dq = str_replace(" ", "%' OR title LIKE '%", $suchwort);


$getbooks = mysql_query("SELECT COUNT(*) FROM buecherdaten WHERE title LIKE '$suchwort%'");
list($booknum) = mysql_fetch_row($getbooks);

Leider funktioniert es nicht (Wenn man z.B. "Eingabe Eingabe2" eingibt, kommen wegen dem doppelten Abstand alle Bücher => in diesem Fall die Anzahl der in der Datenbank vorhandenen Bücher).

28.12.2008 17:21 | geändert: 28.12.2008 17:44

69 Jörg Kruse

Ja, die doppelten Leerzeichen müssen noch entfernt werden. Kannst du ja so probieren (ungetestet):

$suchwort = preg_replace("/( +)/", " ", trim($suchwort));

28.12.2008 20:11

70 Tilman

Ja, funktioniert. Danke!

Sorry, aber jetzt habe ich wieder ein "Problem": Es ist ja nicht gerade sehr hilfreich, wenn man nach zwei Wörter sucht und ein Wort (wie "und") in den meisten Titeln vorkommt. Da kommen dann ziemlich viele Ergebnisse. Ist es denn möglich, dass man die Ergebnisse nach der Relevanz sortiert? (Das Buch, in dessen Titel die meisten gesuchten Wörter vorkommen, kommt zuerst; ...)

29.12.2008 12:52