使用CASE或IF进行MySQL查询过滤

时间:2014-01-24 12:14:05

标签: php mysql database if-statement

我正在尝试找到最有效(或者更合适的方式)来过滤MySQL查询。

我想要实现的是从大约20个复选框(我用来过滤结果)的列表中查看哪一个被“检查”,以及是否“检查”它们以便在之后添加它们WHERE子句。

当他们“检查”$var = '1'时,它为NULL。

我到目前为止所做的是将它们混合在一起,但是有20多个过滤器就像o_O

if ($var1 == '1') {
    $query = "SELECT * FROM table WHERE var1 = '1';";
    ..
} elseif ($var2 == '1') {
    $query = "SELECT * FROM table WHERE var2 = '1';";
    ..
} elseif ($var1 == '1' AND $var2 == '1') {
    $query = "SELECT * FROM table WHERE var1 = '1' AND var2 = '1';";
    ..
}

20多个过滤器的组合似乎有点愚蠢..是否有更简单的方式来放置IF $var1 != NULL THEN WHERE var1 = '1'

谢谢!

4 个答案:

答案 0 :(得分:0)

for($i=1;$i<=20;$i++)
{

    if (${'var'.$i} == '1' && ${'var'.$i+1} == '1') 
    {
     $query = "SELECT * FROM table WHERE var$i = '1' AND var.$i+1 = '1';";
    }
    else if (${'var'.$i} == '1')
    {
    $query = "SELECT * FROM table WHERE var$i = '1';";
    }


}

demo

答案 1 :(得分:0)

假设您已将复选框命名为cb的数组,因此您可以将其值用作

$cb=$_POST['cb'];
$q='';
for($i=0;$i<count($cb);$i++)
{
 if(isset($cb[$i])&&$cb[$i]!='')
 {
      $q.=' AND var'.($i+1).'=1';
 }
}
$q=trim(' AND');//removes AND from start of string
$query="SELECT * FROM table where $q";

答案 2 :(得分:0)

这应该做你需要的:

$var1 = '1';
$var2 = '0';
$var3 = '1';

$where = array('1 = 1');

foreach (array('var1', 'var2', 'var3') as $var)
{

  if ('1' == $$var)
  {
    $where[] = "$var = '1'";
  }

}

// SELECT * FROM table WHERE 1 = 1 AND var1 = '1' AND var3 = '1'  
echo $query = 'SELECT * FROM table WHERE ' . implode(' AND ', $where);

答案 3 :(得分:0)

这里有几个有用的解决方案;这个将基于编号的var方案工作,并将任何变量(如果它有长度)添加到查询,而不仅仅是1.

您可以在此处看到它:https://eval.in/94701

以下是一些设置变量:

$numberOfVars = 3;
$var1=4;
$var2=5;
$var3='';

请注意,$thevar实际上为每次迭代保留var1,var2等的值:

$query = "SELECT * FROM table WHERE 1=1 ";
for($i=1;$i<=$numberOfVars;$i++) {
$thevar = ${'var'.$i};
    if ( strLen($thevar) ) {
        $query .= " AND var$i = '$thevar' ";
    }
}