Maison >base de données >tutoriel mysql >Comment échapper correctement aux caractères génériques MySQL dans les clauses LIKE ?

Comment échapper correctement aux caractères génériques MySQL dans les clauses LIKE ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-02 03:54:09317parcourir

How to Properly Escape MySQL Wildcards in LIKE Clauses?

Échapper aux caractères génériques MySQL

Problème

Sur les serveurs existants où les instructions préparées ne sont pas disponibles, il est essentiel d'échapper aux entrées de l'utilisateur avant de les envoyer à MySQL. Cependant, utiliser mysql_real_escape_string seul n'échappe pas aux caractères génériques MySQL (_ et %) et certains modèles renvoient des résultats inattendus.

Par exemple, lorsque l'entrée "test_test ' est envoyée, la base de données affiche "test_test '." Pourquoi le trait de soulignement a-t-il un préfixe de barre oblique inverse tandis que les guillemets simples et doubles ne le faites pas ?

Réponse

_ et % ne sont pas des caractères génériques dans MySQL et ne doivent pas être échappés lorsqu'ils sont insérés dans des chaînes littérales. mysql_real_escape_string est suffisant à cet effet.

Cependant. , _ et % nécessitent un traitement spécial lorsqu'ils sont utilisés dans des expressions correspondant à LIKE pour garantir qu'ils correspondent uniquement à leurs valeurs littérales, et non à des modèles. Cela implique deux niveaux de. échapper :

LIKE échapper :

  • Échappe le trait de soulignement, le pourcentage et tout caractère d'échappement utilisé dans les expressions LIKE.
  • Cela doit être fait dans SQL, même avec des requêtes paramétrées.

String échappement littéral :

  • Échappe les caractères utilisés dans les chaînes littérales, y compris le caractère d'échappement LIKE.
  • Cela se fait en dehors de SQL, par exemple, en utilisant mysql_real_escape_string.

Exemple

Pour MySQL, si vous le souhaitez pour correspondre à un signe de pourcentage littéral, vous utiliseriez une double barre oblique inverse, par exemple LIKE 'quelque chose\%`.

Pour éviter cette confusion et garantir la portabilité, vous pouvez remplacer le caractère d'échappement par défaut à l'aide de LIKE .. . ESCAPE ... construction.

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 ...";

ou avec des paramètres dans PDO :

$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ...");
$q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn