在我的索引文件中,我使用此函数从数据库中获取数据(在另一个文件中):
function get_all_threads($link, $start)
{
$threads = select_Query("SELECT thread.title, thread.id as t_id,
thread.content, author.username, author.id as a_id,
GROUP_CONCAT(DISTINCT tags.name ORDER BY tags.name DESC SEPARATOR ',') AS tags
FROM thread JOIN thread_tags ON thread.id = thread_tags.thread_id
JOIN tags ON thread_tags.tag_id = tags.id
INNER JOIN author on author.id = thread.author_id
GROUP BY thread.id DESC
LIMIT $start, 30", $link);
return $threads;
}
我的索引文件中的代码如下:
$threads = get_all_threads($link, $start);
include FORUM_ROOT . 'html/main/threads.html.php';
在threads.html.php
中<?php foreach ($threads as $thread): ?>
<h1><?php echo $thread['title']; ?></h1>
<?php echo $thread['content']; ?>
<?php echo $thread['tags']; ?> <!-- All of these appear as one -->
<?php endforeach; ?>
正如你所看到的,我得到了线程,他们的作者和他们的标签。但是我使用GROUP_CONCAT作为标签,所以当我想让每个单独的标签成为链接时,例如在threads.html.php中:
<a href="?tag=<?php echo $thread['tags']; ?>" >
<?php echo $thread['tags']; ?>
</a>
所有标签都显示为一个链接(例如,如果标签是苹果,橙色,香蕉,它们将显示为apple, orange, banana而不是apple,orange,banana ):
我知道要拆分这些标签我可以使用爆炸然后按如下方式迭代:
<?php $tags = array();
$tags = explode(',', $thread['tags']);
?>
(Tagged:
<?php foreach ($tags as $tag): ?>
<a href="/tag?=<?php echo $tag;?>"><?php echo $tag; ?></a>
<?php endforeach; ?>)
然而,我必须在threads.html.php中这样做,我想保持演示文稿代码分开。
在index.php中有没有更简洁的方法?此外,迭代每个线程并爆炸每个标记对于超过30的线程来说将花费太长时间。
修改
我的表格结构如下:
thread,author_threads,author,tag,thread_tags,reply和author_replies
1:http://apple,橙色,香蕉
答案 0 :(得分:0)
将get_all_threads
视为模型的一部分 - 黑盒子 - 您不需要知道如何获取数据(是SQL查询,xml文件还是外部api调用)。您对数据感兴趣,仅此而已。
到目前为止,无法通过SQL查询为一个线程获取多个标记。即使你删除GROUP_CONCAT
,你也会得到一堆线程的记录,这也需要以某种方式解析。但根据第一段,您应该解析函数中的数据。
function get_all_threads($link, $start)
{
$threads = select_Query("SELECT thread.title, thread.id as t_id,..");
//PHP 5.3
array_walk($threads, function(&$thread) {
$thread['tags'] = explode(',', $thread['tags']);
});
//PHP < 5.3
foreach ($threads as &$thread) {
$thread['tags'] = explode(',', $thread['tags']);
}
return $threads;
}
当你这样做时,你的演示代码将是干净的。
答案 1 :(得分:0)
您想要为每个线程获取并打印多个标签。那你为什么要在一个查询中做呢?你不会做一个大规模的查询:
SELECT thread.title, thread.id as t_id, thread.content,
author.username, author.id as a_id,
INNER JOIN author ON author.id = thread.author_id
ORDER BY thread.id DESC
LIMIT $start, 30
并为每个线程
SELECT tags.name
FROM thread_tags
WHERE thread_tags.thread_id == $id
将它们存储在数据结构中并将其传递给您的演示模板(就像现在使用您的线程列表一样)。
(神圣的废话,这是一个复杂的问题...... 现在看起来好多了,对吧?这么容易阅读和理解!)
顺便问一下,GROUP BY thread.id DESC
是什么?我希望你的ID是独一无二的,或者更好的是一个主要的钥匙!那不需要GROUP BY!