如果condition为空,则SQL WHERE子句返回ALL

时间:2015-05-20 19:50:42

标签: php mysql sql

我有一个用PHP处理的HTML表单。

表单中的输入用作SQL WHERE子句中的条件。

当没有输入时,WHERE子句查找空字符串并且不会返回任何内容。相反,我想返回所有行。

如何实现这一目标?我考虑过使用LIKE,但是当确实有输入时,我想只匹配精确的输入。

要明确:

我想检查输入存储的变量是否为空。如果是这样,我想返回所有行。

我想知道是否可以在SQL中执行此类操作而无需更改语句。相反,只需更改变量。

请注意,可以有多个输入字段。

编辑:

忽略安全风险的可能性。是否有一个SQL命令可以实现这一点而无需更改查询本身,只是变量?对于记录,我已经在查询之前检查变量是否为空字符串。另外,如果我检查变量是否为空,安全风险会在哪里,否则我会进行适当的验证?

3 个答案:

答案 0 :(得分:2)

由于你不能直接在SQL查询中使用用户生成的字符串(参见PHP: SQL Injection),我会在PHP脚本中处理,而不是在SQL中处理:

if(isset($user_input) && !empty($user_input)) {
    // add WHERE clause
}
如果选中isset(),则

修改 !empty()是多余的。这也可以:

if(!empty($user_input)) {
    // add WHERE clause
}

感谢AbraCadaver!

答案 1 :(得分:1)

在查询上动态添加过滤器的常用方法是:

$sql ='select * from table where (1=1) ';
if (array_key_exists($_POST,'email'))
    {
    $email=mysql_real_escape_string($_POST['email']);
    $sql.=" and (email='$email')";
    }
if (array_key_exists($_POST,'city'))
    {
    $city=mysql_real_escape_string($_POST['city']);
    $sql.=" and (city='$city')";
    }
//.....
mysql_query($sql);

答案 2 :(得分:0)

这可以允许您使用相同的查询,并在空白时有效地忽略该参数。我不确定我是否会实际推荐它来代替构造一个(仍然参数化的)查询,因为它可能不会一直与索引一起使用,但它是可能的。

WHERE ([my_parameter] = '' OR the_field = [my_parameter])

更加普遍:

WHERE ([my_parameter] = [ignore value] OR the_field = [my_parameter])