【问题标题】:How to filter multiple categories and show it's posts/articles PHP如何过滤多个类别并显示它的帖子/文章 PHP
【发布时间】:2014-06-28 19:03:28
【问题描述】:

我创建了一个页面,显示单个类别下的所有帖子,即如果我点击音乐类别,我将获得与音乐类别相关的所有文章。

但我的目标是创建一个过滤选项,该选项可以过滤掉某些类别,并且只显示与您过滤的类别相关的所有帖子,即我将有一堆带有复选框的类别,如果我检查音乐和游戏并提交我想查看音乐和游戏下的所有帖子的表格。

这是我用来显示 1 个单一类别下的所有帖子的代码。

<?php require('includes/config.php'); 

$catID = ($_GET['id']);
$catName = ($_GET ['cat']);



?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>XS</title>
    <link rel="stylesheet" href="style/normalize.css">
    <link rel="stylesheet" href="style/main.css">
</head>
<body>

    <div id="wrapper">

        <h1>XS <span style="color:blue;"> >> </span> <span><?php echo $catName); ?></span> </h1>

        <hr />

        <div class="grid">

        <?php
            try {
                $stmt = "SELECT * FROM blog_posts NATURAL JOIN blog_posts_categories WHERE catID = $catID";

                $query = $db->prepare($stmt);
                $query->execute();

                $numrows = $query->rowCount();
                if($numrows > 0){

                    while($row = $query->fetch()){
                        echo '<ol class="thumb-grid group">';
                            echo '<li>';
                                echo '<a href="viewpost.php?id='.$row['postID'].'">';
                                    echo '<img src="scripts/t.php?src='.$row['postImage'].'&w=236&h=236&q=95" alt="'.$row['postTitle'].'" title="'.$row['postTitle'].'" />';
                                echo '</a>';
                            echo '</li>';
                        echo '</ol>';
                    }

                }

            } catch(PDOException $e) {
                echo $e->getMessage();
            }
        ?>


        </div>

    </div>


</body>
</html>

所以我从表单开始,但它不是很好,因为它只发送类别名称而不是相应的类别 ID。

<form action="c.php" method="get">
  <fieldset>
    <legend>Filter Categories</legend>
    <p>
      <label><input type="checkbox" name="cat[]" value="Music"/> Music</label>
      <label><input type="checkbox" name="cat[]" value="Games"/> Games</label>
      <label><input type="checkbox" name="cat[]" value="Tech"/> Tech</label>
    </p>
  </fieldset>
  <button type="submit">Filter</button>
  <button type="reset">Reset</button>
</form>

这是我的数据库结构:

blog_posts 表格

postID int,主要,自动递增。

postTitle varchar

postCont 文本

blog_categories 表格

catID int,主要,自动增量。

catName varchar

blog_posts_categories 表格

postID int

catID int


数据库内容:

blog_posts

postID  |  postTitle  | postCont

  1          Post1       Cont1
  2          Post2       Cont2
  3          Post3       Cont3
  4          Post4       Cont4
  5          Post5       Cont5

blog_categories

catID   |   catName

  1          Music
  2          Games
  3        Technology

blog_posts_categories

postID  |  catID

  1          1
  1          2
  1          3
  2          2
  3          3
  4          1
  4          2
  5          2
  5          3

【问题讨论】:

  • 您正在呼应内爆的 $links。您能否编辑您的帖子并向我们展示回显的内容以及您尝试运行的生成查询是什么?
  • 我这样做只是为了测试,实际上从未删除它。代码现在只选择 1 个类别 id 并显示与该 1 个类别相关的所有帖子。我想要实现的是过滤多个类别,以显示与您过滤的类别相关的所有帖子。
  • 如果你有一个 catIDs 列表,是什么阻止你运行这样的东西:“SELECT * FROM blog_posts NATURAL JOIN blog_posts_categories WHERE catID in (".implode(",", $catIDs)." )" ?

标签: php mysql filter blogs categories


【解决方案1】:

表单内容

将您的复选框值替换为实际的类别 ID,并将类别名称放在标签内部文本内容中:

<input type="checkbox" name="cat[]" value="<?php echo $row['catID'];?>"/><?php echo $row['catName'];?></input>

您可以从数据库(blog_categories 表)中获取该数据,并对结果集的行进行简单循环。

表格展示

现在您应该在$_GET["cat"] 中获得一个包含所有选定类别ID 的数组;您只需要用逗号作为分隔符将其分解,然后将其放入查询中,将WHERE catID = $catID" 替换为WHERE catID IN ($catID)"。不要忘记首先清理您的请求数据(通过检查值是否为整数)。

最后,您可能希望通过在额外的列中添加帖子所属的类别来更新表格显示,或者按类别对数据进行排序,并为每个类别设置子表。这留作练习。

【讨论】:

    【解决方案2】:
       <?php 
          $query = "SELECT * FROM `name` WHERE `status` = '1' ";
          if(isset($_GET['catname'])){
              $cat1 = $_GET['catname'];
            $query .= " AND `category` = '$cat1' ";
          }
          $query .= " ORDER BY `ptid` DESC ";
    
          $result = mysql_query($query);
          $nums = mysql_num_rows($result);
          if($nums > 0){
            while($rows = mysql_fetch_row($result,MYSQL_ASSOC)){
              $ptid_dec = $rows['ptid'];
              $mult = '987694929';
              $ptid = $ptid_dec*$mult;
              $productname = $rows['productname'];
              $productimage = $rows['productimage'];
              $description = $rows['description'];
       ?>
    
            <?php echo $productimage; ?>" 
            <div class="caption">
              <a href="admin/<?php echo $productimage; ?>" target="_blank"><h4 class="center listdesign"><strong><?php echo $productname; ?></strong></h4></a>
    
    
        <?php } } ?>
    

    【讨论】:

    • 使用表进行上述查询
    【解决方案3】:
    <script>
    $("#example1").DataTable({
      "pageLength": 9,
      "lengthChange": false,
      "bFilter": false,
      "bInfo": false,
      "bAutoWidth": false
    });
    $('#example2').DataTable({
      "paging": true,
      "lengthChange": false,
      "searching": false,
      "ordering": true,
      "info": true,
      "autoWidth": false
    });
    

    【讨论】:

      【解决方案4】:
         <script>
       function paginateScroll() {
      $('html, body').animate({
         scrollTop: $(".topheader").offset().top
      }, 100);
      console.log('pagination button clicked'); //remove after test
      $(".paginate_button").unbind('click', paginateScroll);
      $(".paginate_button").bind('click', paginateScroll);
      }
      paginateScroll();  
      </script>
      

      【讨论】:

        猜你喜欢
        • 2022-01-14
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2014-04-07
        • 2021-06-23
        • 1970-01-01
        • 2019-03-26
        • 1970-01-01
        相关资源
        最近更新 更多