PHP实现SQL结果按子分类生成Div,无数据分类也需创建
解决方案
要实现即使子分类无视频也生成对应div的需求,核心思路是先明确所有需要展示的子分类列表,再逐个为每个子分类生成容器,最后将对应视频填充进去。具体步骤如下:
1. 准备子分类列表
你可以选择两种方式获取子分类:
- 如果是固定的4个子分类,直接定义数组;
- 如果子分类是动态的(可能新增),从数据库查询该主分类下所有存在的子分类。
2. 按子分类分组视频数据
把查询到的视频按子分类归类,方便后续快速查找对应分类的视频。
3. 遍历子分类生成容器
逐个为每个子分类创建div,再填充该分类下的视频(无视频时可添加提示)。
修改后的完整代码
<?php // 1. 查询该主分类下的所有视频 $stmt = $conn->prepare("SELECT * FROM VIDEOS WHERE categorie=:category ORDER BY categorie ASC, subcategorie ASC"); $stmt->bindParam(':category', $_POST['category']); $stmt->execute(); $result = $stmt->fetchAll(PDO::FETCH_ASSOC); // 2. 获取需要展示的所有子分类(二选一) // 方式一:固定子分类(适合已知只有4个的情况) // $requiredSubcategories = ["子分类1", "子分类2", "子分类3", "子分类4"]; // 方式二:从数据库动态获取该主分类下的所有子分类 $stmtSubcats = $conn->prepare("SELECT DISTINCT subcategorie FROM VIDEOS WHERE categorie=:category ORDER BY subcategorie ASC"); $stmtSubcats->bindParam(':category', $_POST['category']); $stmtSubcats->execute(); $requiredSubcategories = $stmtSubcats->fetchAll(PDO::FETCH_COLUMN, 0); // 3. 将视频按子分类分组 $videosBySubcat = []; foreach ($result as $video) { $subcat = $video["subcategorie"]; if (!isset($videosBySubcat[$subcat])) { $videosBySubcat[$subcat] = []; } $videosBySubcat[$subcat][] = $video; } // 4. 遍历子分类生成容器和内容 foreach ($requiredSubcategories as $subcat) { // 输出子分类容器 echo "<div class='subcategory_container active' id='" . htmlspecialchars($subcat) . "'>"; echo "<h3 class='subcategory_title'>" . htmlspecialchars($subcat) . "</h3>"; // 检查该子分类是否有视频 if (isset($videosBySubcat[$subcat]) && !empty($videosBySubcat[$subcat])) { // 输出该分类下的所有视频 foreach ($videosBySubcat[$subcat] as $video) { echo "<div class='video_div'> <iframe width='196' height='350' src='" . htmlspecialchars($video['linkembed']) . "'></iframe></div>"; } } else { // 无视频时的提示(可根据需求修改或删除) echo "<p style='text-align:center; padding:20px;'>暂无视频</p>"; } echo "</div>"; } ?>
关键改进点
- 强制生成所有子分类容器:不再依赖查询结果中的视频来触发容器生成,而是先确定所有需要展示的子分类,确保每个子分类都有对应的div。
- 数据分组优化:通过
$videosBySubcat数组将视频按子分类归类,避免了原代码中循环判断的冗余逻辑。 - 安全防护:使用
htmlspecialchars()转义输出内容,防止XSS注入风险(新手容易忽略的细节)。
内容的提问来源于stack exchange,提问作者Terhert
相关产品推荐
相关产品推荐

