2011-02-06 7 views
0

에서 폭발 I 얻을 (다른 파일에있는)이 기능을 사용하여 데이터베이스에서 데이터 :태그 내 인덱스 파일에서 PHP

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, orangebanana을 나타납니다 :

<?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 개 이상의

편집되어 스레드 너무 오래 걸릴 것

내 테이블 구조는 다음과 같다 :

스레드, author_threads, 저자 , 태그, thread_tags는 회신 author_replies

1 : http://apple, 오렌지, 바나나

+0

db 테이블 구조를 추가 할 수 있습니까? –

+0

가능하면 문제의 단순화를 원합니다. – Kissaki

+0

'GROUP_CONCAT'이 SQL 표준이라고 생각하지 않습니다 ... 어떤 DBS를 사용합니까? – Kissaki

답변

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

이렇게하면 프리젠 테이션 코드가 깨끗해집니다.

+0

구문 분석 오류 : 예기치 않은 구문 오류, 4 행의 T_FUNCTION –

+0

익명 함수를 사용하므로 코드에 PHP 5.3이 필요합니다. 그것없이 버전을 추가했습니다. 하지만 PHP 5.3으로 업그레이 드하는 것이 좋습니다;) – singles

+0

나는 우분투 Karmic 코알라를 사용하고 있으므로 업그레이드하기 전에 5.3을 얻을 수 있습니다. –

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 

저장하시오 자료 구조에서 그와 (당신이 당신의 대화 목록과 함께 지금처럼) 프리젠 테이션 템플릿에 전달합니다.

(이런 세상에, 맞아, 뿐만 아니라 훨씬 더 나은 같은데 ... 복잡한 쿼리이었다? 그리고 너무 쉽게 읽고 이해!하는)

을 Btw는의 GROUP BY thread.id DESC와 무엇? 나는 당신의 ID가 유일하거나, 더 나아가 PRIMARY KEY가되기를 희망합니다! 그런 다음 GROUP BY는 필요하지 않습니다!

+0

실제로 그룹이 존재하지는 않습니다. 기본 키를 사용하고 있습니다. 지금은 –

+0

내가 가지고있는 문제는 내가 얼마나 많은 스레드를 얻는 지 항상 알지 못한다. 한계가있다. –

+0

그리고 그게 무슨 문제입니까? 얻은 모든 주제에 대한 태그를 가져옵니다. – Kissaki