我一直在搞乱子类别并为测试目的创建了一个新的数据库类别。
Table newcategories
category_id (int) AUTO
name (varchar) NOT NULL
parent (int) NULL
category_desc (text) NULL
sort_order (int) NOT NULL
我在数据库中输入了一些类别和子类别,但在尝试在选择菜单中显示具有相应子类别的主要类别时遇到了问题。
<?php
// // // query database to return all existing main categories
$selectMainCat='SELECT *
FROM newcategories
WHERE parent is NULL
ORDER BY sort_order ASC';
$smc=$conn->query($selectMainCat);
while($rowsmc = $smc->fetch_assoc()) {
$parent_id = $rowsmc['category_id'];
?>
<optgroup label="<?php echo "{$rowsmc['name']}";?>">
<option value="<?php echo"{$rowsmc['category_id']}"; ?>"
<?php
if (isset($catID) && $catID=="{$rowsmc['category_id']}")
echo "selected";
?>
>
<?php
echo "{$rowsmc['name']}";?></option>
<?php
// // // query database to return all sub categories
$selectSubCat='SELECT *
FROM newcategories
WHERE parent = "$parent_id" ';
$ssc=$conn->query($selectSubCat);
while($rowssc = $ssc->fetch_assoc()){
?>
<option value="<?php echo"{$rowssc['category_id']}"; ?>"
<?php
if (isset($catID) && $catID=="{$rowssc['category_id']}")
echo "selected";
?>
>
<?php
echo "{$rowssc['name']}";?></option>
<?php
}
?>
</optgroup>
<?php
}
?>
以下是我输入db
的内容category_id name parent category_desc sort_order
1 Fruits NULL NULL 1
2 Vegetables NULL NULL 2
3 Apple 1 NULL 1
4 Arugula 2 NULL 1
5 Cabbage 2 NULL 2
6 Honeycrisp 3 NULL 1
7 Braeburn 3 NULL 2
HTML OUTPUT
<select class="form-control m-b" name="catID" id="catID">
<option value="" disabled selected> Select Main Category</option>
<option value="" disabled></option>
<optgroup label="Fruits">
<option value="1" >Fruits</option>
</optgroup>
<optgroup label="Vegetables">
<option value="2" >Vegetables</option>
</optgroup>
</select>
答案 0 :(得分:1)
您遇到的问题是,由于您使用的是non-interpolating quotes,因此未正确插值。可以使用占位符值正确执行查询来解决此问题:
$ssc = $conn->prepare('SELECT * FROM newcategories WHERE parent=?');
$ssc->bind_param('i', $parent_id);
$result = $ssc->execute();
while ($rowssc = $result->fetch_assoc()) {
...
}
将任何类型的数据直接放入查询中非常危险,尤其通过$_GET
,$_POST
或$_REQUEST
直接来自用户的内容。即使$_COOKIE
和$_SESSION
也可能有问题,因为这些可能包含以前由用户提供的值,或者用户具有某种程度的控制权。