Strukturovaný výpis komentářů

Strukturovaný výpis komentářů ve fóru, podle:

http://www.sitepoint.com/forums/showthread.php?t=215857

<?php
function &Get_Threads($select) {
$query = MySQL_Query($select);
$all = array();
while($node = MySQL_Fetch_Array($query)) {
$id = $node['fid'];
$idp = $node['parent'];
$text = $node['comment'];
if(!array_key_exists($id, $all)) {
$all[$id] = array(
'comment' => $text,
'childs' => array()
);
}
else {
$all[$id]['comment'] = $text;
}
if(!array_key_exists($idp, $all)) {
$all[$idp] = array();
}
$all[$idp]['childs'][$id] = &$all[$id];
}
return $all[0];
}

function Echo_Tree(&$tree) {
static $level = 0;
if(count($tree)) {
echo '<ul>';
foreach($tree['childs'] as $id => $node) {
echo '<li>';
echo $node['comment'];
if(count($node['childs'])) {
$level++;
Echo_Tree($node);
$level--;
}
echo '</li>';
}
echo '</ul>';
}
}

$tree = Get_Categories("SELECT * FROM forum WHERE tid=$_GET[tid] ORDER BY age");
Echo_Tree(&$tree);
?>

Vůbec nic to nevypisuje a já nejsem schopný se tím n-rozměrným polem vyechovat k nějakému závěru, kde je chyba. Co používáte pro výpis za funkci vy? Vidíte tam někde chybu?

Tabulka je:

fid - id komentáře,
tid - id tématu,
parent - id rodiče,
comment - text komentáře
Já sem ale lama nejlamovatější. Řádek return $all[0]; má být return $all[1]; pro vypsání stromu reakcí na příspěvek s id 1 atd ... Takže první je třeba vypsat všechny kořenové příspěvky (které nemají parent) a pak zavolat Get_Threads() a předat mu id každého kořenu.

To jen pro ostatní, třeba se to někomu bude hodit.
Myslím, že pro strukturovanou diskusi není vhodné vypisovat příspěvky přes rekurzi (opětovné volání sebe sama ve smyčce a tím postupně zobrazit celý strom příspěvků). Zbytečně to zatěžuje server.

Je zjevné, že se mnohem více diskuse vypisuje, než se přidává příspěvek. Tudíž výpis by měl bých jednoduchý - jeden SQL dotaz pro celý strom, zatímco zápis může být o něco složitější.
To je logicka uvaha, ale mas nejaky konkretni priklad toho SQL dotazu? Ja si to totiz nejak nedokazu predstavit, narozdil od te rekurze v PHP, ktera je celkem jasna.
Když jsem si dělal vlastní strukturovanou diskusi, pročetl jsem si o tom spoustu teorie. Jak říká můj známý: "Raději budu 2 týdny přemýšlet a den dělat, než opačně". Teď ten článek nemůžu najít, ale ten princip se mi líbil nejvíce a použil jsem jej.

Nicméně vysvětlím můj princip. Mám tuto stromovou strukturu:

Zápis č1
 Reakce č1 na Z1
  Reakce č1 na R1
 Reakce č2 na Z1
 Reakce č3 na Z1
  Reakce č1 na R3
Zápis č2
Zápis č3
 Reakce č1 na Z3

Kořenové zápisy jsou číslované od 00 do 99. Jejich reakce opět od 00 do 99 a tak pořád stejně až do X-té úrovně. Rekce však vždy nesou identifikaci svého předchůdce. Tedy takovéto by byly ID_key, typ varchar(255):

00 Zápis č1
0000  Reakce č1 na Z1
000000   Reakce č1 na R1
0001  Reakce č2 na Z1
0002  Reakce č3 na Z1
000200   Reakce č1 na R3
01 Zápis č2
02 Zápis č3
0200  Reakce č1 na Z3

Tabulka bude mít samozřejmě, kromě jiného (jméno, datum) taky ID_clanek, kterého se diskuse týká.

Výhody:
- jediný SQL dotaz pro výpis kompletního stromu:
  SELECT * FROM WHERE ID_clanek= $_GET['clanek'] tabulka ORDER BY ID_key
- při výpisu každého řádku vím, na které jsem úrovni (podle délky ID; délka 2 -> 1. úroveň, délka 4 -> 2. úroveň) a podle toho odsazuji

Nevýhody:
- umožňuje maximálně 100 základních zápisů a následně 100 reakcí na každý zápis. Pokud by toto byl problém, lze snadno udělat ID_key trojznakové 000, 000000, 000001, 001, 001000, atd. Pak by šlo zadat až 999 základních zápisů ke konkrétnímu článku.

Při ukládání reakce, je třeba spočítat její ID_key. Není to tak složité. Vezmu ID_key zápisu, na který reguji, podívám se, kolik už tam je reakcí ve stejné úrovni a připočtu jedničku.

Snad je to pochopitelné. Provozuji to na stránkách, pod kterými jsem přihlášen.
já mam g_book i komentáře strukturované. nedělal jsem to jako zbi -> pustil jsem se do toho s tím, že si to dám do nějaký funkce... .... bylo první dlouhé odpoledne... pak další dvě dlouhé odpoledne a g_book se strukturovanými reakcemi byl na světě, ale pravda, sranda to nebyla. hlavně to odsazování od kraje... můžeš se pro inspiraci mrknout.

mám to ve funkci, přičemž si tam posouvám dotaz na databázi, id (na kerý se reaguje), pak jestli je člověk přihlášen jako admin nebo ne, a pak přes dvě proměnné to odsazování. chce to jen přiměřeně programátorského logického myšlení.. tvořivost ;-)
To je každopádně zajímavý. Já jsem převzal tu výše uvedenou rekurzi a funguje to. Výhody a nevýhody si netroufám posuzovat, navíc vzhledem k velikosti diskuze jakou chci provozovat si myslím, že se stejnak nevýhody neprojeví.