Hallo allerseits.
Ich habe ein Problem bei der Umsetzung einer Suchfunktion. In einer MySQL-Datenbank habe ich eine Tabelle, in der Spiele aufgelistet sind. Diese Einträge können von Benutzern in einem Formular hinzugefügt werden. In der Übersicht kann man in einem Textfeld einen Suchstring eingeben, der dann bei Leerzeichen mit explode() in Teilstrings unterteilt wird und jeder Eintrag, in dem einer dieser Teilstrings vorkommt, wird angezeigt.
So sieht das ganze dann aus (das Array $suchbegriffe enthält die Teilstrings):
$sql = "SELECT id
FROM spiele\_db
WHERE ";
if(!empty($suchstring)) {
if(count($suchbegriffe) > 1) {
$sql .= "(";
}
$count = 0;
foreach($suchbegriffe as $begriff) {
$count++;
$sql .= "(name
LIKE '%".mysql_real_escape_string($begriff)."%')";
if($count < count($suchbegriffe)) {
$sql .= " OR ";
}
}
if(count($suchbegriffe) > 1) {
$sql .= ")";
}
}
Das Problem stellt jetzt das addslashes() dar, das ich beim Formular zum Hinzufügen von Einträgen anwende, um Cross-Site-Scripting zu verhindern (bzw. mit mysql_real_escape_string wäre es genau so). Dadurch wird zum Beispiel "Baldur's Gate" in der Datenbank als "Baldur's Gate" gespeichert. Mit "Baldur" oder "'s" als Sucheingabe wird der Eintrag gefunden, mit "Baldur's" jedoch nicht, obwohl ja bei den Teilstrings mit mysql_real_escape_string() eigentlich auch Slashes hinzugefügt werden. Der SQL Query wäre damit:
"SELECT id
FROM spiele\_db
WHERE (name
LIKE '%Baldur's%')";
Wie bringe ich die Sicherheitsvorkehrung und die Suche mit LIKE unter einen Hut?