Mysql喜欢或喜欢的地方

时间:2014-01-22 16:53:06

标签: php mysql sql-like

遇到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不喜欢在类似语句中搜索任何内容。我会在搜索之前更好地捕捉字段并将其替换为一个不起眼的字符,因此它不是空的,或者在声明中是否有一种方法可以处理空白的搜索字符串

感谢您的帮助

2 个答案:

答案 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; --"

那会很糟糕。

请检查this link(以及this,如果您想笑一下SQL注入可以做什么)。