如何过滤多个类别并显示它的帖子/文章PHP

时间:2014-06-28 19:03:28

标签: php mysql filter blogs categories

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

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

以下是我用于显示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,primary,auto increment。

     

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

5 个答案:

答案 0 :(得分:2)

表格内容

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

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

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

表格显示

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

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

答案 1 :(得分:0)

   <?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 } } ?>

答案 2 :(得分:0)

<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
});

答案 3 :(得分:0)

   <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>

答案 4 :(得分:0)

我有同样的问题,我想获得将在特定页面上发布的特定类别。我有这个 php 代码可以从我的数据库中获取信息;

<?php
        $result = mysqli_query ($mysqli, "SELECT * FROM mydata ORDER BY id DESC");
            while ($row = mysqli_fetch_array($result)) 
                                
{ 

我有 3 个类别:cat1 / cat2 / cat3。我喜欢所有的 cat1 类别过滤,只会在一页中发布