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

求助:PHP实现按分类获取所有文章标题的方法

解决按分类获取所有对应文章标题的问题

你当前的核心问题是SQL查询里用了GROUP BY a.category_id,这会让每个分类只返回单条文章记录,而不是该分类下的所有文章。另外注意你描述的表是categories,但原代码SQL里写的是article_categories,这里我先按你说明的categories表来修正,如果你实际表名是后者,替换即可。

下面给你两种实用的解决方案:

方案一:先取分类,再逐个查对应文章(逻辑清晰,适合小数据量)

这种方式代码直观,容易维护,适合分类和文章数量不多的场景。

1. 修正Categories类的方法

新增获取所有分类、以及按分类ID取文章的方法:

class Categories {
    // 获取所有分类的基础信息
    public static function find_all_categories() {
        return self::find_by_sql("SELECT id, names FROM categories");
    }

    // 根据分类ID获取该分类下的所有文章
    public static function get_articles_by_category($category_id) {
        // 建议用参数绑定避免SQL注入,这里假设你的find_by_sql支持参数传入
        $sql = "SELECT title FROM article WHERE category_id = ?";
        return self::find_by_sql($sql, [$category_id]);
    }
}

2. 修改首页展示代码

循环每个分类,再嵌套循环展示该分类下的所有文章:

<?php $cats = Categories::find_all_categories(); ?>
<?php foreach($cats as $cat): ?>
    <h4><?php echo htmlspecialchars($cat->names); ?></h4>
    <ul>
        <?php 
        $articles = Categories::get_articles_by_category($cat->id);
        // 处理分类下无文章的情况
        if(empty($articles)): ?>
            <li>暂无文章</li>
        <?php else: ?>
            <?php foreach($articles as $article): ?>
                <li><?php echo htmlspecialchars($article->title); ?></li>
            <?php endforeach; ?>
        <?php endif; ?>
    </ul>
<?php endforeach; ?>

方案二:一次查询所有数据,PHP端分组(减少数据库请求)

如果你的分类和文章数量较多,多次查询数据库会影响性能,这种方式只需要一次数据库请求,然后在PHP里完成分组。

1. 修改Categories类的查询方法

class Categories {
    public static function get_categories_with_articles() {
        // 左连接确保即使分类下无文章也能显示
        $sql = "SELECT c.id AS category_id, c.names, a.title 
                FROM categories c 
                LEFT JOIN article a ON c.id = a.category_id 
                ORDER BY c.id";
        $raw_results = self::find_by_sql($sql);

        // 在PHP中按分类ID分组整理数据
        $grouped_data = [];
        foreach($raw_results as $row) {
            $cat_id = $row->category_id;
            // 初始化分类信息
            if(!isset($grouped_data[$cat_id])) {
                $grouped_data[$cat_id] = [
                    'names' => $row->names,
                    'articles' => []
                ];
            }
            // 过滤掉无文章的空记录(左连接会产生title为null的情况)
            if(!empty($row->title)) {
                $grouped_data[$cat_id]['articles'][] = $row->title;
            }
        }
        return $grouped_data;
    }
}

2. 修改首页展示代码

<?php $categories = Categories::get_categories_with_articles(); ?>
<?php foreach($categories as $cat): ?>
    <h4><?php echo htmlspecialchars($cat['names']); ?></h4>
    <?php if(empty($cat['articles'])): ?>
        <p>暂无文章</p>
    <?php else: ?>
        <ul>
            <?php foreach($cat['articles'] as $title): ?>
                <li><?php echo htmlspecialchars($title); ?></li>
            <?php endforeach; ?>
        </ul>
    <?php endif; ?>
<?php endforeach; ?>

额外注意事项

  • 一定要用htmlspecialchars()转义输出内容,防止XSS攻击,这是Web开发的基础安全规范。
  • 如果你的find_by_sql方法不支持参数绑定,在方案一的get_articles_by_category方法里,要对$category_id做转义处理(比如用mysqli_real_escape_string),避免SQL注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:02:43