PHP+MySQL三级分类列表循环功能异常求助
问题解决:扩展产品目录系统支持三级分类展示
你的问题出在分类列表的渲染逻辑上——当前代码仅实现了一级分类→二级分类的两层循环,没有处理二级分类下的三级分类。下面是针对性的修复方案,同时优化代码的安全性和可扩展性。
一、核心修改:用递归函数渲染多级分类
递归函数可自动处理任意层级的分类(不仅限于三级),比硬编码多层循环更灵活。修改后的下拉列表代码如下:
<form action="<?php echo $_SERVER["PHP_SELF"]; ?>?action=newcat" method ="POST"> Category Name : <input type = "text" name = "cat_name" maxlength="250"><br><br> Sub of category : <select name="lcat_id"> <option value=''>0</option> <?php // 递归渲染分类的函数 function renderCategories($db_connect, $parentId = 0, $indent = '') { // 使用预处理语句防止SQL注入 $stmt = $db_connect->prepare("SELECT lcat_id, lcat_name FROM " . TABLE_CATS . " WHERE sub_cat = ? ORDER BY lcat_id"); $stmt->bind_param("i", $parentId); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { echo "<option value='{$row['lcat_id']}'>{$indent}{$row['lcat_name']}</option>"; // 递归渲染当前分类的子分类,增加缩进符号 renderCategories($db_connect, $row['lcat_id'], $indent . '-> '); } $stmt->close(); } // 调用递归函数,从顶级分类(sub_cat=0)开始渲染 renderCategories($db_connect); ?> </select> <input type = "submit" value = "New Category"><br> </form>
二、修复新增分类逻辑的问题
原代码的新增分类部分存在SQL注入风险和逻辑错误,一并修复:
<?php if ($_GET['action']=="newcat"){ if (empty($_POST['cat_name'])){ print "请输入分类名称.<br/><a href=".$_SERVER["PHP_SELF"].">返回</a>"; exit; } $catName = trim($_POST['cat_name']); $parentId = (int)$_POST['lcat_id']; // 检查分类名称是否已存在(使用预处理语句) $stmt = $db_connect->prepare("SELECT lcat_name FROM " . TABLE_CATS . " WHERE lcat_name = ?"); $stmt->bind_param("s", $catName); $stmt->execute(); $stmt->store_result(); if ($stmt->num_rows > 0) { print "分类 <b>{$catName}</b> 已存在于 <b>{$mysql_db}</b> 中,请更换名称.<br/><a href=".$_SERVER["PHP_SELF"].">返回</a>"; $stmt->close(); exit; } $stmt->close(); // 插入新分类(使用预处理语句) $stmt = $db_connect->prepare("INSERT INTO " . TABLE_CATS . " (lcat_name, lcat_path, sub_cat) VALUES (?, ?, ?)"); // 若需要层级路径,可修改为获取父分类路径后拼接,原代码直接存cat_name,此处保留原有逻辑 $catPath = $catName; $stmt->bind_param("ssi", $catName, $catPath, $parentId); if ($stmt->execute()) { echo "成功添加分类 :<b> {$catName}</b> 到 <b>{$mysql_db}</b><br/><a href=".$_SERVER["PHP_SELF"].">返回</a>."; } else { echo "添加分类失败,请重试.<br/><a href=".$_SERVER["PHP_SELF"].">返回</a>."; } $stmt->close(); } ?>
三、关键说明
- 递归函数优势:后续扩展到四级、五级分类时,无需修改渲染逻辑,函数会自动处理所有子分类层级。
- SQL注入防护:原代码直接拼接用户输入到SQL语句中,存在严重安全风险,修复后使用mysqli预处理语句绑定参数,彻底避免注入。
- 逻辑修复:原代码中
$row_cat['cat_name']是错误字段名(表中为lcat_name),修复后使用正确字段判断,同时简化了重复查询逻辑。
内容的提问来源于stack exchange,提问作者villersexel
相关产品推荐
相关产品推荐

