Forenkategorien und dazugehörige Foren anzeigen lassen

Kero

Grünschnabel
Guten Tag zusammen!

Ich hoffe, ich schreibe das nun im richtigen Forum. Falls nö: Einfach sagen, beim nächsten Mal mach ich's richtig :)

Also, ich habe Ausgangslage:
Ich möchte versuchen ein eigenes Forum zu programmieren. Ich will in EINER SQL-Abfrage folgendes Schema erreichen:

Code:
Kategorie 1:
    - Unterforum1
    - Unterforum2
Kategorie 2:
    - Unterforum 3
    - Unterforum 4

Ich habe eine Tabelle für die Forenkategorien und für die Unterforen erstellt (hatte auch mal nur EINE Tabelle und hab das da mit Layer versucht (Layer 1 = Kategorie, Layer 2 = Forum), aber da kam ich auch nicht wirklich weit... Evtl. doch die bessere Lösung?)
Hab schon einiges durchprobiert, aber komm auf kein zufriedenstellendes Ergebnis. Meine momentane Lösung sieht wie folgt aus:

Code:
SELECT
    forum_categories.name as name_category,
    forums.name as name_forum
FROM
    forum_categories
LEFT JOIN
    forums ON
    forums.id_forum = forum_categories.id;

Damit komme ich auf folgendes Ergebnis:

Code:
Kategorie 1 - Unterforum1
Kategorie 1 - Unterforum2
Kategorie 2 - Unterforum3
Kategorie 2 - Unterforum4

Die jeweiligen Kategorien sollen aber ja nur einmal angezeigt werden.

Ich hoffe, ich war verständlich genug und bedanke mich bereits im Voraus für Eure Mühen :)

Gruss
Patrick
 
Du könntest es so lösen: Lauf über alle Ergebnisse und schiebe sie in eine assoziatives Array:

PHP:
$categories_and_forums = array();
while($row = mysql_fetch_object($result)) {
  $categories_and_forums[$row->name_category][] = $row->name_forum;
}

echo "<pre>";
var_dump($categories_and_forums);
echo "</pre>";

Das ist natürlich etwas Overhead. Du könntest auch eine verschachtelte Schleife bauen. Oder du merkst dir einfach, was die letzte Kategorie war, die du ausgegeben hast.

Ich hoffe, das ware einigermaßen verständlich.
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort!

Klappte aber leider nicht so, wie erhofft, möglicherweise habe ich es auch nicht richtig verstanden.

Was ich vielleicht noch als Information dazu geben möchte:
Am Ende wird das ja in einem Array gespeichert, die von der Template-Engine verarbeitet wird. In der .tpl-Datei wird das Array dann mit einer foreach-Schleife durchlaufen, um die Foren anzuzeigen:

PHP:
<?php foreach ($data['forums'] as $forum) { ?>
<!-- Ausgabe der Foren -->
<?php } ?>

Ich frage mich ja, ob das wirklich in einer SQL-Abfrage bzw. schlussendlich mit einer Foreach-Schleife geht. Weil ich brauche ja zuerst alle Forenkategorien und danach die dazugehörigen Foren, sodass das Ganze in einer weiteren verschachtelten foreach-Schleife endet, also:

PHP:
<?php foreach ($data['categories'] as $category) { ?>
<!-- Ausgabe Kategorien -->
<?php     foreach ($data['forums'] as $forum) { ?>
<!-- Ausgabe Foren -->
<?php     }
      } ?>

Fände es einfach sauberer in einer SQL-Abfrage.
 
Mal angenommen du hast die Ergebnismenge aus deinem Startpost. Dann könnte das Template ja ungefähr so aussehen:

PHP:
<?php

$lastCat = '';

foreach ($forums as $forum):
  if ($lastCat != $forum['name_category']):
    $lastCat = $forum['name_category'];
?>
<!-- Ausgabe Kategorie -->
<?php
  endif;
?>
<!-- Ausgabe Forum -->
<?php
endforeach;
?>

Das würde dann saftmeisters Vorschlag entsprechen:

Oder du merkst dir einfach, was die letzte Kategorie war, die du ausgegeben hast.

Übrigens habe ich bei den Kontrollstrukturen eine alternative Schreibweise verwendet, wie du siehst. Ich finde, das kann man so leichter lesen, da man nicht Klammern zuordnen muss, sondern gleich an dem Schlüsselwort sieht, welches Konstrukt gerade beendet wird. Ist aber natürlich Geschmackssache. :)
 
Hallo zusammen!

Mein Problem ist gelöst!

Zum einen mit dieser Lösung:
PHP:
<?php

$lastCat = '';

foreach ($forums as $forum):
  if ($lastCat != $forum['name_category']):
    $lastCat = $forum['name_category'];
?>
<!-- Ausgabe Kategorie -->
<?php
  endif;
?>
<!-- Ausgabe Forum -->
<?php
endforeach;
?>

Und ich habe halt eine eigene Lösung gefunden. Halt einfach mit zwei SQL-Abfragen. Diese sieht so aus:

PHP:
<?php
$sql = 'SELECT
            id,
            name
        FROM
            forum_categories
        ORDER BY
            id ASC';
if (!$result = $db->query($sql)) {
    return $db->error;
}
$forums = array();
$sql = 'SELECT
            id,
            name,
            description
        FROM
            forums
        WHERE
            id_forum = ?';
if (!$stmt = $db->prepare($sql)) {
    return $db->error;
}
while ($row = $result->fetch_assoc()) {
    $stmt->bind_param('i', $row['id']);
    if (!$stmt->execute()) {
        return $stmt->error;
    }
    $subforums = array();
    $stmt->bind_result($id_subforum, $name_subforum, $description_subforum);
    while ($stmt->fetch()) {
        $subforums[] = array('id_subforum' => $id_subforum,
                             'name_subforum' => $name_subforum,
                             'description_subforum' => $description_subforum);
    }
    $row['subforums'] = $subforums;
    $forums[] = $row;
}
$stmt->close();
$result->close();
?>
In der Template Datei werden die Daten dann mit zwei foreach-Schleifen ausgegeben.

So ist es zwar nicht mit einem SQL-Query gelöst, aber es funktioniert auch. Muss jetzt nur noch entscheiden, welche Variante ich nehme. Je nach Dynamik und wie es ins Projekt passt.

Bedanke mich herzlich für Eure Hilfe!

Gruss
Patrick
 
Zurück