Maison >développement back-end >tutoriel php >Pourquoi « addcslashes » échappe-t-il différemment aux traits de soulignement dans MySQL ?

Pourquoi « addcslashes » échappe-t-il différemment aux traits de soulignement dans MySQL ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-08 15:24:021085parcourir

Why Does `addcslashes` Escape Underscores Differently in MySQL?

Échapper aux caractères génériques MySQL : résoudre le mystère du trait de soulignement

Dans MySQL, les caractères génériques et les caractères spéciaux tels que les traits de soulignement (_) et les signes de pourcentage (% ) peut créer des défis d'évasion lorsque les entrées de l'utilisateur sont envoyées à la base de données. La fonction PHP mysql_real_escape_string gère la plupart des besoins d'échappement, mais elle ne s'étend pas à _ et %. Pour cette raison, certains peuvent recourir à des addcslashes pour échapper davantage à ces caractères.

Cependant, un problème déroutant se pose : lorsque l'entrée de l'utilisateur inclut un trait de soulignement, son exécution via addcslashes ne produit pas de trait de soulignement d'échappement lorsque l'entrée est récupérés de la base de données. Par exemple, si "test_test " ' est envoyé puis récupéré, le résultat affiche " test_test " ' " avec un trait de soulignement échappé. La question est : pourquoi le trait de soulignement est-il échappé différemment des autres caractères qui sont échappés en utilisant la même méthode ?

La réponse réside dans le fait que _ et % ne sont pas des caractères génériques dans l'utilisation générale de MySQL. Ils ne deviennent spéciaux que lorsqu'ils sont utilisés dans des instructions LIKE, où ils doivent être échappés pour correspondre à leurs formes littérales pour échapper aux caractères à utiliser dans LIKE. Dans ce contexte, _ et % sont spéciaux et doivent être échappés explicitement, ainsi que le caractère d'échappement. Cette étape doit être effectuée même lors de l'utilisation de requêtes paramétrées.

Une fois l'échappement LIKE terminé, la chaîne doit être à nouveau échappée pour une utilisation régulière de la chaîne en dehors de SQL.

La confusion survient parce que MySQL utilise une barre oblique inverse () comme caractère d'échappement pour les deux étapes d'échappement. À titre d'exemple, pour trouver une correspondance exacte pour un signe de pourcentage dans une instruction LIKE, la chaîne devrait être échappée par une double barre oblique inverse : `LIKE 'quelque chose%''. Cependant, ANSI SQL stipule que dans les chaînes littérales, les barres obliques inverses représentent des barres obliques inverses littérales et que les guillemets (') doivent être échappés au lieu des barres obliques inverses.

Pour éviter les problèmes spécifiques à la plate-forme, il est recommandé de remplacer le comportement d'échappement par défaut dans LIKE. et définissez un caractère d'échappement personnalisé à l'aide de la construction LIKE ... ESCAPE ....

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