【问题标题】:How to put in a <select> categories and Subcategories from a DB?如何从数据库中放入 <select> 类别和子类别?
【发布时间】:2016-10-30 17:23:59
【问题描述】:

我真的很想做这样的事情http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_optgroup 但我在数据库中有主要类别和子类别,我真的不知道如何在一段时间内管理它。我怎样才能做到这一点 ?其实循环是这样的,但因为我的需要,我不能再使用它了

<select  class="form-control" id="subcategory" name="subcategory" required>
<?php
   $categories="SELECT Name,Category FROM SubCategory ORDER BY Category ASC, Name ASC;";
   $query_categories=mysqli_query($connh,$categories);

      while($rows_categories=mysqli_fetch_array($query_categories)){

echo'<option>'.$rows_categories['Category'].'/'.$rows_categories['Name'].'</option>';  
                                                                    } 
?>
</select>

p.s:Category是主Category,Name是子Category

我想将主要类别放入&lt;optgroup&gt;,但由于一个类别包含超过 1 个子类别,我不知道如何放置 &lt;optgroup&gt; 以使其仅显示主要类别 1 次而不是每条记录。

【问题讨论】:

  • 到底是什么不工作?你得到/期待什么结果?按照他们的例子应该可以工作。
  • 我想将主类别放入 但是,由于一个类别包含超过 1 个子类别,我不知道如何以显示主类别的方式放置 类别只有 1 次,而不是每条记录
  • 把它想象成一个巢,里面有更小的巢,但没有鸟和稻草

标签: php mysql sql list while-loop


【解决方案1】:

在您的情况下,如果当前主要类别已添加到您的 html 中,则需要标记,如果我了解您数据库中的字段,名称和类别具有字符串值,您不需要两个查询或两个时间,而只需要检查变量,例如这个:

<select  class="form-control" id="subcategory" name="subcategory" required>
<?php
$categories="SELECT Name,Category FROM SubCategory ORDER BY Category ASC, Name ASC;";
$query_categories=mysqli_query($connh,$categories);

$currentMainCategory = null;
while($rows_categories=mysqli_fetch_array($query_categories)){
    // check if your current category was diferent of row category
    if($currentMainCategory != $rows_categories['Category']) {
         // check if is not null (for close </optgroup>)
         if(!is_null($currentMainCategory)) {
              echo '</optgroup>';
         }
         // set your new current category for this loop
         $currentMainCategory = $rows_categories['Category'];
         echo '<optgroup label="'. $rows_categories['Category'] .'">';
    }
    // do not forget put value of this category if you needed
    echo'<option>' . $rows_categories['Name'] . '</option>';  
}

// then check again for close last optgroup if is opened
if(!is_null($currentMainCategory)) {
   echo '</optgroup>';
}
?>
</select>

【讨论】:

    【解决方案2】:

    您离实现基本目标不远了,即在 optgroup 中显示类别和子类别。

    您可以:

    1. 使用两个单独的查询查询 MySQL,并使用 PHP 将它们组合到 SubCategoryCategory 表中。

    2. 执行两个foreach 循环,每个循环都包含一个optgroup,分别对应CategorySubCategory 结果。

    1. 使用OUTER JOIN 使用一个查询查询MySQL,以针对SubCategoryCategory 表(甚至可能是UNION)检索一个结果集。
    2. 执行两个foreach 循环,每个循环都包含一个optgroup,分别对应CategorySubCategory 结果,但仅显示来自Category 表的Category 结果,反之亦然。

    这里有一些参考资料:

    MySQL 加入:https://www.sitepoint.com/understanding-sql-joins-mysql-database/

    MySQL 联盟:Combining the results of two separate MySQL queries

    PHP Foreach 循环:http://php.net/manual/en/control-structures.foreach.php

    PHP 数组合并:http://www.w3schools.com/php/func_array_merge.asp

    【讨论】:

      【解决方案3】:
      <select  class="form-control" id="subcategory" name="subcategory" required>
      <?php
      $categories="SELECT Name,Category FROM SubCategory ORDER BY Category ASC, Name ASC;";
      $query_categories=mysqli_query($connh,$categories);
      $category_name_old = '';
      while($rows_categories=mysqli_fetch_array($query_categories)){
      
          if($rows_categories['Category'] != $category_name_old) {
              echo "<optgroup label=".$rows_categories['Category'].">";
              echo "<option>".$rows_categories['Name']."</option>";
          }
          else {
              echo "<option>".$rows_categories['Name']."</option>";
          }
          $category_name_old = $rows_categories['Category'];
          if($category != $category_name_old) {
              echo "</optgroup>";
          }
      }  
                                                                          } 
      ?>
      </select>
      

      你可以这样做

      【讨论】:

        【解决方案4】:

        使用您的主要类别创建一个数组,将子类别作为子数组。

        <select  class="form-control" id="subcategory" name="subcategory" required>
        <?php
        $option_list = array();
        
        $categories="SELECT Name,Category FROM SubCategory ORDER BY Category ASC, Name ASC;";
        $query_categories=mysqli_query($connh,$categories);
        
        while($rows_categories=mysqli_fetch_array($query_categories)){  
            $option_list[$rows_categories['Category']][] = $rows_categories['Name'];
        }
        
        // this is what we're aiming for
        // $option_list = array("Maincat1"=>array("subcat1","subcat2","subcat3"),"Maincat2"=>array("subcat4","subcat5"));
        
        
        foreach($option_list as $maincat=>$subcats){
            echo "<optgroup label='".$maincat."'>";
            foreach($subcats as $subcat){
                echo "<option value='$subcat'>$subcat</option>";
            }
            echo "</optgroup>";
        }
        ?>
        </select>
        

        【讨论】:

          【解决方案5】:
          <?php
          $conn = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password,$mysql_database) or die("Could not connect database");
          $result = mysqli_query($conn,"select distinct Category from SubCategory");
          echo '<select  class="form-control" id="subcategory" name="subcategory" required>';
          while($row = mysqli_fetch_assoc($result)){  
              echo '<optgroup label="'. $row['Category'] .'">';
               $data =  mysqli_query($conn,"SELECT Name,Category FROM SubCategory where Category = '".$row['Category']."'");
          while($value = mysqli_fetch_assoc($data)){  
              echo '<option>'. $value['Name'] .'</option>';
          }
           echo '</optgroup>';
          }
          echo '</select>';
          ?>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-10-15
            • 1970-01-01
            • 2016-07-29
            • 1970-01-01
            • 1970-01-01
            • 2017-12-08
            • 1970-01-01
            相关资源
            最近更新 更多