如何使用jQuery/AJAX和PHP/MySQL选择第一个下拉菜单来填充第二个下拉菜单?

时间:2022-12-01 10:55:36

I am trying to create a dynamic set of dropdown boxes, using jQuery/AJAX and PHP/MySQL. The first dropdown box will be populated when the page loads based on values from a database. The second dropdown box should display a set of values based on the selection from the first dropdown box. I know there have been similar questions asked on here before, but I haven't found a solution that matches my scenario.

我正在尝试使用jQuery/AJAX和PHP/MySQL创建一组动态下拉框。当页面根据数据库的值加载时,将填充第一个下拉框。第二个下拉框应该根据第一个下拉框的选择显示一组值。我知道以前这里也有类似的问题,但是我还没有找到一个符合我的情况的解决方案。

My query to generate a JSON encoded list of values for the second drop down is functioning, but I am having issues populating it into the actual dropdown form element. Any ideas on where I'm going wrong.

我生成第二个下拉列表的JSON编码值列表的查询正在运行,但将其填充到实际的下拉表单元素中存在问题。任何关于我哪里出错的想法。

Javascript:

Javascript:

<script>
$().ready(function() {

    $("#item_1").change(function () {   

      var group_id = $(this).val();

       $.ajax({
            type: "POST", 
            url: "../../db/groups.php?item_1_id=" + group_id, 
            dataType: "json",
            success: function(data){
                //Clear options corresponding to earlier option of first dropdown
                $('select#item_2').empty(); 
                $('select#item_2').append('<option value="0">Select Option</option>');
                //Populate options of the second dropdown
                $.each( data.subjects, function(){    
                    $('select#item_2').append('<option value="'+$(this).attr('group_id')+'">'+$(this).attr('name')+'</option>');
                });
                $('select#item_2').focus();
            },
            beforeSend: function(){
                $('select#item_2').empty();
                $('select#item_2').append('<option value="0">Loading...</option>');
            },
            error: function(){
                $('select#item_2').attr('disabled', true);
                $('select#item_2').empty();
                $('select#item_2').append('<option value="0">No Options</option>');
            }
        })  

    }); 
});

</script>

HTML:

HTML:

<label id="item_1_label" for="item_1" class="label">#1:</label>
<select id="item_1" name="item_1" />
    <option value="">Select</option>
    <?php
        $sth = $dbh->query ("SELECT id, name, level 
                             FROM groups
                             WHERE level = '1'
                             GROUP by name
                             ORDER BY name");                                   
        while ($row = $sth->fetch ()) { 
            echo '<option value="'.$row['id'].'">'.$row['name'].'</option>'."\n";       
        }
     ?>
</select>

<label id="item_2_label" for="item_2" class="label">#2:</label>
<select id="item_2" name="item_2" />                        
</select>

PHP:

PHP:

<?php

require_once('../includes/connect.php');        

$item_1_id = $_GET['item_1_id'];

$dbh = get_org_dbh($org_id);

$return_arr = array();

$sth = $dbh->query ("SELECT id, name, level 
                     FROM groups
                     WHERE level = '2'
                     AND parent = $item_1_id
                     GROUP by name
                     ORDER BY name");   

while ($row = $sth->fetch ()) { 

    $row_array = array("name" => $row['name'], 
                       "id" => $row['id']); 

    array_push($return_arr,$row_array);     
}

echo json_encode($return_arr);

?>  

Sample JSON Output:

示例JSON输出:

[{"name":"A","id":"0"},{"name":"B","id":"1"},{"name":"C","id":"2"}]

1 个解决方案

#1


4  

First, your document-ready looks a bit off, it should either be $(document).ready(function(){}); or it could be just $(function(){});.

首先,您的文档准备工作看起来有点不对劲,它应该是$(document).ready(function(){});也可以是$(function(){});

Second, you looping over the JSON result looks a bit odd as well. Try something like this instead:

其次,对JSON结果进行循环看起来也有点奇怪。试试这样做吧:

$.each(data.subjects, function(i, val){    
   $('select#item_2').append('<option value="' + val.id + '">' + val.name + '</option>');
});

#1


4  

First, your document-ready looks a bit off, it should either be $(document).ready(function(){}); or it could be just $(function(){});.

首先,您的文档准备工作看起来有点不对劲,它应该是$(document).ready(function(){});也可以是$(function(){});

Second, you looping over the JSON result looks a bit odd as well. Try something like this instead:

其次,对JSON结果进行循环看起来也有点奇怪。试试这样做吧:

$.each(data.subjects, function(i, val){    
   $('select#item_2').append('<option value="' + val.id + '">' + val.name + '</option>');
});