Maison > Article > développement back-end > Pourquoi les caractères génériques d'échappement de MySQL se comportent-ils de manière inattendue ?
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 :
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!