我有一个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
连接的子句})。
它确实会返回一个结果,但它不正确。我哪里出错?
答案 0 :(得分:4)
如果您要查找的值是字符串,则需要引用它们:
... IN ('occupation','pro_cat1','pro_cat2','pro_cat3','pro_cat4','pro_cat5') ...
^ here ^ etc.
您也不应该直接将变量注入查询中。相反,您应该为变量使用带占位符的预准备语句。
此外,不应引用列名(除非它们是保留字,包含空格等),但如果需要引用它们,则应使用反向标记:
... directory where `".$_REQUEST['occupation']."` IN ...
^ here ^
另请注意,无法准备表名和列名,因此在将它们注入查询之前,它们必须始终为白名单。