【问题标题】:PHP MYSQL - Drop down select dependant on a previous drop downPHP MYSQL - 下拉选择依赖于先前的下拉
【发布时间】:2017-04-30 02:19:09
【问题描述】:

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

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

|标识 |姓名 | parent_id|

有父类,parent_id 为 0。子类以父类的 id 作为其 parent_id,最大深度为 1 个子类。例如:

软件开发是 id = 18 和 parent_id = 0 的父类别。PHP 开发人员是 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 的相对初学者,我将非常感谢任何帮助或建议。

【问题讨论】:

  • 这个问题应该已经解决了。
  • var_dump()print_r()echo 是你的朋友。在不同的地方试用它们以进行调试。所以首先检查你的$p_result,然后检查$c_query等等......

标签: php html mysql drop-down-menu


【解决方案1】:

您的第二个查询根据其 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);

【讨论】:

  • 感谢您的快速回复,汤姆。虽然我是 PHP 和 MYSQL 的相对初学者,但我是 JQuery 的真正新手。对于您在 myselect.php 中提供的脚本,我想澄清实际发生的情况。当从 categories[] 中选择一个类别时,所选类别的任何子项都会从列表中删除?并且任何选定的类别都被添加到列表数据中,然后子选择查询是针对数据列表的。
  • @ochhii 你是对的。每当单击类别表单元素时,都会在此示例中删除#subcategory 的子元素(选项)。原因如下:假设您有 PHP Developer 和 Python Developer 作为 Software Development 父级的两个条目。如果您每次都没有删除选项,它们会通过 .append() 复制。
猜你喜欢
  • 2012-06-11
  • 2021-02-14
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
相关资源
最近更新 更多