正如我试图在标题中描述的那样,我在从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的相对初学者,我非常感谢任何帮助或建议。
答案 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);