отображать каждую категорию с их элементами из таблицы в опции выбора - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть одна таблица products_tbl

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

Я хочу отобразить элементы каждой категории в отдельной группе, используя ОПЦИЯ ВЫБОРА HTML

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 голосов
/ 04 сентября 2018

Я немного изменил ваш код:

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

$produtsrows = $stmt2->fetchAll(); 

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

Сначала обратите внимание, что я добавил ORDER BY ProductCategory ASC, чтобы убедиться, что все товары одной категории всегда вместе.

Далее я Добавляю метку <optgroup> только тогда, когда категория отличается от предыдущего элемента.

Обратите внимание, что я предполагаю, что все продукты имеют допустимую категорию. Если у вас есть пустые категории, полученный html будет испорчен.

0 голосов
/ 04 сентября 2018

Вам нужно изменить цикл 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...