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

PHP渲染file-tree文件树时同文件夹多数据展示异常如何解决

问题根因

你的代码存在两处核心问题:

  • 逻辑层面:HTML标签开闭规则错误,每遍历到一条数据,无论是否属于同一个hasid对应的文件夹,都会单独生成一组<ul>标签,并且直接闭合外层文件夹的<li>标签,直接导致同一个文件夹下的多个文件被拆成了独立的文件夹节点,无法完成同组归类。
  • 兼容层面:你代码里用的mysql_*系列数据库函数从PHP 5.5开始废弃,PHP7及以上版本已经完全移除,正式环境请替换为mysqli或者PDO扩展操作数据库,避免兼容问题和SQL注入风险。
修复代码

核心调整思路:只有遍历到新的hasid(新文件夹)时才创建新的文件夹节点,同文件夹下的所有文件统一归入该节点下的同一个子<ul>容器,循环过程中按需闭合上一个文件夹的标签,循环结束后补全最后一个文件夹的闭合标签。

<ul class="file-tree">
<?php
// 以下代码仅修正嵌套逻辑,正式使用请替换mysql_*系列方法为mysqli/PDO
$que = mysql_query('SELECT * FROM dosya ORDER BY hasid ASC');
$lastHasid = null;
if (mysql_num_rows($que) > 0) {
    while($b = mysql_fetch_array($que, MYSQL_ASSOC)) {
        // 检测到切换到新文件夹
        if ($b['hasid'] != $lastHasid) {
            // 非首个文件夹的话,先闭合上一个文件夹的子列表和节点标签
            if ($lastHasid !== null) {
                echo '</ul></li>';
            }
            $lastHasid = $b['hasid'];
            // 输出新文件夹节点,打开子列表容器
            ?>
            <li class="file-tree-folder"><?= htmlspecialchars($b['hasid']) ?>
                <ul>
            <?php
        }
        // 输出当前文件项到当前打开的子列表中
        ?>
            <li><?= htmlspecialchars($b['adi']) ?></li>
        <?php
    }
    // 循环结束后闭合最后一个文件夹的标签
    if ($lastHasid !== null) {
        echo '</ul></li>';
    }
}
?>
</ul>

代码里额外加了htmlspecialchars处理输出内容,避免文件名或者文件夹名里包含特殊字符时破坏HTML结构。

效果说明

修复后生成的HTML完全符合嵌套列表规范:每个文件夹ID对应唯一的文件夹节点,同个文件夹下的所有文件都归在该节点的子列表内,不会再出现每个文件单独生成一个文件夹节点的错乱问题。
原错误运行效果参考:
错误运行效果

内容的提问来源于stack exchange,提问作者tetey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:46:00