基于下拉框选择,从数据库中填充另一个下拉框的选项

6
我正在建设一个学习编程的网站,尝试构建一个工具,让用户点击下拉菜单中的某些类别名称(这些名称从数据库cat中获取),之后会出现另一个下拉菜单,其中包含从数据库subcat中获取的子类别名称。这几乎与Yelp的类别选择一模一样(请看下面链接的类别选择):like Yelp's (go down to the categories)
我还制作了一张图解: enter image description here 我已经有了一个类别下拉菜单,可以从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>";
?>

我有一个子目录正在从子目录数据库中提取:

<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>";
?>

如何基于用户点击的类别创建子类别下拉菜单并使其自动显示?非常感谢您的帮助!

4个回答

20

我会将变量放在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>

1
你会注意到我从子类别中选择了catid,这样你就可以将子类别与类别相关联。这是必要的。 - dano
1
没问题。我猜第三个下拉菜单是基于第二个下拉菜单的,对吧? - dano
1
我在表名中使用了subsubcat..你需要在其中添加一个外键,该外键引用了你的subcats表的id。 - dano
1
在使用 3 个下拉框时需要考虑一些事情 - 当你更改选择 1 时,你可能希望将选择 3 更改回无选项状态;你可能会有一些没有子选项的选择,所以你应该检查 subcatOptions[x] 是否存在,否则 JavaScript 将出错,尝试访问未定义的数组。 - dano
@dano hihi,我对三个下拉选择很感兴趣,但是你分享的链接已经无效了。请问你能否给我发另一个代码链接?非常感谢! - green
显示剩余5条评论

3

由于您的子类别下拉菜单中的数据取决于所选类别,因此您可能需要使用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);
           });

       }

   });

});

0
在着陆页上创建这个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>

创建一个分配给类别下拉菜单的 JavaScript 函数。
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才能使其正常工作。


0

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

请注意,在您的PHP显示文件直接进行查询通常是一个坏主意(关注点分离)。还有几件事情可以改进。然而,这将让你开始。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接