根据第一个下拉选择填充 HTML/PHP 下拉列表

Posted

技术标签:

【中文标题】根据第一个下拉选择填充 HTML/PHP 下拉列表【英文标题】:Populate HTML/PHP Dropdown Based on First Dropdown Selection 【发布时间】:2014-05-10 03:46:45 【问题描述】:

我有 1 个用于类别(食物、饮料等)的下拉菜单

在我的 mysql 表 (t_menu_category) 我有:

+----+---------------+-------------------+----------------------+
| ID | category_name | sub_category_name | category_description |
+----+---------------+-------------------+----------------------+
|  1 | Food          | Curries           | Spicy Curries        |
|  2 | Food          | Meat              | Lamb, Pork, Chicken  |
|  3 | Drinks        | Alcohol           | Fine Tasting Lager   |
|  4 | Desserts      | Cakes             | Chocolate Cake       |
+----+---------------+-------------------+----------------------+

我有第一个下拉菜单显示“category_name”的值,但我想要的是当我选择食物时,我希望第二个下拉框更新并且只显示第一个选择的“sub_category_name”的值,例如。 “Food”等于数据库中的“Food”。

所以如果我在第一个下拉框中选择“食物”,第二个下拉框将只显示“咖喱”和“肉类”。

html

<form method="post" action="<?php $_SERVER['PHP_SELF'] ?>"> 

    <p> 
        <label for="item_name">Item Name</label>
        <input id="item_name" name="item_name" required="required" type="text" placeholder="Item Name" />
     </p>
     <p>
        <label for="item_description">Item Description</label>
        <textarea rows="3" cols="100%" required="required" name="item_description">Item Description</textarea>
    </p>
    <p>
        <label for="item_category">Item Category</label>
        <select id="item_category" name="item_category" required="required">
            <option selected="selected">-- Select Category --</option>
            <?php 
            $sql = mysql_query("SELECT category_name FROM t_menu_category");
            while ($row = mysql_fetch_array($sql))
            ?>

            <option value="<?php echo $row['category_name']; ?>"><?php echo $row['category_name']; ?></option>

            <?php
            // close while loop 
            
            ?>
        </select>
    </p>

    <p class="center"><input class="submit" type="submit" name="submit" value="Add Menu Item"/></p>
</form>

任何帮助都将受到高度赞赏:)

【问题讨论】:

一种方法是将您的 PHP 放在另一个文件(网络服务)中,并在第一次选择中完成选择时使用 AJAX 调用它。 您能否详细说明您正在寻找哪种类型的解决方案?你希望这发生在浏览器中的 javascript 中吗?或者您是否希望用户提交表单,然后使用现在呈现的第二个下拉菜单重新加载页面? 我在这里回答了一个类似的问题:***.com/questions/22728170/…,它具有根据发送的值重新加载保管箱的代码。事实上,正如@MamaWalter 所说,你需要 AJAX 我想要它,所以第二个下拉列表被禁用,然后当用户从第一个下拉列表中选择一个选项时,它会立即使用与第一个下拉列表对应的值启用。我在这个网站上看到了很多例子,但没有任何工作。 我知道你只能看到 1 个 HTML 下拉列表,因为我把它省略了所以有人可以告诉我怎么做我尝试使用获取 id 然后将其发送到 'ajax.php?value =Food' 但没有任何反应,所以如果有人能提供帮助,我将不胜感激。 【参考方案1】:

您可以使用请求创建一个 PHP 文件并使用 AJAX 调用它。

getSubCategory.php

<?php
$category = "";
if(isset($_GET['category']))
    $category = $_GET['category'];


/* Connect to the database, I'm using PDO but you could use mysqli */
$dsn = 'mysql:dbname=my_database;host=127.0.0.1';
$user = 'my_user';
$password = 'my_pass';

try 
    $dbh = new PDO($dsn, $user, $password);
 catch (PDOException $e) 
    echo 'Connection failed: ' . $e->getMessage();


$sql = 'SELECT sub_category_name as subCategory FROM t_menu_category WHERE category_name = :category';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(':category', $category);
$stmt->execute();

return  json_encode($stmt->fetchAll());

