Forum: Kategorie und dann Themen dieser Kategorie ausgeben

the snake II

Erfahrenes Mitglied
Hallo zusammen,

ich bastle grade ein kleines Forum, das mit MySQL arbeitet.
Es ist relativ einfach aufgebaut: Kategorie -> Forum -> Thema -> Beitrag

Die Tabellenstruktur der DB:

categories (Kategorien - z.B. "Allgemeines", "Programming" etc.)
  • ID
  • name

forum (Foren - z.B. "Alltag", "PHP-Forum" etc.)
  • ID
  • category
    Hier kommt die ID der Kategorie rein (s.o.)
  • name
  • description

Die übrigen Tabellen sind für mein Problem nicht relevant.

Ich möchte nun auf der Startseite alle Kategorien und die Foren aus der Datenbank auslesen, sodass die Foren unter den Kategorien stehen.
Und genau darin liegt das Problem; ich bekomme es nicht hin, dass die Foren unter ihren Kategorien stehen.

Mein aktueller Versuch:
PHP:
//Kategorien

//ID
$cat_id_q = "SELECT ID FROM categories";
$cat_id_r = mysql_query($cat_id_q);
//Name
$cat_nam_q = "SELECT name FROM categories";
$cat_nam_r = mysql_query($cat_nam_q);


//Foren

//ID
$for_id_q = "SELECT ID FROM forum ORDER BY ID";
$for_id_r = mysql_query($for_id_q);

//Name
$for_nam_q = "SELECT name FROM forum ORDER BY ID";
$for_nam_r = mysql_query($for_nam_q);

//Kategorie
$for_cat_q = "SELECT category FROM forum ORDER BY ID";
$for_cat_r = mysql_query($for_cat_q);
$i = 0;
while(
$cat_id_a = mysql_fetch_row($cat_id_r) AND
$cat_nam_a = mysql_fetch_row($cat_nam_r)
)
{
	$ausgabe.='<tr><td class="cat">'.$cat_nam_a[0].'</td></tr>';
	while(
	$for_id_a = mysql_fetch_row($for_id_r)
AND $for_nam_a = mysql_fetch_row($for_nam_r)
AND $for_cat_a = mysql_fetch_row($for_cat_r) 
	){
		if($cat_id_a[0] == $for_cat_a[0])
			$ausgabe.= '<tr><td class="for">'.$for_nam_a[0].'</td></tr>';
	}
}
Es werden mir nur bei der ersten Kategorie die Foren ausgegeben, die zweite wird zwar angezeigt, aber dessen Foren nicht.

Ich komme einfach nicht mehr weiter. Hat das jemand von euch schonmal gelöst?
 
I.d.R. werden Skripte schneller, wenn man weniger SQL-Abfragen ausführt:
PHP:
//... DB connect, $ausgabe mit Tabellenkopf füllen etc.
//Query ausführen:
$res = mysql_query("SELECT 
categories.ID AS catID,
categories.name AS catName,
forum.name AS forName,
forum.ID as forID,
forum.description AS forDescr
FROM categories 
LEFT JOIN forum ON (forum.category=categories.ID)");
//Hilfsvariable als leere Variable definieren:
$lastCat="";
//Ergebniszeilen durcharbeiten:
while ($row=mysql_fetch_assoc($res)) {
    //Prüfen ob mit dem Datensatz eine neue Kategorie beginnt:
    if ($lastCat!=$row['catID']) {
        //Wenn ja, diese ausgeben und ...
        $ausgabe.='<tr><td class="cat">'.$row['catName'].'</td></tr>';
        //... die Hilfsvariable mit der neuen Kategorie belegen
        $lastCat=$row['catID'];
    }
    //Prüfen ob unter der Kategorie überhaupt ein Forum angelegt ist:
    //(LEFT JOIN zeigt auch leere Kategorien und füllt die Felder von
    //forum mit null)
    if (!empty($row['forID'])) {
        //Wenn es ein Forum gibt wird dieses angezeigt:
        $ausgabe.='<tr><td class="for">'.$row['forName'].'</td></tr>'; 
    }
}
// Tabelle schließen Rest der Seite ausgeben
 
Zurück