Pourquoi les caractères génériques d'échappement de MySQL se comportent-ils de manière inattendue ?

DDD
Libérer: 2024-11-07 08:25:03
original
693 Les gens l'ont consulté

Why is MySQL Escaping Wildcards Behaving Unexpectedly?

Comprendre l'échappement de MySQL pour les caractères génériques

Problème :

Lors de l'échappement de l'entrée utilisateur à l'aide de mysql_real_escape_string, la sortie dans MySQL s'affiche comportement inattendu avec certains personnages. Plus précisément, le caractère de soulignement est précédé d'une barre oblique inverse, contrairement aux guillemets simples et doubles.

Explication :

Contrairement à l'hypothèse, et % sont Il ne s'agit pas de caractères génériques MySQL d'usage général et ne doivent pas être échappés lors de leur insertion dans des chaînes littérales. mysql_real_escape_string est suffisant à cet effet, et l'ajout de addcslashes pour et % doit être évité.

Les caractères génériques ne deviennent pertinents que dans le contexte de la correspondance LIKE. Lors de l'expression de chaînes sous forme d'expressions littérales LIKE, une couche d'échappement supplémentaire est requise où _ et % doivent être échappés. Ceci est effectué séparément de l'échappement général de la chaîne en utilisant le même caractère de barre oblique inverse.

Solution :

Pour la correspondance LIKE, suivez ces étapes :

  1. Utilisez l'échappement LIKE, où _ et % doivent être échappés, et le caractère d'échappement doit également être échappé.
  2. Effectuez un échappement général de chaîne en utilisant mysql_real_escape_string dans MySQL ou des fonctions appropriées pour d'autres bases de données.

Exemple :

Pour faire correspondre un signe de pourcentage littéral, doublez-le avec une barre oblique inverse et échappez-le avec l'échappement LIKE (par exemple, LIKE 'quelque chose\%' dans MySQL) ou utilisez un échappement différent caractère avec la construction LIKE ... ESCAPE ... pour la portabilité.

Fonction d'échappement LIKE portable :

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

Exemple avec paramètres :

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
Copier après la connexion

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!