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
相关产品推荐
相关产品推荐

