-1

我有以下问题:我想让用户将过滤器应用于数据库搜索。我有三个过滤器,A、B 和 C。它们都可以是“空的”,例如,用户不关心它们并选择“任何”。现在我想根据数据库记录检查这个查询。我使用普通的 mysql 查询,如

$db_q = "Select * from table where row1 = '" . $A . "' and row2 = '" . $B . "' and row3 =
'" . $C . "'";

只要用户输入任何特定于 A、B、C 的内容(!=“任何”),这都可以正常工作。选择“任何”时,我得到这样的内容:“从Row1 =”任何/全部“等中的表中选择* 我似乎无法弄清楚正确的语法(如果可能的话),我想避免混乱的大小写区分(如果 A == any,执行选择;如果 B == empty.. 等等)。

任何帮助深表感谢。

4

4 回答 4

3

其他答案大多是正确的,但这是完成所需内容的更简单方法:

$where = array();


if($A != 'any'){ // or whatever you need
    $where[] = "A = $A'";
}
if($B != 'any'){ // or whatever you need
    $where[] = "B = $B'";
}
if($C != 'any'){ // or whatever you need
    $where[] = "C = $C'";
}

$where_string = implode(' AND ' , $where);

$query = "SELECT * FROM table";

if($where){
    $query .= ' ' . $where_string;
}

这将允许条件和扩展的任何组合。

于 2013-03-04T22:29:59.063 回答
0

在查询之前,您可以使用:

$tmp = "where ";
if($A and $A!="any" and $A!="not used")
 $tmp .= "row1 = '".$A."'";
if($B and $B!="any" and $B!="not used")
 $tmp .= "AND row2 = '".$B. "'";
if($C and $C!="any" and $C!="not used")
 $tmp .= "AND row3 = '".$C."'";
$db_q = "Select * from table $tmp";
于 2013-03-04T22:12:56.777 回答
0

试试这个:

$db_q = "Select * from table ";

if ($A != "any" || $B != "any" || $C != "any")
{
    $db_q .= "where ";
}

$firstCondition = true;

if ($A != "any")
{
   if (!$firstCondition)
       $db_q .= "and ";

   $db_q .= "row1 = '$A' ";
   $firstCondition = false;
}

if ($B != "any")
{
   if (!$firstCondition)
       $db_q .= "and ";

   $db_q .= "row2 = '$B' ";
   $firstCondition = false;
}

if ($C != "any")
{
   if (!$firstCondition)
       $db_q .= "and ";

   $db_q .= "row3 = '$C' ";
   $firstCondition = false;
}
于 2013-03-04T22:16:09.317 回答
0

尝试做这样的事情:

if @param1 is not null
   select * from table1 where col1 = @param1
else
   select * from table1 where col2 = @param2

这可以重写:

select * from table1
where (@param1 is null or col1 = @param1)
  and (@param2 is null or col2 = @param2)

从 Baron Schwartz 的博客中得到这个想法:https ://www.xaprb.com/blog/2005/12/11/optional-parameters-in-the-where-clause/

于 2017-02-07T21:52:01.260 回答