【问题标题】:Multiple dependent dropdown menus多个相关下拉菜单
【发布时间】:2017-09-21 17:19:15
【问题描述】:

我被多个动态下拉菜单卡住了。所以这是我试图解决的问题。我将以下四个示例表存储在数据库中,并希望动态访问这些值。 Dropdown 2依赖于Dropdown 1,Dropdown 4依赖于2和3。

| ID  | name   | percent |      | ID  | name    | languageValue | 100 | 75  | 501 |
| --- | ------ | ------- |      | --- | ------- | ------------- | --- | --- | --- |
| 1   | 100%   | 100     |      | 1   | English | english       | y   | y   | n   |
| 3   | 75%    | 75      |      | 2   | German  | german        | y   | n   | n   |
| 2   | 50% 1  | 501     |      | 3   | French  | french        | n   | n   | y   |
Table 1 (Dropdown 1)            Table 2 (Dropdown 2)

| ID  | CoreSubjectName | CoreSubjectValue |   | ID  | MinorSubjectName | MinorSubjectValue |
| --- | --------------- | ---------------- |   | --- | ---------------- | ----------------- |
| 1   | Maths           | maths            |   | 1   | English          | english           |
| 2   | Politics        | politics         |   | 2   | Politics         | politics          |
| 3   | Chemics         | chemics          |   | 3   | Chemics          | chemics           |
Table 3 (Dropdown 3)                           Table 4 (Dropdown 4)

我检索第一个下拉列表的值如下。 (我省略了结束标签)。

<select name="percent" id ="percent" onchange="getPercent(this.value);">
    <option value="">Choose Percent</option>
<?php
   $PercentPost = $_POST["percent"];
   $PercentQuery = "SELECT percent, name FROM percentTable";
   $results=mysqli_query($conn, $anteilQuery);
   //loop
   while ($row = mysqli_fetch_array($results)){
       echo '<option value="'.$row[percent].'">'.$row[name].'</option>';
   }
?>
<select name="language" id="language">
            <option value=""></option>
        </select>

以及用于填充第二个 Dropdown 的 js-ajax:

function getPercent(val){
        //ajax function
        $.ajax({
            type: "POST",
            url: "form.php",
            data: "percent="+val,
            success: function(data){
                $("#language").html(data);
            }
        });

    }

form.php 包含这个 sn-p 到目前为止:

$PercentPost = $_POST["percent"];
if (!empty($_POST["percent"])) {

    $query="SELECT name, languageValue FROM table2 WHERE `$PercentPost`='y'";

    $results = mysqli_query($conn, $query);

    while ($row = mysqli_fetch_array($results)){
        echo '<option value="'.$row[languageValue].'">'.$row[name].'</option>';
    }
}

这很好用,但现在我不知道如何动态填充下拉列表 4。在下拉菜单 4 中,选择的值 2 和 3 不应该是可选的。我知道它必须用js的ajax来完成,但我不知道怎么做。

有人可以帮帮我吗? 非常感谢!

【问题讨论】:

    标签: php jquery html ajax drop-down-menu


    【解决方案1】:

    因此,您会将 DropDown 4 加载为禁用(disabled 属性)或不可见(style="display:none;")。

    我将在您的 DropDown 2 和 3 中添加一个默认值,例如 select...,值为 0 或 -1(例如,参见下一个 PHP 代码)

    然后我会为 DropDown 2 和 3 添加一个onchange 属性,它们都会调用相同的 js 函数:

    function loadDD4Values(){
        if ($('#language').val() <> 0 && $('#coreSubject').val() <> 0){
             //ajax function
            $.ajax({
                type: "POST",
                url: "form.php", //You can detect what to do based on params, or have a different PHP page
                data: "language="+$('#language').val() + "&coreSubject=" + $('#coreSubject').val() ,
                success: function(data){
                    $("#minorSubject").html(data);
                    $('#minorSubject').style.display = '';//or remove attribute disabled, also if you want you can disable/hide DropDown 2 and 3 here
                }
            });
        }else{
            $('#minorSubject').style.display = 'none'; //or add attribute disabled
        }
    
        //Also here you can decide what to do if the user modify DropDown 2 or 3  for example, reset the DropDown 4 values, or just the selected one:
        $('#minorSubject').selectedValue = 0;
    }
    

    那么你的 PHP 可能是:

    if( isset($_POST['percent']) ){
        // Your code from the DropDown 2
    }else if (isset($_POST['language']) && isset($_POST['coreSubject'])){
        //You didn't had sql injection protection in your question code !!!
        $language = mysql_real_escape_string($_POST['language']);
        $coreSubject = mysql_real_escape_string($_POST['coreSubject']);
    
        $query="SELECT ... FROM minorSubject WHERE `$language`='...' AND `$coreSubject`='...'";
    
        $results = mysqli_query($conn, $query);
    
        echo '<option value="0">Select ...</option>'; // A default row
        while ($row = mysqli_fetch_array($results)){
            echo '<option value="'.$row[ID].'">'.$row[...].'</option>'; //Use ID for the value, It's made for that
        }
    }
    

    代码未经测试,所以会有一些错别字...,请根据自己的使用情况进行调整。

    不要犹豫,询问补充信息。

    【讨论】:

    • 哇,超酷!它就像一个魅力,我学到了新东西!非常感谢!但是如何添加一些附加条件,例如: 75%不允许选择辅修科目?我是否会将这些特殊情况添加到我的 php 中并将 loadDD4Value 函数也与第一个下拉列表连接起来?还是在 php 中为每个案例创建表单会更好?
    • 是的,我会在loadDD4Value 中读取百分比值(或其 id)(我会在更新 2 或 3 时读取它的值,不需要将 loadDD4Value 添加到1 的 onChange 事件)。然后我将 3 个参数传递给同一个 php 页面,和之前一样:如果只设置了 percent,我加载 2 和 3 下拉列表,如果设置了 percentlanguagecoreSubject 我加载(返回值)第 4 个下拉列表(仅当 percent75% 时)。在 js 中,我将检查 php 页面是否返回了 0 个选项(或只是默认选项),我将禁用或隐藏第 4 个下拉菜单。
    • 另外,我不知道您是否仅为示例添加了 75% 条件。但是最好在 SQL 查询中使用 percent_id 并有办法在数据库中确定 SQL 请求是否返回值;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2021-06-08
    相关资源
    最近更新 更多