为博客文章显示适当的分类


Show proper categories for blogposts

我试图获得关于特定博客帖子的所有类别,但它不会像我想要的那样工作。下面可以看到SQL和代码。$blog获取特定blogpost的信息

CREATE TABLE IF NOT EXISTS `blogposts` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `id_user_created` int(10) DEFAULT '0',
  `id_user_edited` int(10) DEFAULT '0',
  `post_subject` varchar(100) NOT NULL,
  `post_message` text NOT NULL,
  `post_categories` text NOT NULL,
  `date_published` datetime NOT NULL,
  `date_edited` datetime NOT NULL,
  `info_ipaddress_created` text NOT NULL,
  `info_ipaddress_edited` text NOT NULL,
  `is_shared` enum('0','1') DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)

CREATE TABLE IF NOT EXISTS `categories` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `id_user` int(10) DEFAULT '0',
  `post_name` text NOT NULL,
  `date_added` datetime NOT NULL,
  `date_edited` datetime NOT NULL,
  `info_ipaddress` text NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`)
)

$get_categories = "SELECT * FROM blogposts, categories
                   WHERE blogposts.id = '".(int)$blog['id']."'
                   AND blogposts.post_categories = categories.id
                  ";
foreach($sql->query($get_categories) AS $category) {
    echo '<a href="'.url('blog/category/'.$category['post_name']).'" class="grey-link">';
        echo $category['post_name'];
    echo '</a>';
}

INSERT INTO blogposts` (id, id_user_created, id_user_edited, post_subject, post_message, post_categories, date_published, date_edited, info_ipaddress_created, info_ipaddress_edited, is_shared)
VALUES (1, 1, 1, 'test', 'testar', '1', '', '', '', '', '0'),
(2, 1, 1, 'med kategorier', 'wiho!', '1|2', '', '', '', '', '0');
INSERT INTO categories` (id, id_user, post_name, date_added, date_edited, info_ipaddress)
VALUES (1, 1, 'test', '', '', ''),
(2, 1, 'test2', '', '', '');

现在它只在我发布的两篇博客上打印Categorized in test,。它应该为第一个帖子打印出Categorized in test,为第二个帖子打印出Categorized in test, test2post_categories看起来像这样:1|2,这是特定类别的ID。

如果我看一下你的'blogposts'表,你的'post_categories'字段的类型是text。我不知道里面是什么,但我可以想象它是一个字符串,id用分号之类的字符分隔。这种方法限制了查询的灵活性。最好创建一个链接表。这意味着您引入了一个新表,该表负责链接博客文章及其类别。看起来像:

CREATE TABLE IF NOT EXISTS `blogposts` ( 
  `id` int(10) NOT NULL AUTO_INCREMENT, 
  `post_message` text NOT NULL,
  PRIMARY KEY (`id`), 
  UNIQUE KEY `id` (`id`) 
) 
CREATE TABLE IF NOT EXISTS `categories` ( 
  `id` int(10) NOT NULL AUTO_INCREMENT, 
  `category_name` text NOT NULL, 
  PRIMARY KEY (`id`), 
  UNIQUE KEY `id` (`id`) 
) 
CREATE TABLE IF NOT EXISTS `post_categories` ( 
  `post_id` int(10) NOT NULL AUTO_INCREMENT, 
  `category_id` text NOT NULL
) 

最后一个表可用于获取一个博客文章附带的所有类别。您可以使用JOIN对它进行查询,如下所示:

SELECT * 
FROM blogposts b
INNER JOIN post_categories pc ON pc.post_id=p.id
INNER JOIN categories c ON c.id=pc.category_id
WHERE b.id=<yourvariable>

你会得到一个有很多重复的列表,但每一行都是另一个类别,你可以用它来显示在某个地方或任何你想要的目的。也许把它分成两个查询会更简洁:a.获取带有id的blogpost, b.通过使用链接表获取随blogpost而来的类别。