2012-08-06 2 views
-1

내 스크립트의 하위 카테고리 '포럼'이 해당 카테고리에 속하지 않는 이유에 대한 단서가 없습니다. 대신 하위 카테고리는 스크립트로 하여금 카테고리 코드를 반복하도록합니다.PHP + MySQL 카테고리가 표시되지 않아야 함

아래 이미지에서와 같이 카테고리 Test는 해당 카테고리의 테스트 및 버그입니다. 그러나 Bugs는 두 번째 테이블에 들어가야합니다. 두 가지 테스트 카테고리가 하나가 아니어야하며 대신 Test라는 데이터베이스에 두 개의 카테고리가있는 것처럼 보입니다. 내 코드에서 Bugs가 Test - Just a simple test forum이 아닌 copy-Category "Test"로 푸시되고 있다는 것은 무엇입니까? 여기

enter image description here

그리고

는 코드입니다.

<?php 

include 'connect.php'; 
include 'header.php'; 

$sql = "SELECT 
      categories.cat_id, 
      categories.cat_name, 
      forums.forum_id, 
      forums.forum_cat, 
      forums.forum_name, 
      forums.forum_desc, 
      COUNT(forums.forum_id) AS forums 
     FROM 
      categories 
     LEFT JOIN 
      forums 
     ON 
      forums.forum_cat = categories.cat_id 
     GROUP BY 
      forums.forum_name, forums.forum_desc, forums.forum_id 
     ORDER BY 
      categories.cat_id ASC 
     "; 

$result = mysql_query($sql); 

if(!$result) 
{ 
    echo 'The categories could not be displayed, please try again later.'; 
} 
else 
{ 
    if(mysql_num_rows($result) == 0) 
    { 
     echo 'No categories defined yet.'; 
    } 
    else 
    { 
     //prepare the table   
     while($row = mysql_fetch_assoc($result)) 
     { 

     echo '<table border="1"> 
       <tr> 
       <th>' . $row['cat_name'] . '</th><th></th> 
       </tr>';  
      echo '<tr>'; 

       echo '<td class="leftpart">'; 
        echo '<h3><a href="viewforum.php?id=' . $row['forum_id'] . '">' . $row['forum_name'] . '</a></h3>' . $row['forum_desc']; 
       echo '</td>'; 
       echo '<td class="rightpart">'; 

       //fetch last topic for each cat 
        $topicsql = "SELECT 
            topic_id, 
            topic_subject, 
            topic_date, 
            topic_cat 
           FROM 
            topics 
           WHERE 
            topic_cat = " . $row['forum_id'] . " 
           ORDER BY 
            topic_date 
           DESC 
           LIMIT 
            1"; 

        $topicsresult = mysql_query($topicsql); 

        if(!$topicsresult) 
        { 
         echo 'Last topic could not be displayed.'; 
        } 
        else 
        { 
         if(mysql_num_rows($topicsresult) == 0) 
         { 
          echo 'no topics'; 
         } 
         else 
         { 
          while($topicrow = mysql_fetch_array($topicsresult)) 
          echo '<a href="viewtopic.php?id=' . $topicrow['topic_id'] . '">' . $topicrow['topic_subject'] . '</a> at ' . date('d-m-Y', strtotime($topicrow['topic_date'])); 
         } 
        } 
       echo '</td>'; 
      echo '</tr>'; 
      echo '</br>'; 
     } 
    } 
} 

include 'footer.php'; 
?> 

테이블 구조

카테고리

cat_id  | int(8) | primary | auto incr 
cat_name | var(255) 

|2|Damm 
|3|Hmm 
|1|Test 

포럼

forum_id | int(8) | primary | auto_incr 
forum_cat | int(8) <-- forum cat "category" is just ID of category it belongs to 
forum_name | var(255) 
forum_desc | var(255) 

|1|1|Test|Just a simple forum test 
|2|3|Lol 
|3|1|Bugs|Bugs and related go here 

항목

topic_id | int(8) | primary | auto_incr 
topic_subject | var(255) 
topic_date | datetime 
topic_cat  | int(8) 
topic_by  | int(8) 

|1|Test|2012-07-31 23:12:47|1|1 
저는 개인적으로 다른 시도를했지만 여전히 이런 일이 발생하는 이유를 알 수 없습니다.

+0

관련 테이블의 구조를 게시 할 수 있습니까? – David

+0

나는 그 질문을 아주 잘 따르지 않는다. 카테고리 테이블에 비정규 화 된 "마지막 토픽"을 추가하는 것이 좋습니다 (여러 개의 쿼리를 저장하고 중요하지 않은 것은 두 개의 항목으로 두 번 업데이트됩니다). 그렇지 않으면 질문을 따를 수 없습니다. – Robbie

+0

@Robbie 엉덩이처럼 들리고 싶지 않지만 이미지를 넣은 이유는 무엇입니까? 설명했듯이 Bugs는 복사해서는 안되는 "Test"라는 복사본 카테고리를 만들고 대신 테스트 아래에 있어야합니다 - 단순한 테스트 포럼이지만 이미지에서 볼 수 있듯이 실제 카테고리 대신 사본 카테고리에로드됩니다. 하나 있어야했습니다. –

답변

1

당신의 라인을 따라 결과가됩니다

cat_id 1, forum_id 1 
cat_id 1, forum_id 2 
cat_id 1, forum_id 3 
cat_id 2, forum_id 4 

하지만 하나 개의 루프에서 출력 모든 것을, 그래서 당신은 마지막 헤더가 표시 기억하면됩니다, 그리고 당신이 인 경우에만 새로운 헤더를 보여줄 필요 새로운 카테고리.

아래를

는 완벽하지 예이지만, 시작하는 데 도움이

// Start the table here - outside the loop 
echo '<table border="1"> 

// Here's how you track if you need the header 
$lastCatID = -1 

// Now loop 
while($row = mysql_fetch_assoc($result)) 
{  
    // Only show cat header on condition 
    if ($lastCatID <> $row['cat_id']) { 
     echo ' 
      <tr> 
      <th>' . $row['cat_name'] . '</th><th></th> 
      </tr>'; 

     // Note that you've shows this header so you don't show it again. 
     $lastCatID = $row['cat_id']; 
    } 

    // Now output the rest  
    echo '<tr>'; 
    echo '<td class="leftpart">'; 
     etc.... 
    echo '</tr>'; 
} 

// Now close the table now you're all done looping. 
echo '</table>'; 

희망 당신에게 제공 할 것입니다. 자신의 스타일에 맞게 확장 할 수 있어야합니다.