Heim >Datenbank >MySQL-Tutorial >Wie entgeht man MySQL-Platzhaltern in LIKE-Klauseln ordnungsgemäß?

Wie entgeht man MySQL-Platzhaltern in LIKE-Klauseln ordnungsgemäß?

Barbara Streisand
Barbara StreisandOriginal
2024-12-02 03:54:09369Durchsuche

How to Properly Escape MySQL Wildcards in LIKE Clauses?

Escaping MySQL Wild Cards

Problem

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?

Antwort

_ 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:

  • Escapes für Unterstrich, Prozent und alle in LIKE-Ausdrücken verwendeten Escapezeichen.
  • Dies muss sein erfolgt innerhalb von SQL, auch bei parametrisierten Abfragen.

String-Literal Escapezeichen:

  • Escapezeichen, die in String-Literalen verwendet werden, einschließlich des LIKE-Escapezeichens.
  • Dies erfolgt außerhalb von SQL, beispielsweise mit mysql_real_escape_string.

Beispiel

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn