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

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

Linda Hamilton
Libérer: 2024-12-10 13:29:13
original
1051 Les gens l'ont consulté

How to Properly Escape MySQL Wildcards in LIKE Statements?

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

Dans un environnement où les instructions préparées ne sont pas une option, il est essentiel d'échapper complètement aux entrées de l'utilisateur avant de les soumettre à MySQL pour empêcher l'injection SQL. La fonction mysql_real_escape_string de PHP est couramment utilisée à cette fin, mais elle ne parvient pas à échapper aux caractères génériques MySQL '%' et '_'.

Pour tenir compte de cela, des addcslashes peuvent être utilisés en plus. Cependant, comme l'a observé un utilisateur, lorsqu'une entrée contenant des caractères génériques est envoyée à la base de données et récupérée, il y a une divergence dans les résultats affichés.

L'énigme qui s'échappe

L'utilisateur a rencontré un comportement particulier où le caractère '_' était préfixé par une barre oblique inverse ('_'), alors que les caractères '"' et "'" ne l'étaient pas, même si tous trois ont été échappés avec ''. Cela soulève la question : pourquoi ces caractères sont-ils traités différemment ?

Comprendre le contexte MySQL

La clé pour résoudre cette énigme réside dans la compréhension du contexte de correspondance LIKE dans MySQL. '_' et '%' ne sont pas considérés comme des caractères génériques dans l'utilisation générale de MySQL et ne doivent pas être échappés lors de la construction d'une chaîne littérale. mysql_real_escape_string répond aux besoins d'échappement à cet effet.

Cependant, lors de la préparation de chaînes à utiliser dans une instruction LIKE, un ensemble différent de règles d'échappement s'applique pour garantir que les littéraux sont interprétés correctement, un échappement LIKE supplémentaire est requis.

Dilemme de la double évasion

Dans le Dans le contexte de la correspondance LIKE, '_' et '%' deviennent des caractères spéciaux. MySQL utilise la barre oblique inverse ('') comme caractère d'échappement pour les étapes d'échappement LIKE et d'échappement littéral de chaîne. Cela peut prêter à confusion, comme le démontre l'exemple de l'utilisateur où la correspondance d'un signe de pourcentage littéral avec LIKE nécessite un échappement à double barre oblique inverse.

Échappement LIKE approprié

Pour éviter la portabilité problèmes, ANSI SQL impose l'utilisation d'un caractère d'échappement désigné pour les instructions LIKE. Une façon d'y parvenir en PHP est d'utiliser la fonction suivante :

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}
Copier après la connexion

Utilisation avec des instructions préparées

Pour plus de sécurité et de portabilité, il est conseillé d'utiliser des instructions préparées. déclarations lorsqu’elles sont disponibles. Cela élimine le besoin d'échappement manuel tout en garantissant une gestion appropriée des données.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal