Maison >base de données >tutoriel mysql >Comment échapper correctement aux caractères génériques MySQL dans les clauses LIKE ?
Sur les serveurs existants où les instructions préparées ne sont pas disponibles, il est essentiel d'échapper aux entrées de l'utilisateur avant de les envoyer à MySQL. Cependant, utiliser mysql_real_escape_string seul n'échappe pas aux caractères génériques MySQL (_ et %) et certains modèles renvoient des résultats inattendus.
Par exemple, lorsque l'entrée "test_test ' est envoyée, la base de données affiche "test_test '." Pourquoi le trait de soulignement a-t-il un préfixe de barre oblique inverse tandis que les guillemets simples et doubles ne le faites pas ?
_ et % ne sont pas des caractères génériques dans MySQL et ne doivent pas être échappés lorsqu'ils sont insérés dans des chaînes littérales. mysql_real_escape_string est suffisant à cet effet.
Cependant. , _ et % nécessitent un traitement spécial lorsqu'ils sont utilisés dans des expressions correspondant à LIKE pour garantir qu'ils correspondent uniquement à leurs valeurs littérales, et non à des modèles. Cela implique deux niveaux de. échapper :
LIKE échapper :
String échappement littéral :
Pour MySQL, si vous le souhaitez pour correspondre à un signe de pourcentage littéral, vous utiliseriez une double barre oblique inverse, par exemple LIKE 'quelque chose\%`.
Pour éviter cette confusion et garantir la portabilité, vous pouvez remplacer le caractère d'échappement par défaut à l'aide de LIKE .. . ESCAPE ... construction.
function like($s, $e) { return str_replace(array($e, '_', '%'), array($e.$e, $e.'_', $e.'%'), $s); } $escapedname= mysql_real_escape_string(like($name, '=')); $query= "... WHERE name LIKE '%$escapedname%' ESCAPE '=' AND ...";
ou avec des paramètres dans PDO :
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
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!