1

我想用多个过滤器获取内容,现在只有一个。例如:

SELECT * FROM Table1 WHERE status=true AND category = 'Camera' AND model = 'Samsung' AND type = 'New'

我想为它创建一个数组。但是因为我是这个新手,所以没有领先。

function getAllRequests($filter){
if(empty($filter)){
    $addfilter = '';    
    }else{
    $addfilter = 'AND cat_id=' . $filter;
    }
}

$sql = 'SELECT * FROM Table1 WHERE status=true' . $filter;

任何帮助将不胜感激。

4

5 回答 5

1

这将使您更接近解决方案,尽管它不会替换cat_id查询中的 ,这肯定是错误的 - 尽管没有数组结构就不可能做太多事情:

function getAllRequests($filter)
{
    $addfilter="";
    if(!empty($filter))
    {
        foreach($filter as $val)
        {
            $addfilter. = ' AND cat_id=' . $val .'\'';
        }
    }
    return $addFilter;
}

$myFilters=getAllRequests($filter);
$sql = 'SELECT * FROM Table1 WHERE status=true' . $myFilters;

另一方面,如果您的数组的结构如下:

array{ category => camera, model => samsung); // etc

您可以使用以下内容:

function getAllRequests($filter)
{
    $addfilter="";
    if(!empty($filter))
    {
        foreach($filter as $key => $val)
        {
            $addfilter. = " AND `$key` = '$val'";
        }
    }
    return $addFilter;
}

$myFilters=getAllRequests($filter);
$sql = 'SELECT * FROM Table1 WHERE status=true' . $myFilters;

编辑:您可以通过以下方式遍历所有过滤器:

function getAllRequests()
{
    $addfilter="";
    if(!empty($_REQUEST))
    {
    foreach($_REQUEST as $key => $val)
    {
        $addfilter. = " AND `$key` = '$val'";
    }
    }
    return $addFilter;
}

$myFilters=getAllRequests();
$sql = 'SELECT * FROM Table1 WHERE status=true' . $myFilters;

您不需要传递$_REQUEST(这将适用于 GET 和 POST),因为它已经是一个超全局的。

于 2012-09-26T10:13:56.630 回答
1
function getAllRequests($filter){
if(empty($filter)){
$addfilter = '';    
}else{
$addfilter = 'AND cat_id=' . $filter;
 }
}

$sql = 'SELECT * FROM Table1 WHERE status=true' 。$添加过滤器;

于 2012-09-26T10:16:23.140 回答
0

您可以使用另一种方法,即使用可选参数,它将使您的WHERE子句根据需要动态化。在这种方法中,您将所有参数的值直接传递给 sql 查询,如下所示:

SELECT * 
FROM Table1 
WHERE 1 = 1
  AND (@status   IS NULL OR status   = @statusParam)
  AND (@category IS NULL OR category = @categoryParam)
  AND (@model    IS NULL OR model    = @modelParam)
  AND (@type     IS NULL OR type     = @typeParam)

然后,如果任何参数@statusParam、或传递给带有值的查询,则与包含该值的列的比较将被忽略。我使用了 predicate ,以防所有传递给查询的值和所有值在这种情况下所有子句都将被忽略,因为它不会出现,因为它总是 true 并且它会像.@categoryParam@modelParam@typeParamNULL1 = 1NULLWHEREWHERE 1 = 1SELECT * FROM Table1

于 2012-09-26T10:13:51.080 回答
0

用这个

function getAllRequests($filter){
    if(empty($filter)){
      $addfilter = '';    
     }else{
      $addfilter .= 'AND cat_id=' . $filter;
    }
  return $addfilter;
}

$sql = 'SELECT * FROM Table1 WHERE status=true' . getAllRequests($filter);
于 2012-09-26T10:14:07.027 回答
0

当您发送数组时,请确保它具有索引

 $conditions = array('category' => 'Camera', 'model' => 'Samsung' , 'type' => 'New')

现在循环它。在你的其他情况下

foreach($conditions as $key =>$value){

    $addfilter .= 'AND ' . $key . ' = ' . $value;

}
于 2012-09-26T10:14:37.013 回答