在准备好的语句不可用的旧服务器上,在将用户输入发送到 MySQL 之前转义用户输入至关重要。然而,单独使用 mysql_real_escape_string 并不能转义 MySQL 通配符(_ 和 %),并且某些模式会返回意外结果。
例如,当发送输入“test_test '时,数据库显示“test_test '。”下划线是否有反斜杠前缀,而单引号和双引号不?
_ 和 % 在 MySQL 中不是通配符,在插入字符串文字时不应转义 mysql_real_escape_string 足以达到此目的。
但是、 _ 和 % 在 LIKE 匹配表达式中使用时确实需要特殊处理,以确保它们仅匹配其文字值,而不是模式。这涉及两个方面。转义级别:
LIKE 转义:
字符串文字转义:
对于 MySQL,如果你想匹配文字百分号,你可以使用双反斜杠转义,例如,LIKE 'something\%`。
为了避免这种混乱并确保可移植性,您可以使用 LIKE ... 覆盖默认转义字符ESCAPE ... 构造。
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 ...";
或在 PDO 中使用参数:
$q= $db->prepare("... WHERE name LIKE ? ESCAPE '=' AND ..."); $q->bindValue(1, '%'.like($name, '=').'%', PDO::PARAM_STR);
以上是如何在 LIKE 子句中正确转义 MySQL 通配符?的详细内容。更多信息请关注PHP中文网其他相关文章!