并添加一些 jquery 以在选择类别时捕获并询问服务器相应的子类别:

<script>
    $(document).ready(function () 
        $('#item_category').on('change', function () 

            //get selected value from category drop down
            var category = $(this).val();

            //select subcategory drop down
            var selectSubCat = $('#item_sub_category');

            if ( category != -1 ) 

                // ask server for sub-categories
                $.getJSON( "getSubCategory.php?category="+category)
                .done(function( result)     
                    // append each sub-category to second drop down   
                    $.each(result, function(item) 
                        selectSubCat.append($("<option />").val(item.subCategory).text(item.subCategory));
                    );
                    // enable sub-category drop down
                    selectSubCat.prop('disabled', false);                
                );

             else                 
                // disable sub-category drop down
                selectSubCat.prop('disabled', 'disabled');
            
        );    

    );
</script>

还为您的第一个选项添加一个值:

<option value="-1" selected="selected">-- Select Category --</option>

【讨论】:

【参考方案2】:

我有一个简单的解决方案来根据国家/地区 php/javascript/mysql 选择州

MySQL 表

country 
      country_code varhar(5)
      country_name varchar(100)

state
      country_code varhar(5)
      state_code   varchar(5)
      country_name varchar(100)

main.php 文件中的国家/州选择

<html>
   <body> 
     Country
            <?php
                $sql="SELECT * FROM country order by country_name";
                $rs=$conn->Execute($sql);
                echo '<select  value="'.$country_code.'"  name="country_code"  id="country_list"   onChange="stateList(this.value);" />';
                echo  '<option value="">--Select--</option>';
                $rs->MoveFirst();
                while (!$rs->EOF) 
                    echo  '<option value="'.$rs->fields['country_code'].'"';
                    if  ($rs->fields['country_code'] == $country_code) echo " selected";
                    echo  '>'.$rs->fields['country_name'].'</option>';
                    $rs->MoveNext();
                
                echo '</select>';
            ?>

     State
            <?php
                $sql="SELECT * FROM state where contry_code = '$country_code' order by state_name";
                $rs=$conn->Execute($sql);
                echo '<select   value="'.$state_code.'"  name="state_code" id="state_list"   />';
                echo  '<option value="">--Select--</option>';
                $rs->MoveFirst();
                while (!$rs->EOF) 
                    echo  '<option value="'.$rs->fields['state_code'].'"';
                    if  ($rs->fields['state_code'] == $state_code) echo " selected";
                    echo  '>'.$rs->fields['state_name'].'</option>';
                    $rs->MoveNext();
                
                echo '</select>';
            ?>
   </body>
</html>

Java 脚本

<script type="text/javascript">
function stateList(val) 
   var select = document.getElementById( "state_list" );
   var url    = "get_statelist.php?country_code="+val;
   $.ajax(
      type: "GET",
      url: url,
      data:'',
      success: function(data)
         $("#state_list").html(data);
      
   );

get_stataelist.php

<?php
session_start();
$country_code = $_GET['country_code'];
$conn        = connect_db()  //Make your own connection entry conn with Server,DB User ID, DB Password and DB Name

if  ($country_code  !=  "") 
    $sql="SELECT * FROM state where coutry_code = '$country_code'  order by state_name";
    $rs=$conn->Execute($sql);

    echo  '<option value="">--Select--</option>';

    $rs->MoveFirst();
    while (!$rs->EOF) 
        echo  '<option value="'.$rs->fields['state_code'].'">'.$rs->fields['state_name']."</option>";
        $rs->MoveNext();
    


?>

【讨论】:

以上是关于根据第一个下拉选择填充 HTML/PHP 下拉列表的主要内容,如果未能解决你的问题,请参考以下文章

如何根据使用 jQuery/AJAX 和 PHP/MySQL 选择的第一个下拉列表填充第二个下拉列表?

根据另一个下拉列表中的选择填充一个下拉列表,然后重定向

使用Angular 4根据第一个下拉列表选择第二个下拉列表

使用填充的下拉列表复制新的 php 表行

根据下拉列表的值创建 2 个下拉列表和一个表

根据角度 5 中的条件填充城市下拉列表