带有多个'AND'条件的'IN'子句

时间:2016-10-06 12:33:15

标签: php sql

我有一个SQL查询,它返回错误的结果。

" SELECT * FROM directory WHERE '".$_REQUEST['occupation']."' IN (occupation,pro_cat1,pro_cat2,pro_cat3,pro_cat4,pro_cat5) AND state = '".$_REQUEST['state']."' AND city = '".$_REQUEST['city']."' AND status = 1 ORDER BY rand() "

在这里,我想检查occupation是否是IN子句中提供的6个值之一(同时还在WHERE中添加了一些与AND连接的子句})。

它确实会返回一个结果,但它不正确。我哪里出错?

1 个答案:

答案 0 :(得分:4)

如果您要查找的值是字符串,则需要引用它们:

... IN ('occupation','pro_cat1','pro_cat2','pro_cat3','pro_cat4','pro_cat5') ...
        ^ here     ^ etc.

您也不应该直接将变量注入查询中。相反,您应该为变量使用带占位符的预准备语句。

此外,不应引用列名(除非它们是保留字,包含空格等),但如果需要引用它们,则应使用反向标记:

... directory where `".$_REQUEST['occupation']."` IN ...
                    ^ here                      ^

另请注意,无法准备表名和列名,因此在将它们注入查询之前,它们必须始终为白名单。