【问题标题】:PHP - building query for table filtersPHP - 为表过滤器构建查询
【发布时间】:2014-01-16 19:40:48
【问题描述】:

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

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..

当所有条件都被选中(所有下拉菜单都有一个值)时,调用将返回 data ,但是如果用户只选择一个、两个或三个下拉菜单呢?如果使用上面的查询,它将返回一个空表。

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

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

【问题讨论】:

    标签: php jquery pdo


    【解决方案1】:

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

    即:

     $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']); 
    

    等等等等。

    【讨论】:

    • 谢谢效果很好,我还需要提到为 PDO 投标语句添加 If 条件,否则查询将不起作用。例如: if ($criteria[2]) {$statement->bindParam(':color', $Ids[2], PDO::PARAM_STR);}
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 2016-01-18
      • 1970-01-01
      • 2011-08-02
      相关资源
      最近更新 更多