2016-12-14 131 views
0

正如我试图在标题中描述的,我从一个MYSQL数据库中选择行的问题取决于同一页上另一个下拉列表的ID。我只用了2个月左右的时间,现在需要帮助。PHP MYSQL - 下拉选择取决于前一个下拉列表

我有一个类别表,下面的标题。

| id |名称| PARENT_ID |

还有父类别,其parent_id为0。父类别的子类别为其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的初学者,我会非常感谢任何帮助或建议。

+1

这个问题可能已经解决过。 – Strawberry

+0

'var_dump()','print_r()'和'echo'是你的朋友。在各个地方进行调试。所以首先检查你的'$ p_result',接下来的'$ c_query'等...... – user1801810

回答

0

你的第二个查询根据它们的parent_id检索子类别没有任何问题,所以你很好。你可以像这样测试很容易:

SELECT * FROM类别WHERE PARENT_ID = 1 ORDER BY ID ASC

你是如何提供价值$类别[“身份证”]因为有没有在你的代码中创建这个具有'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); 
+0

谢谢你的回复,汤姆。虽然我是一个PHP和MYSQL的相对初学者,但我真的是JQuery的新手。 对于您在myselect.php中提供的脚本,我想澄清实际发生的情况。当从类别[]中选择一个类别时,所选类别的任何一个孩子将从列表中删除?并且将所选类别中的任何一个添加到列表数据中,然后针对数据列表查询子查询。 – ochhii

+0

@ochhii你是对的。无论何时单击类别表单元素,本例中都将删除#subcategory的子元素(选项)。原因如下:比方说,您将PHP开发人员和Python开发人员作为Software Development的父项的两个条目。如果每次通过.append()复制它们时都没有删除选项。 –

相关问题