PHP MYSQL - 下拉选择取决于先前的下拉

时间:2016-12-14 16:47:51

标签: php html mysql drop-down-menu

正如我试图在标题中描述的那样,我在从MYSQL数据库中选择行时遇到问题,这取决于同一页面上另一个下拉列表的id。我现在只使用mysql和php 2个月左右,需要帮助。

我有一个带有以下标题的类别表。

| id |名字| PARENT_ID |

有父类别,parent_id为0.而子类别的父类ID为其parent_id,最大深度为1个子类别。例如:

软件开发是一个父类别,id = 18,parent_id = 0.PHP Developer是一个子类别,其id = 30,parent_id = 18。

我有一个下拉列表,我可以按如下方式选择我工作的类别:

$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC";

$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con));

$categories ='';
while($p_row = mysqli_fetch_assoc($p_result))
        {
        $categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>';
        }

<select name="categories[]" class="categories form-control" id="categories" style="width:100%"  multiple>
        <?php echo $categories;?>
</select>

这是有效的,没问题。但是,当我尝试获取第二个下拉列表以显示将其parent_id作为任何选定父类别的ID的可能类别时,我检索到一个下拉列表,其中包含“未找到搜索结果”。下面的代码就是我正在使用的代码:

     $subcategories ='';
     while($p_row = mysqli_fetch_assoc($p_result))
           {
              $c_query = "SELECT * FROM categories WHERE parent_id = ".$categories['id']." ORDER by id ASC";

              $c_result = mysqli_query($con, $c_query) or die(mysqli_error($con));

              while($c_row = mysqli_fetch_assoc($c_result))
                 {
                    $subcategories .='<option class="option" value="c::'.$c_row['id'].'">' .$c_row['category_name'].'</option>';
                 }

            }

             <select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%"  multiple>

                            <?php echo $subcategories ?>
                </select>

我有什么遗失的东西吗?作为PHP和MYSQL的相对初学者,我非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

您的第二个查询基于其parent_id检索子类别没有任何问题,因此您在那里很好。您可以像这样轻松测试:

SELECT * FROM categories WHERE parent_id = 1 ORDER by id ASC

你如何为$ categories ['id']提供价值,因为你的代码中没有任何东西用'id'索引创建这个数组?此外,您已经使用名为$ categories的变量作为字符串,因此您不应该在没有充分理由的情况下重复使用该变量名称。

由于看起来你想根据第一个选择填充第二个多选框和子类别,你需要使用一些javascript + AJAX来提交第二个查询并将结果写在第二个选择元素中。

使用一些jquery应该有所帮助。试试这些例子,你就会明白这一点。

myselect.php,其中包含用于选择类别的界面:

<?php
$con = mysqli_connect("host", "username", "password", "database");

$p_query = "SELECT * FROM categories WHERE parent_id = 0 ORDER by id ASC";

$p_result = mysqli_query($con, $p_query) or die(mysqli_error($con));

$categories ='';

while($p_row = mysqli_fetch_assoc($p_result))
{
    $categories .='<option class="option" value="p::'.$p_row['id'].'">' .$p_row['category_name'].'</option>';
}
?>
<html>
<head>
    <script
            src="https://code.jquery.com/jquery-3.1.1.min.js"
            integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
            crossorigin="anonymous">
    </script>
</head>
<body>
Shift or Ctrl + Click to pick more than one<br />
<form id="categoryform" method="POST">
<select name="categories[]" class="categories form-control" id="categories" style="width:100%"  multiple>
        <?php echo $categories;?>
</select>
</form>
Here's what it contains<br />
<form method="POST">
<select name="subcategories[]" class="categories form-control" id="subcategories" style="width:100%"  multiple DISABLED>
</select>

</form>

<script>

    $(document).ready(function() {
        $('#categories').click(function(){
            $('#subcategories').children().remove().end();
            var data = $('#categoryform').serialize();

            $.post("mysubselect.php", data).done(function(data){
                var response = JSON.parse(data);

                for (var k in response){
                    $('#subcategories').append('<option class="option" value="c::' + response[k]['id'] + '">' + response[k]['category_name'] + '</option>');
                }
            });
        });
    })

</script>

</body>
</html>

以下是从AJAX请求返回数据的脚本示例。

mysubselect.php:

<?php
$con = mysqli_connect("host", "username", "password", "database") or die(mysqli_error());
$result = array();

foreach ($_POST["categories"] as $k => $v) {
    $category_token = explode('::', $v);
    $category_id = mysqli_real_escape_string($con, $category_token[1]);

    $query = mysqli_query($con, "SELECT * FROM categories WHERE parent_id = " . $category_id . " ORDER BY id ASC") or die(mysqli_error());

    while($r = mysqli_fetch_assoc($query)){
       $result[] = $r;
    }
}

    print json_encode($result);