PHP-SQL - 填充动态筛选器列表

时间:2014-03-13 20:29:11

标签: php sql navicat

我想:

  • 根据位置选择显示产品
  • 遍历产品并返回= 1(true)
  • 的列名
  • 创建包含表示产品功能的这些列名称的产品过滤器下拉列表

目前,过滤器下拉列表默认包含所有列,在某些情况下(基于所选位置)这是可以的,另一方面,如果一个位置只有20个中的两个产品,则显示很烦人在过滤器下拉功能中不相关且将返回无结果...

这是我想说的一个简短例子;

数据库表结构

+------+------------+-------------+----------------+-------------+-------------+ | SKU | HDMI | 3D | Android | Ethernet | location | +------+------------+-------------+----------------+-------------+-------------+ |TV1X | 0 | 0 | 0 | 0 |all | |TV5X | 0 | 0 | 0 | 0 |fr uk usa | |TV3Z | 1 | 0 | 0 | 1 |usa | |TVH3 | 1 | 1 | 1 | 1 |mex | |TVH1 | 1 | 1 | 1 | 1 |fr es uk | +------+------------+-------------+----------------+-------------+-------------+

功能列的类型为bit

产品展示

我们说$location = "%".'usa'."%"

$queryString = "SELECT * FROM `products` WHERE `location` LIKE :location" ;
$statement = $dbh->prepare($queryString)
$statement->bindParam(':location',  $location, PDO::PARAM_STR);
$statement->execute();
$statement->setFetchMode(PDO::FETCH_ASSOC);
$result = $statement->fetchAll();

上面的查询将返回TV5X&与美国相关的TV3Z,这些产品功能“正常”仅为HDMI + Ethernet,其中我不希望在过滤器下拉列表中显示其余两列。当我们有许多产品/功能和位置时,这个例子可能更相关......

默认过滤列表

<li >
  <button  data-filter=".HDMI" >HDMI</button>
</li>
<li >
  <button  data-filter=".3D" >3D</button>
</li>
<li >
  <button  data-filter=".Android" >Android OS</button>
</li>
<li >
  <button  data-filter=".Ethernet" >Ethernet</button>
</li>

默认过滤器列表与某些国家/地区相关,但与美国无关

动态过滤列表

根据检索到的产品(本例中为两个),查询数据库并查找这些产品的哪些列为TRUE值。

<?php  foreach( $feature as $feat) : ?>

 <li >
    <button  data-filter=".<?php print  //Col_Name   ;?>" ><?php print  ect..    ;?></button>
 </li>

<?php endforeach;  ?>

我为长篇大论道歉,我正在努力解释我能做到的最佳方式。

我的问题是如何为此目的构建查询?

1 个答案:

答案 0 :(得分:1)

您可以在一个附加查询中执行此操作,方法是选择每列的总和,然后检查返回的值是否为&gt; 0:

SELECT SUM(`HDMI`) AS `HDMI`,
       SUM(`3D`) AS `3D`,
       SUM(`Android`) AS `Android`,
       SUM(`Ethernet`) AS `Ethernet`
FROM `products`
WHERE `location` LIKE :location

在第一次查询后运行此查询,输出过滤器列表的代码将变为:

foreach ($result as $row) {
    foreach ($row as $column => $numProducts) {
        if ($numProducts > 0) { // i.e., SUM($column) is > 0
            $html .= "<li>
                <button data-filter=\".{$column}\">{$column} ({$numProducts})</button>
            </li>";
        }
    }
}

此外,您还可以获得具有各项功能的产品数量。 :)