PHP - 构建表过滤器的查询

时间:2014-01-16 19:40:49

标签: php jquery pdo

我需要帮助构建查询,我有一个表单(多个下拉列表),需要根据用户选择显示数据表。

filters.php (在服务器端 - ajax)

 $criteria[0] = $_POST['Size'];
 $criteria[1] = $_POST['Name'];
 $criteria[2] = $_POST['Color'];
 $criteria[3] = $_POST['Sku'];
 $criteria[4] = $_POST['Features'];

$statement = $dbh->prepare("select * from table_name where Sku = :sku AND Size = :size AND Color = :color AND Features LIKE :features ");

$statement->execute(array(':name' => $criteria[1], ':Size'=> $criteria[0], ':color'=>$criteria[2], ':sku'=>$criteria[3], ':features'=> '%'.$features[4].'%'));

$statement->setFetchMode(PDO::FETCH_ASSOC);

$subrows = $statement->fetchAll();
// ect..

当选择所有条件(所有下拉列表都有值)时,调用将返回数据,但如果用户只选择一个,两个或三个下拉菜单,该怎么办?如果使用上面的查询,它将返回一个空表。

我想也许我应该首先检查是否设置了变量,然后为每个场景执行查询?我有点失去了如何实现它。

我们的想法是在数据表旁边有一个带有下拉列表的小div,允许过滤。 感谢

2 个答案:

答案 0 :(得分:0)

依赖于$ _POST键的

If语句可能是最好的方法 - 并将相应的部分添加到查询字符串中:

即。 :

 $queryString = "select * from table_name where ";
    if($_POST['SKU']){
         $queryString .= "Sku = :sku";
    }

此外,要处理“AND”部分:

$and = (count($_POST) > 1 ? 1 : 0); 

并在每个if语句中,第一行应为:

$queryString .= ($and ? "AND " : ""); 

此外,我建议使用ORM,(Idiorm是我个人最喜欢的,我在这个例子中使用它)。

$queryBuilder = ORM::for_table("table"); 

if($_POST['Sku']) 
     $queryBuilder = $queryBuilder->where("Sku", $_POST['Sku']); 

依此类推。

答案 1 :(得分:0)

检查所需的变量以查看它们是否包含数据,如果是,则必须构建查询。您可以同时添加到阵列!例如:

$myarray = array();
if(!empty($criteria[0])){
$myarray["Size"] = $criteria[0];
}