Maison >développement back-end >tutoriel php >Pourquoi les caractères génériques d'échappement de MySQL se comportent-ils de manière inattendue ?

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

DDD
DDDoriginal
2024-11-07 08:25:03776parcourir

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);
}

Exemple avec paramètres :

$escapedname = mysql_real_escape_string(like($name, '='));
$query = "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";

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