【问题标题】:Populate another select dropdown from database based on dropdown selection根据下拉选择从数据库中填充另一个选择下拉列表
【发布时间】:2012-07-23 02:11:42
【问题描述】:

我正在构建一个网站来学习编码,并尝试构建一个工具,用户单击一个选择/下拉列表,其中包含从数据库 cat 中提取的一些类别名称,然后另一个选择将出现从数据库 subcat 中提取的子类别名称。这几乎与 Yelp 的(进入类别)like Yelp's (go down to the categories) 完全相同。

我也做了个图:

我已经有一个从 cat 数据库中提取的类别下拉列表:

<p><b>Category:</b><br />
 <?php
  $query="SELECT id,cat FROM cat";
  $result = mysql_query ($query);
  echo"<select name='cselect3' class='e1'><option value='0'>Please Select A       Category</option>";
  // printing the list box select command
  while($catinfo=mysql_fetch_array($result)){//Array or records stored in $nt
  echo "<option value=\"".htmlspecialchars($catinfo['cat'])."\">".$catinfo['cat']."    </option>";

  }

echo"</select>";
?>

我有一个从 subcat 数据库中提取的 subcat:

<p><b>Subcat1:</b><br />
<?php
  $query="SELECT id,subcat FROM subcat";
  $result = mysql_query ($query);
  echo"<select name='sselect1' class='e1'><option value='0'>Please Select A Category</option>";
  // printing the list box select command
  while($catinfo=mysql_fetch_array($result)){//Array or records stored in $nt
      echo "<option value=\"".htmlspecialchars($catinfo['subcat'])."\">".$catinfo['subcat']."</option>";

  }

 echo"</select>";
?>

如何根据用户点击的类别制作子类别下拉菜单并使其自动显示? 非常感谢您提供的所有帮助!

【问题讨论】:

    标签: php javascript ajax


    【解决方案1】:

    我只是用 php 将变量放入 javascript 中,然后使用 javascript 函数。不需要 jquery 或 AJAX。

    但是,无论如何,您都需要为子类别设置外键。即 - 对于 subcat 表中的每条记录,您需要为其指定一个 catid,以便引用...

    <?php
      $db = new mysqli('localhost','user','password','dbname');//set your database handler
      $query = "SELECT id,cat FROM cat";
      $result = $db->query($query);
    
      while($row = $result->fetch_assoc()){
        $categories[] = array("id" => $row['id'], "val" => $row['cat']);
      }
    
      $query = "SELECT id, catid, subcat FROM subcat";
      $result = $db->query($query);
    
      while($row = $result->fetch_assoc()){
        $subcats[$row['catid']][] = array("id" => $row['id'], "val" => $row['subcat']);
      }
    
      $jsonCats = json_encode($categories);
      $jsonSubCats = json_encode($subcats);
    
    
    ?>
    
    <!docytpe html>
    <html>
    
      <head>
        <script type='text/javascript'>
          <?php
            echo "var categories = $jsonCats; \n";
            echo "var subcats = $jsonSubCats; \n";
          ?>
          function loadCategories(){
            var select = document.getElementById("categoriesSelect");
            select.onchange = updateSubCats;
            for(var i = 0; i < categories.length; i++){
              select.options[i] = new Option(categories[i].val,categories[i].id);          
            }
          }
          function updateSubCats(){
            var catSelect = this;
            var catid = this.value;
            var subcatSelect = document.getElementById("subcatsSelect");
            subcatSelect.options.length = 0; //delete all options if any present
            for(var i = 0; i < subcats[catid].length; i++){
              subcatSelect.options[i] = new Option(subcats[catid][i].val,subcats[catid][i].id);
            }
          }
        </script>
    
      </head>
    
      <body onload='loadCategories()'>
        <select id='categoriesSelect'>
        </select>
    
        <select id='subcatsSelect'>
        </select>
      </body>
    </html>
    

    【讨论】:

    • 你会注意到我也从 subcat 中选择了 catid,这样你就可以将 subcats 与 cat 相关联。这是必要的
    • 嘿,谢谢!工作得很好!我怎么能让它为三组这样的下拉菜单做到这一点?
    • 是的,没问题..第三个下拉菜单基于我假设的第二个下拉菜单?
    • 我用 subsubcat 作为表名。你需要一个外键来引用你的 subcats 表的 id
    • 使用 3 个选择需要考虑的一些事项 - 当您更改选择 1 时,您可能希望将选择 3 更改回无选项,您可能有一些没有子选择的选择,因此您应该检查 subcatOptions[x ] 存在,否则 javascript 可能会在尝试访问未定义的数组时出错
    【解决方案2】:

    由于子类别下拉列表中的数据取决于类别中选择的内容,因此您可能希望使用 ajax。您可以在类别下拉列表中设置事件侦听器,当它更改时,您可以请求子类别下拉列表的数据并填充它,有很多不同的方法可以解决它,下面是一个选项(使用 jquery)让你开始了。

    // warning sub optimal jquery code 
    $(function(){
    
       // listen to events on the category dropdown
       $('#cat').change(function(){
    
           // don't do anything if use selects "Select Cat"
           if($(this).val() !== "Select Cat") {
    
               // subcat.php would return the list of option elements 
               // based on the category provided, if you have spaces in 
               // your values you will need to escape the values
               $.get('subcat.php?cat='+ $(this).val(), function(result){
                   $('#subcat').html(result);
               });
    
           }
    
       });
    
    });
    

    【讨论】:

      【解决方案3】:

      如果您使用 AJAX,您会希望第二段代码是一个单独的 php 文件,您将通过 AJAX 调用该文件。在来自 AJAX 调用的回调中,只需执行(伪代码):someContainingDivOrSomething.innerHtml = responseBody;。

      请注意,直接在 PHP 显示文件中进行查询通常不是一个好主意(关注点分离)。还有其他一些可以改进的地方。但是,这将使您入门。

      【讨论】:

        【解决方案4】:

        在登录页面上制作这个 html 结构

        <p><b>Category:</b><br />
         <?php
          $query="SELECT id,cat FROM cat";
          $result = mysql_query ($query);
          echo"<select name='cselect3' onChange='loadSubCats(this.value)' class='e1'><option value='0'>Please Select A       Category</option>";
          // printing the list box select command
          while($catinfo=mysql_fetch_array($result)){//Array or records stored in $nt
          echo "<option value=\"".htmlspecialchars($catinfo['cat'])."\">".$catinfo['cat']."    </option>";
        
          }
        
        echo"</select>";
        ?>
        
        <div id='sub_categories'></div>
        

        使一个js函数分配给类别下拉列表

        function loadSubCats(value)
        {
          $.post('load_sub_cats.php',{catid : value},function{data}
                                                     {
                                                      $('#sub_categories').html(data);
        
                                                     });
        
        }
        

        现在在你的 load_sub_cats.php 中

        <p><b>Subcat1:</b><br />
        <?php
          $catid = $_POST['cat_id']
          $query="SELECT id,subcat FROM subcat where catid = $catid";
          $result = mysql_query ($query);
          echo"<select name='sselect1' class='e1'><option value='0'>Please Select A Category</option>";
          // printing the list box select command
          while($catinfo=mysql_fetch_array($result)){//Array or records stored in $nt
              echo "<option value=\"".htmlspecialchars($catinfo['subcat'])."\">".$catinfo['subcat']."</option>";
        
          }
        
         echo"</select>";
        ?>
        

        您需要在此代码工作中包含 jquery。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多