【问题标题】:SQL WHERE clause return ALL if condition is empty [closed]如果条件为空,SQL WHERE 子句返回 ALL [关闭]
【发布时间】:2015-08-02 06:12:41
【问题描述】:

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

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

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

如何做到这一点?我考虑过使用 LIKE 代替,但我只想在确实有输入时匹配精确的输入。

要明确:

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

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

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

编辑:

忽略安全风险的可能性。是否有一个 SQL 命令可以在不更改查询本身的情况下实现此目的,而只需更改变量?作为记录,我已经在查询之前检查变量是否为空字符串。此外,如果我正在检查变量是否为空并且我正在做适当的验证,那么安全风险会在哪里?

【问题讨论】:

  • 您所描述的内容听起来像是等待发生的 SQL 注入
  • 先检查表单的输入?根据字符串是否为空(您还应该运行其他验证),运行获取所有行的 SQL 查询或将输入用作 WHERE 子句中的变量。
  • 过于宽泛且不清楚。
  • @Fred-ii-。见编辑。
  • 你在下面有一个答案/编辑:现在有几个。

标签: php mysql sql


【解决方案1】:

既然您应该不要直接在 SQL 查询中使用用户生成的字符串(请参阅 PHP: SQL Injection),我将在 PHP 脚本中处理,而不是在 SQL 中:

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

编辑: 如果检查了!empty()isset() 是多余的。这也可以:

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

感谢 AbraCadaver!

【讨论】:

  • empty() 检查 isset 所以不需要isset()。而0 是空的,所以如果这需要是一个有效的输入,那么isset() && != ''
  • 谢谢,已编辑到我的答案中!
【解决方案2】:

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

$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);

【讨论】:

    【解决方案3】:

    这可以让您使用相同的查询,如果为空则有效地忽略参数。我不确定我是否真的会推荐它来代替构建(仍然是参数化的)查询,因为它可能不会一直与索引很好地配合,但它是可能的。

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

    更概括:

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

    【讨论】:

    • my_parameter 是变量吗?
    • 是的,我并不精通 php,但我认为它看起来像 WHERE ($filtervalue = '' OR the_field = @filtervalue)
    猜你喜欢
    • 2021-08-09
    • 1970-01-01
    • 2012-05-01
    • 2011-08-31
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多