在选择选项中显示每个类别及其表中的项目

时间:2018-09-03 21:31:09

标签: php mysqli pdo

我有一张桌子 products_tbl

+----------+-----------+---------------+
|product_id|ProductName|ProductCategory|
+----------+-----------+---------------+
|1         |Apple      |fruits         |
|2         |Orange     |fruits         |
|3         |Iphone X   |Electronics    |
|4         |FJ-Eye Lens|Accessories    |
+----------+-----------+---------------+

我想使用 HTML SELECT OPTION

在单独的组中显示每个类别项目

products.php

$productQ = "SELECT * FROM products_tbl ";
try { 
    $stmt2 = $db->prepare($productQ); 
    $stmt2->execute();
} catch(PDOException $ex) {   
    die("Failed to run Query: " . $ex->getMessage()); 
} 

$produtsrows = $stmt2->fetchAll(); 

echo"<select>";
foreach($produtsrows as $prow): 
    echo "<optgroup label=".$prow['ProductCategory'].">";
    echo"   <option>".$prow['ProductName']."</option>
          </optgroup>";
endforeach;
echo "
    </select>
    ";

它像这样显示

fruits
Apple 
fruits
Orange  
Electronics    
Iphone X
Accessories    
FJ-Eye Lens

2 个答案:

答案 0 :(得分:0)

您需要更改foreach循环,以使其在与上一个相同时不输出类别名称:

$last_cat = "";
foreach($produtsrows as $prow): 
    if (($cat = $prow['ProductCategory']) != $last_cat) {
        if ($last_cat != "") echo "</optgroup>\n";
        echo '<optgroup label="'.$cat.'">' . "\n";
        $last_cat = $cat;
    }
    echo"   <option>".$prow['ProductName']."</option>\n";
endforeach;
echo "</optgroup>\n";   

输出(用于您的数据)

<optgroup label="fruits">
   <option>Apple</option>
   <option>Orange</option>
</optgroup>
<optgroup label="Electronics">
   <option>Iphone X</option>
</optgroup>
<optgroup label="Accessories">
   <option>FJ-Eye Lens</option>
</optgroup>

答案 1 :(得分:0)

我对您的代码做了一些更改:

ORDER BY ProductCategory ASC

首先请注意,我添加了<optgroup>,以确保所有具有相同类别的产品始终在一起。

下一步,仅当类别与上一项不同时,才添加volatile标签。

请注意,我假设所有产品都具有有效的类别。如果您的类别为空,则产生的html将被弄乱。