Newsgroup: it.comp.www.php
Titolo: Loop per categoria padre e figlie, gioco l'aiuto da casa :)

Ho una tabella "categorie" con i seguenti campi:
cid, title, parentid
il campo cid è l'identificativo univoco
il campo title è autoesplicativo
il campo parentid indica se la categoria è "principale" (cid=0) o figlia 
(cid<>0)
ogni categoria (sia essa principale o no) può avere una o più 
sottocategorie, in un numero infinito di "annidamenti".
Ora mi serve un loop per scrivere un slenco delle categorie in questo modo
Categoria1
Categoria2
Categoria2\SottoCat1
Categoria2\SottoCat1\Figlio1
Categoria2\Sottocat2
Categoria3
...
ecc.
Non ne vengo a capo.
Ho scritto il codice che segue, ma purtroppo funziona solo in parte, in 
quanto riesce ad arrivare solo al secondo livello. In un caso come 
quello dell'esempio sopra infatti, la categoria
Categoria2\SottoCat1\Figlio1
rimarrebbe ta<gliata fuori.
Avete qualche idea? Grazie per la disponibilità come sempre :)
function downloads_cat_dropdown($selected='') {
  $ModName = "Downloads";
  list($dbconn) = pnDBGetConn();
  $pntable      = pnDBGetTables();
 
  $ct_column    = &$pntable[$ModName.'_categories_column'];
  $ct_table     =  $pntable[$ModName.'_categories'];
 
  $sql          = "SELECT   ".$ct_column['cid'].",
                            ".$ct_column['title'].",
                            ".$ct_column['parentid']."
                   FROM     ".$ct_table."
                   WHERE    ".$ct_column['parentid']."=0
                   ORDER BY ".$ct_column['parentid'].",
                            ".$ct_column['title']."";
 
  $result       = $dbconn->Execute($sql);
 
  if($result->EOF) {
     return false;
  }
 
  $list = "<select name=\"cat\">\n";
 
  while(!$result->EOF) {
     list($cid, $title, $parentid)=$result->fields;
 
     if ($sel == $cid) {
        $sel = "selected";
     }		
     $list .= "<option value=\"".$cid."\"
              ".$sel.">".pnVarPrepForDisplay($title)."</option>\n";
     $sel   = "";
 
     $sql = " SELECT   ".$ct_column['cid'].",
                       ".$ct_column['title'].",
                       ".$ct_column['parentid']."
              FROM     ".$ct_table."
              WHERE    ".$ct_column['parentid']."=".(int)$cid."
              ORDER BY ".$ct_column['title'];
     $subs = $dbconn->Execute($sql);
 
     while(!$subs->EOF) {
        list($cid, $title, $parentid) = $subs->fields;
        $title = downloads_getparent($parentid, $title);
        if ($sel == $cid) {
           $sel = "selected";
        }
        $list .= "<option value=\"".$cid."\"
                 ".$sel.">".pnVarPrepForDisplay($title)."</option>\n";
        $sel   = "";
        $subs->MoveNext();
     }
     $result->MoveNext();
  }
  $result->Close();
 
  $list .= "</select>\n";
 
  return $list;
}	//	Closes downloads_cat_dropdown function
function downloads_getparent($parentid, $title) {
  $ModName = "Downloads";
  list($dbconn) = pnDBGetConn();
  $pntable      = pnDBGetTables();
 
  $ct_column    = &$pntable[$ModName.'_categories_column'];
  $ct_table     =  $pntable[$ModName.'_categories'];
  $sql          = "SELECT   ".$ct_column['title'].",
                            ".$ct_column['parentid']."
                   FROM     ".$ct_table."
                   WHERE    ".$ct_column['cid']."=".(int)$parentid."
                   ORDER BY ".$ct_column['title'];
  $result       = $dbconn->Execute($sql);
  list($stitle, $sparentid) = $result->fields;
  $result->Close();
 
  if ($stitle!="") {
     $title = $stitle."/".$title;
  }
  if ($sparentid!=0) {
     $title = downloads_getparent($sparentid, $title);
  }
  return $title;
}

 
[CUT]
Ho risolto :D
Invece di leggere con la prima query solo le cartelle padre, le leggo 
tutte, faccio un loop e le inserisco in un array.
Quindi ordino alfabeticamente l'array, e infine creo la select.
Grazie comunque a chiunque si fosse preso la briga di leggere il mio 
post precedente ;)
Ciao