Heim >Datenbank >MySQL-Tutorial >Wie entgeht man MySQL-Platzhaltern in LIKE-Klauseln ordnungsgemäß?
Auf älteren Servern, auf denen vorbereitete Anweisungen nicht verfügbar sind, ist es wichtig, Benutzereingaben zu maskieren, bevor sie an MySQL gesendet werden. Die alleinige Verwendung von mysql_real_escape_string entgeht jedoch nicht den MySQL-Platzhaltern (_ und %) und bestimmte Muster liefern unerwartete Ergebnisse.
Wenn beispielsweise die Eingabe „test_test“ gesendet wird, zeigt die Datenbank „test_test“ an. Warum Hat der Unterstrich ein Backslash-Präfix und die einfachen und doppelten Anführungszeichen? nicht?
_ und % sind keine Platzhalter in MySQL und sollten nicht maskiert werden, wenn sie in String-Literale eingefügt werden. mysql_real_escape_string ist für diesen Zweck ausreichend.
Allerdings , _ und % erfordern bei Verwendung in LIKE-Matching-Ausdrücken eine besondere Behandlung, um sicherzustellen, dass sie nur mit ihren Literalwerten und nicht mit Mustern übereinstimmen. Dies umfasst zwei Ebenen des Escapezeichens:
LIKE-Escapezeichen:
String-Literal Escapezeichen:
Für MySQL, wenn Sie gegen a abgleichen möchten Für ein wörtliches Prozentzeichen würden Sie einen doppelten Backslash als Escapezeichen verwenden, z. B. LIKE 'etwas\%`.
Um diese Verwirrung zu vermeiden und die Portabilität sicherzustellen, können Sie das Standard-Escapezeichen mit LIKE ... ESCAPE überschreiben. . Konstrukt.
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); } $escapedname= mysql_real_escape_string(like($name, '=')); $query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
oder mit Parametern in PDO:
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
Das obige ist der detaillierte Inhalt vonWie entgeht man MySQL-Platzhaltern in LIKE-Klauseln ordnungsgemäß?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!