Maison >développement back-end >tutoriel php >Pourquoi l'échappement des caractères génériques MySQL nécessite-t-il des doubles barres obliques inverses ?

Pourquoi l'échappement des caractères génériques MySQL nécessite-t-il des doubles barres obliques inverses ?

Susan Sarandon
Susan Sarandonoriginal
2024-11-12 11:22:02866parcourir

Why Does Escaping MySQL Wildcards Require Double Backslashes?

Échapper aux caractères génériques MySQL : comprendre l'énigme du double échappement

Lorsque vous travaillez avec une saisie utilisateur en PHP et que vous vous connectez à une base de données MySQL, vous échappez à des caractères est crucial pour empêcher les entrées malveillantes. Traditionnellement, la fonction mysql_real_escape_string() de PHP a été utilisée à cette fin, mais il lui manque des caractères comme % et _, qui sont des caractères génériques dans MySQL. En conséquence, de nombreux développeurs ont également recours à des addcslashes pour échapper à ces caractères.

Cependant, le comportement inattendu des addcslashes soulève des questions. Pourquoi s'échappe-t-il _ avec une barre oblique inverse mais pas " ou ' ? Dans cet article, nous allons approfondir les nuances de l'échappement des caractères génériques MySQL et explorer une solution pour les gérer correctement.

Comprendre LIKE Échapper

Contrairement aux autres caractères génériques, % et _ ne sont pas des caractères génériques dans les littéraux de chaîne MySQL standard. Ils deviennent des caractères spéciaux uniquement dans le contexte de la correspondance LIKE, où ils indiquent la correspondance des caractères génériques pour préparer les chaînes pour LIKE. utilisation, une couche supplémentaire d'échappement, connue sous le nom d'échappement LIKE, est requise, même avec des requêtes paramétrées.

Dans l'échappement LIKE, _ et % doivent être échappés, ainsi que le caractère d'échappement lui-même (généralement la barre oblique inverse). Cependant, contrairement au SQL standard, MySQL utilise une barre oblique inverse pour les échappements de barre oblique inverse littéraux (dans les chaînes littérales) et pour l'échappement LIKE.

Le double échappement et le problème des barres obliques inverses

Cette double utilisation des barres obliques inverses crée un scénario de double échappement déroutant. Pour faire correspondre un signe de pourcentage littéral (%), par exemple, vous devrez l'échapper avec une double barre oblique inverse en utilisant LIKE 'quelque chose\%'. Cependant, cela est incorrect selon ANSI SQL, et selon la base de données, vous pouvez rencontrer des problèmes.

Une solution portable

Pour résoudre ce problème et assurer la portabilité, vous devez remplacer le caractère d'échappement par défaut dans les expressions LIKE à l'aide de la construction LIKE ... ESCAPE .... Voici une fonction présentant cette approche :

function like($s, $e) {
    return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s);
}

Avec cette fonction, vous pouvez échapper des chaînes pour une utilisation LIKE tout en garantissant la compatibilité ANSI SQL.

Conclusion

Bien qu'échapper aux caractères génériques dans MySQL puisse sembler simple, l'énigme de la double évasion peut prêter à confusion. En comprenant les subtilités de l'évasion de LIKE et en utilisant une solution portable, vous pouvez empêcher efficacement les entrées malveillantes et garantir l'intégrité de votre base de 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!

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