-1

理由はわかりませんが、スクリプトのサブカテゴリ「フォーラム」がそれぞれのカテゴリに模索されていません。代わりに、サブカテゴリはスクリプトにカテゴリコードを繰り返すように強制します。

下の画像に示されているように、カテゴリTestがあり、そのカテゴリにはTestとBugsがあります。ただし、バグは2番目のテーブルに挿入されます。これは、両方のテストカテゴリが1つであるためではなく、データベースにテストと呼ばれる2つのカテゴリがあるように見えます。バグがテストの下にあるのではなく、コピーカテゴリの「テスト」にプッシュされているという私のコードの何が問題になっていますか?単純なテストフォーラムですか?

ここに画像の説明を入力してください

そしてここにコードがあります。

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

私は個人的にさまざまなことを試しましたが、それでもなぜこれが起こっているのか理解できません。

4

1 に答える 1

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

ただし、すべてを1つのループで出力するため、最後に表示されたヘッダーを覚えておいて、新しいカテゴリにいる場合にのみ新しいヘッダーを表示する必要があります。

以下は一例であり、完璧ではありませんが、開始することができます

// 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>';

お役に立てば幸いです。そこから自分のスタイルに合わせて拡張できるはずです。

于 2012-08-06T04:40:40.957 に答える