我有查询Select * from table1 where name like '%Whateveruserpassintextbox%'
。
当用户在文本框查询中传递%
时,将返回所有表数据。
处理此类情景的正确方法是什么?
答案 0 :(得分:4)
尝试执行\%
匹配一个“%”字符。阅读MySql Docs
要测试通配符的文字实例,请在其前面加上转义字符。如果未指定 ESCAPE 字符,则假定为“\”。
-----------------------------------------
| String | Description |
-----------------------------------------
| \% | Matches one “%” character |
| \_ | Matches one “_” character |
-----------------------------------------
答案 1 :(得分:4)
首先,像这样的查询被称为性能杀手。通常你应该这样做是值得怀疑的。
但是,如果用户传入%
,则需要使用以下内容进行转义:
select * from table1
where name like '%50\% off sale%'
escape "\";
我认为\
实际上是默认的转义字符,但我倾向于明确指定它,以防默认值发生变化。
所以基本上,你预先处理字符串以将%
替换为\%
,之后将它放在两端的%
个标记之间。< / p>
您还应该通过mysql_real_escape_string
之类的过滤器传递任何用户输入,以防止SQL注入攻击。在执行上述建议的预处理之前执行此操作,以免\%
无意中变为\\%
。
除了'%'
“任意数量的字符”通配符之外,你还应该将'_'
“完全转义为一个字符”通配符,以免user_name
也匹配usersname
之类的内容。 1}}。
所以过程将是:
mysql_real_escape_string
传递。%
替换所有\%
进一步清理它。_
替换所有\_
进一步清理它。只有这样你才能开始来思考你可能想要考虑使用该字符串的最小可能性: - )
答案 2 :(得分:0)
希望这有帮助
$search=$_POST['whatuserTypes'];
if($search == '%')
{
$query=("Select * from table1;");
}
else
{
$query = sprintf("SELECT * FROM table1 WHERE name like '%s'",
mysql_real_escape_string($search));
}