遇到MySql查询问题。我正在寻找三个领域的模式匹配,我尝试使用括号分隔每个相似的模式。它不是返回正确的行数,而是返回所有行。
这是查询
mysql_query("select * from contacts where contact_name like '%$contact_name%' or bus_name like '%$busname%' or contact_email like '%$contact_email%'");
如果我搜索像Kim这样的contact_name或像someword这样的busname,以及像anyword那样搜索contact_email,那么它应该只返回1个结果。
我认为问题是用户将搜索字段留空时MySql不喜欢在类似语句中搜索任何内容。我会在搜索之前更好地捕捉字段并将其替换为一个不起眼的字符,因此它不是空的,或者在声明中是否有一种方法可以处理空白的搜索字符串
感谢您的帮助
答案 0 :(得分:4)
你的直觉是正确的,空格将导致你的语句返回所有行。
如果此人提交了空白表单,则运行的SQL实际上是:
select * from contacts where contact_name like '%%' or bus_name like '%%' or contact_email like '%%'"
很明显,这将返回所有行。
解决方案:您需要首先检查是否有任何一个变量具有值,如果您没有至少一个具有非空/有效值的变量,则应返回错误。 强>
我强烈地回应那些在没有清理代码的情况下表示存在严重的SQL注入风险的海报!
答案 1 :(得分:1)
让我们考虑一下你的问题:
select *
from contacts
where
contact_name like '%contact_name%' -- Condition 1
or bus_name like '%bus_name%' -- Condition 2
or contact_email like '%contact_email%' -- Condition 3
让我们看看如何评估任何行:
c1 | c2 | c3 | row_returned
----+----+----+--------------
T | T | T | Yes
T | T | F | Yes
T | F | T | Yes
T | F | F | Yes
F | T | T | Yes
F | T | F | Yes
F | F | T | Yes
F | F | F | No
现在考虑如果您使用and
代替or
会发生什么:
c1 | c2 | c3 | row_returned
----+----+----+--------------
T | T | T | Yes
T | T | F | No
T | F | T | No
T | F | F | No
F | T | T | No
F | T | F | No
F | F | T | No
F | F | F | No
在我看来,您需要使用and
代替or
。
至于我对SQL注入的评论,我的意思是你的查询编写方式是一个打开的大门,可以插入一些流氓代码并破坏你的数据。想象一下,变量contact_name
被分配给这样的东西:
contact_name = "'; drop table contacts; --"
那会很糟糕。