You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:10:49