Moin!
bitte korrigiere mich, wenn ich falsch liegen sollte, aber wenn ich folgenden String im Datenfeld habe, gegen den meine Benutzereingabe gematched werden soll, ist das mit Deinem Vorschlag so lösbar?
// Ein Datensatz enthält in seinem text-Feld: "Grüner geht es nimmer.";
$benutzereingabe = $db->escape($_GET['q']); // "grün"
$rs = $db->query("SELECT * FROMtabelle
WHEREtext
LIKE '%$benutzereingabe%'");
>
> Wenn jetzt jemand tatsächlich "grün" eingegeben haben sollte, dann findet `LIKE '%grün%'`{:.language-sql} nur etwas, wenn vor und nach dem "grün" noch Zeichen stehen. Oder nicht? Mein Beispieltext wird also nicht gefunden, da ich dafür `LIKE 'grün%'`{:.language-sql} ohne erstes Prozentzeichen notieren müsste, oder nicht? So zumindest hatte ich [LIKE](http://dev.mysql.com/doc/refman/5.1/de/string-comparison-functions.html) verstanden.
Zitat: "% entspricht einer beliebigen Anzahl von Zeichen (einschließlich null Zeichen)."
Dein Escaping ist aber falsch. Wenn der Nutzer ein "%" eingibt, willst du das Prozentzeichen suchen, nicht das Prozentzeichen als Platzhalter für "beliebig viele Zeichen" nutzen. Und der Unterstrich "\_" ist ebenfalls ein Sonderzeichen, dass escaped gehört, wenn du den String als LIKE-Parameter verwenden willst, und die Sonderbedeutung nicht wirken soll.
Dasselbe Problem hast du, wenn du REGEXP verwendest. Alle vom User eingegebenen Zeichen, die in regulären Ausdrücken Sonderbedeutung haben, müssen escaped werden, damit sie als "das Zeichen" wirken. Und bei REGEXP hast du noch viel mehr Zeichen zu beachten, als bei LIKE.
- Sven Rautenberg