Как я могу заполнить выпадающий список, выбрав значение из другого раскрывающегося списка?

У меня есть два выпадающих списка (например, состояние и город), извлекая записи обоих выпадающих списков из базы данных mysql и пытаюсь создать инструмент, в котором при выборе любого значения (т.е. любого состояния) из первого выпадающего списка, в то время во втором падении (в городе) должны быть видны только те значения (города) под этим значением (состоянием), выбранным при первом выпадающем списке.

Здесь мой код:

<tr>    
        <td id='hed'><span style="font-family:verdana,geneva,sans-  serif">State</state></td>
        <td>
        <?php 
        $dbcon = mysql_connect("@ip","@username","@password");

        if($dbcon)
        {
            mysql_select_db("@database", $dbcon);
        }
        else
        {
            die('error connecting to the database');
        }

        $qry = "select @value(state) from @tablename  ";
        $result = mysql_query($qry) or die(mysql_error());

        $dropdown = "<select name='@valuename' id='officeItemList' style='cursor:pointer;cursor:hand;'>";
        while($row = mysql_fetch_array($result))
        {           
            $dropdown .= "\r\n<option value='{$row['@value']}' > {$row['@value']} </option>";
        }
        $dropdown .= "\r\n</select>"; 
        echo $dropdown;
        mysql_close($dbcon);
        ?>
        </td> 
    </tr>

        <tr>
        <td id='hed'><span style="font-family:verdana,geneva,sans-serif">City</span></td>
        <td colspan="1"> 
        <?php 
        $dbcon = mysql_connect("@ip","@username","@password");

        if($dbcon)  
        {
            mysql_select_db("@database", $dbcon);
        }  
        else
        {
            die('error connecting to the database');
        }  

        $qry = "select value2(city) from @tablename where ";
        $result = mysql_query($qry) or die(mysql_error()); 

        $dropdown = "<select name='@value2' id='officeItemList' style='cursor:pointer;cursor:hand;'>";
        while($row = mysql_fetch_array($result)) 
        {

            $dropdown .= "\r\n<option value='{$row['@value2']}' > {$row['@value2']} </option>";
        }
        $dropdown .= "\r\n</select>"; 
        echo $dropdown;
        mysql_close($dbcon);
        ?>      


        </td>
    </tr>

Ответ 1

Вы можете использовать AJAX для выбора городов для выбранного состояния. Что-то вроде:

$("select#state").change(
function(){
   var state = $(this).val();
   $.ajax({
  type: "GET",
  url: "get_cities.php/?state=" + state, 
// write a query according to the state selected and return the HTML for the OPTION's
  success: function(cities){
    $("select#cities").html(cities);
   }
}); 
}
);

Вы также можете вернуть json-объект (в этом случае не забудьте добавить dataType:"json") и сделать переход на HTML на стороне клиента, то есть внутри функции success

Ответ 2

Это неправильный путь. Ваш PHP-код полностью выполнен, прежде чем показывать страницу пользователю. Таким образом, второй запрос никогда не может знать, что пользователь что-то делает.

Правильно # 1: Сделайте это на двух страницах. Первая страница содержит первую комбо, и когда она отправляется, вторая страница создается и показывает вторую комбинацию.

Правильно # 2, хотя и не оптимальный: сделайте это на одной странице. Загрузите все возможные записи для второго комбо в некоторый массив JS. Поместите слушателя в первый массив. Когда пользователь выбивает что-то, заполните вторую комбинацию с правильными записями из JS-массива.

Правильный путь № 3 (самый правый из них): сделайте это на странице с запросом AJAX. Пользователь выбирает значение в первом комбо. Его слушатель отправляет запрос на какой-либо сервер script, который возвращает JSON-объект с записями для второго комбо.

Ответ 3

Есть два подхода, которые я бы предложил вам.

Сначала используется только php, но перед тем, как страница будет отображаться, необходимо сохранить все доступные города в каждом состоянии. Это плохое решение!

Я бы предложил использовать AJAX, а вызов Javascript на другой PHP Script может решить вашу проблему!

Используйте jQuery, чтобы получить фреймворк javascript, который делает жизнь проще!

Ваш HTML:

<select id="select-state">
    <option value="0">Select a state</option>
    <option value="ohio">Ohio</option>
</select>
<select id="select-city">
    <option value="0">Select a state first</option>
</select>

Создайте php Script, который делает запрос mysql с заданным состоянием через $_GET [ "state" ] (или $_POST).

Кодировать результат из mysql как объекта JSON и эхо его!

{
    cities: [
        'City 1',
        'City 2',
        ...
    ]
}

php function: json_encode()

Затем вы можете сделать следующее:

$(function(){
    $('#select-state').on("change", function(){
        var state = $(this).val();
        if(state!=0) {
            $.get('your/path/to/cities/script.php?state='+state,function(data){
                if(data.cities) {
                    $('#select-city').empty(); //remove old entries first
                    for (var city in data.cities) {
                        $option = $('<option>').val(city);
                        $('#select-city').append($option);
                    }
                } 
            });
        }
    });
});

Ответ 4

Три быстрых пункта:

  • mysql небезопасен (вместо этого вы должны использовать PDO или mysqli)
  • Стиль должен быть указан с помощью CSS, а не встроенного
  • Вам лучше использовать асинхронный запрос, чтобы пользователь чувствовал себя быстрее

Обратите внимание, что все три вышеуказанных пункта легко достижимы с помощью фреймворка (по крайней мере, на стороне клиента, например CakePHP или Zend, но вы также можете искать Javascript, например Knockout.js для взаимодействия с пользовательским интерфейсом)