MYSQL:列IN(Any_value)

时间:2014-05-29 16:20:16

标签: php mysql where-in

我正在尝试创建一个动态的where子句。我在PHP中获得了一些复选框,如下面的代码

$brand = array();
if(isset($_GET['brand']) && !empty($_GET['brand']))
    $brand=$_GET['brand'];  
    $brand_str = implode("' , '",$brand);  
}

我的SQL查询是

$sql="SELECT DISTINCT * FROM products WHERE brand IN('$brand_str')";

如果没有定义品牌,它会给出错误或者没有获取行,但是使用以下方法可以解决它的一个简单问题。

我的做法:

我使用的变量类似于' flag_for_filter_brand'如果flag_for_filter_brand = 1,则if if语句

$brand = array();
$flag_for_filter_brand=false;
if(isset($_GET['brand']) && !empty($_GET['brand']))
    $brand=$_GET['brand'];  
    $brand_str = implode("' , '",$brand);  
    $flag_for_filter_brand=true;
}


if(flag_for_filter_brand);
    $sql="SELECT DISTINCT * FROM products WHERE brand IN('$brand_str')";
else
     $sql="SELECT DISTINCT * FROM products;

我的问题: 但这也是一个大问题,因为我的代码变得如此之大,因为下面有两个where where子句

$sql="SELECT DISTINCT * FROM products WHERE brand IN('$brand_str') and Quantity IN ($var2) and type IN($var3)";

如何以最佳方式解决这个问题?

感谢任何建议或帮助

4 个答案:

答案 0 :(得分:1)

WHERE条件的所有部分放在数组中。

$where = array();

if(isset($_GET['brand']) && !empty($_GET['brand']))
    $brand_str = implode("' , '", $_GET['brand']);

    $where[] = "brand IN('$brand_str')";
}

...

然后测试数组是否为空

if (!empty($where)) {
    $sql="SELECT DISTINCT * FROM products WHERE " . implode (' AND ', $where);
} else {
    $sql="SELECT DISTINCT * FROM products";
}

答案 1 :(得分:1)

将每个WHERE条件放入数组中。然后测试数组是否包含任何内容。

$wheres = array();

if(isset($_GET['brand']) && !empty($_GET['brand']))
    $brand=$_GET['brand'];  
    $brand_str = implode("' , '",$brand);  
    $wheres[] = "brand IN ('$brand_str')";
}
if(isset($_GET['quantity']) && !empty($_GET['quantity']))
    $quant=$_GET['quantity'];  
    $quant_str = implode("' , '",$quant);  
    $wheres[] = "Quantity IN ('$quant_str')";
}
// Repeat this for other conditions

if (!empty($wheres)) {
    $where_str = "WHERE " . implode(' AND ', $wheres);
} else {
    $where_str = "";
}
$sql = "SELECT DISTINCT * FROM Products $where_str";

如果你有很多条件,你可以把字段的名字放在一个数组中,然后把这个答案的第一部分变成一个循环:

$fields = array('brand', 'quantity', 'type', ...);
foreach ($fields as $field) {
    if (!empty($_GET[$field])) {
        $field_str = implode("' , '", $_GET[$field]);
        $wheres[] = "$field IN ('$field_str')";
    }
}

答案 2 :(得分:1)

只需将1用作WHERE值:

$brandArray = $_GET['brand']; // with empty(), isset(), and other validation...
$quantityArray = $_GET['quantity']; // with empty(), isset(), and other validation...
$typeArray = $_GET['type']; // with empty(), isset(), and other validation...

$whereArray = array();
$whereArray['brand'] = !empty($brandArray) ? 'brand IN (' . implode(',', $brandArray) . ')' : 1;
$whereArray['quantity'] = !empty($quantityArray) ? 'quantity IN (' . implode(',', $quantityArray) . ')' : 1;
$whereArray['type'] = !empty($typeArray) ? 'type IN (' . implode(',', $typeArray) . ')' : 1;

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

if(flag_for_filter_brand);
    $sql="SELECT DISTINCT * FROM products WHERE brand IN('$brand_str')";
else
     $sql="SELECT DISTINCT * FROM products;

$sql = <<<SQL
    SELECT
        DISTINCT *
    FROM
        products
    WHERE
        $where
;
SQL>>>;

这只是解决这个问题的一种可能性。实际上,这个代码应该分为infor类和方法,或者至少是一些函数。

答案 3 :(得分:0)

一种方法是将查询放入函数中并在if

中调用该函数
if(isset($_GET['brand']) && !empty($_GET['brand'])) {
   $brand=$_GET['brand'];  
   $brand_str = implode("' , '",$brand); 
   if !empty($brand_str) 
      myQueries( $brand_str );
 }

 function myQueries( $brand_str ) {
    // execute your queries
 }

另一个选择是,如果你的字符串为空,那么你的脚本只会执行exit

if(isset($_GET['brand']) && !empty($_GET['brand'])) {
   $brand=$_GET['brand'];  
   $brand_str = implode("' , '",$brand); 
   if empty( $brand_str )
     exit;
 }

 myQueries( $brand_str );