在php中标记和爆炸

时间:2011-02-06 17:34:52

标签: php mysql

在我的索引文件中,我使用此函数从数据库中获取数据(在另一个文件中):

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而不是appleorangebanana ):

我知道要拆分这些标签我可以使用爆炸然后按如下方式迭代:

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

1http://apple,橙色,香蕉

2 个答案:

答案 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!