Ancora gerarchie? While annidati

Ciao caro Gianni torno a chiedere aiuto sulla rappresentazione delle gerarchie da database :buck:

ho sviluppato questo codice :

   $query = "SELECT * FROM `dirs` WHERE `pid`=1";

   $exec  = mysql_query($query);

      echo 'root<br/>';

   

      while($dir = mysql_fetch_array($exec)){

         echo '<b>'.$dir['name'].'</b>'.' ('.$dir['did'].') child of ('.$dir['pid'].')'. '<br />';

         

         $q  = "SELECT * FROM `dirs` WHERE `pid`=" . $dir['did'];

         $e  = mysql_query($q);   

         

         while($d = mysql_fetch_array($e)){

         

            for($i=0;$i<$d['level'];$i++){

               echo '&middot;';

            }

            

            echo '<b>'.$d['name'].'</b>'.' ('.$d['did'].') child of ('.$d['pid'].')'."<br/>";                  

            

            $qii = "SELECT * FROM `dirs` WHERE `pid`=" . $d['did'];

            

            $eii  = mysql_query($qii);   

         

            while($dii = mysql_fetch_array($eii)){

            

            for($i=0;$i<$dii['level'];$i++){

               echo '&middot;';

            }

            

            echo '<b>'.$dii['name'].'</b>'.' ('.$dii['did'].') child of ('.$dii['pid'].')'."<br/>";                  

            

            }

         }

         

      }

bene questo codice gestisce egregiamente

Root

figli di root

figli dei figli di root

figli dei figli dei figli di root

ecco un FS scritto con questo codice :

ROOT : 

Images (2) child of (1)
Skin (3) child of (1)
··Default skin (4) child of (3)
··Blue skin (5) child of (3)
···Images (9) child of (5)
Css (6) child of (1)
··BlueCss (7) child of (6)
···Normal (8) child of (7)

la tabella è questa :

come vedi Jpeg ( sotto cartella di 2° grado ) non è visibile

per ora la parte dopo il nome della cartella mi serve a seguira la logica ( e se funziona ) senza perdere il filo ... e sai che io lo perdo molto facilmente  ;D

ora mi chiedo ( anzi devo trovare una soluzione , se no parte il tagliavene ) come posso creare uno script del genere insensibile a quante sottocartelle ci sono?

e che possa mostrare senza inserire un numero spropositato di while ( in modo da arrivare a max tanti figli quanti sono i while ) ma di usarne due o tre per gestire "infinite" figliolate ?  ^-^

ciau  :bye:

inviato 10 anni fa
Andrea Turso
Andrea Turso
86
modificato 10 anni fa
X 0 X

PIANGO PIANGO TANTOOOOOOOOOOOOOOOOOOO

Gianniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii ti amooo

HO CREATO UNA FUNZIONE RICORSIVA CHE FUNZIONAAAAAAAAAAA SONO COMMOSSO DOPO SEI MESI CHE CI PASSAVO LE NOTTI SOPRA !!! :'( :'(

dimmi se ho combinato molti casini :

<?php 

      error_reporting(E_ALL);

      

      

      function IsParent($id){

      

         $query = "SELECT `did` FROM `dirs` WHERE `pid`=".$id;

         $exec  = mysql_query($query);

         

         if(mysql_num_rows($exec) >= 1){

            return 1;

         }else{

            return 0;

         }

      }

         

      

      function Dot($lev){

      

         for($i = 0; $i < $lev; $i++){

            echo '&middot;';

         }

      

      }

      

      function ListRoot(){

         

         global $list;

         

         $query = "SELECT * FROM `dirs` WHERE `pid`=1"; //prendo tutti i record con genitore la root 

         $exec  = mysql_query($query);                  //eseguo la query 

         

            while($main = mysql_fetch_array($exec)){

            

               //mostro i nomi della cartella con a fianco l'id 

               echo '<b>'.$main['name'].'</b>'.' ('.$main['did'].') <br />';

               

               $list[] = $main['did']; //inserisco gli di delle cartelle della root in list

               

                  ListChildren();

            

            }

         

         unset($query,$exec); //svuoto la memoria

         return $list;

   

      }

      

      function ListChildOfChild($id){

      

         if(IsParent($id)){

          $queryI = "SELECT * FROM `dirs` WHERE `pid`=".$id;

          $execI  = mysql_query($queryI);

            while($dirI = mysql_fetch_array($execI)){

                  dot($dirI['level']);                           

                  echo '<b>'.$dirI['name'].'</b>'.' ('.$dirI['did'].')<br />';

                  

               if(IsParent($dirI['did'])){

                  ListChildOfChild($dirI['did']);

               }

               

               

            }

         }

      }

      

      function ListChildren(){

         

            global $list;

            

               foreach($list as $parent){

               

                $query = "SELECT * FROM `dirs` WHERE `pid`=" . $parent; //prendo tutti i record con genitore $parent

                $exec  = mysql_query($query);

               

                  while($dir = mysql_fetch_array($exec)){

                     

                     Dot($dir['level']);                     

                      //mostro i nomi delle cartelle figlie con l'id

                      echo '<b>'.$dir['name'].'</b>-'.' ('.$dir['did'].') child of ('.$parent.')<br />';

                     

                     if(IsParent($dir['did']))

                        ListChildOfChild($dir['did']);

                  }

   

               }

      }

      

            

   

      if(! @mysql_connect('localhost','root','pixel')){      

         print ('Unable to connect');         

      }else{

         @mysql_select_db('cvs');

      }                  

      

      ListRoot();

?>

che produce

Layout (2)

··Images- (3) child of (2)

···Jpeg (4)

···Gif (5)

···TGA (6)

····Textures (7)

·····Bumpmap (8)

····NormalMap (9)

 :bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Nuuuuuuuuuuuuu Gianniiiiii guarda se metto altre cartelle nella root :

Layout

··Images

···Jpeg

···Gif

···TGA

····Textures

·····Bumpmap

····NormalMap

Style

··Images

···Jpeg

···Gif

···TGA

····Textures

·····Bumpmap

····NormalMap

··CSS

A

··Images

···Jpeg

···Gif

···TGA

····Textures

·····Bumpmap

····NormalMap

··CSS

ad ogni cartella legata alla root ripete tutto l'albero nuuuuuuuuuuu come risolvo???

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Risolto semplicemente controllando se l'id della cartella genitore era quello dell'iterazione corrente :)

:bye:

lol tanto panico per nulla :2funny:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Non ho controllato nei dettagli il codice. Se funziona, bene... comunque mi sembra che tu faccia parecchie query per ricostruire l'abero. In realtà te ne basterebbe solo una, che estrae tutti i dati e li mette in un array. E' su questo array che dovresti fare tutte le ricerche e le manipolazioni.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

come potrei fare,con gli array?

estraendo tutto e inserendo tutto in un array ( via via a più dimensioni ) e poi creando una funzione ricorsiva che ne mostra il contenuto ( se è nodo [se è array a sua volta]) ?

potresti darmi uno spunt ( ino ) o ?

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

esatto, il principio è quello. Avere le righe in una tabella o in un array non fa differenza. Se applichi la stessa logica di ricerca all'array il funzionamento è assicurato, con il vantaggio che non fai più d'una query.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Gianni potresti indicarmi un modo per inserire tutti i dati della query in array in modo da averli multidimensionali?

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Per ora sono riuscito a ridurre il codice superfluo e riderre le query a sole 3 :

      function Spacer($lev){

         

         global $space;

            

            $space = '';

            

            for($i=0; $i<$lev; $i++){

               $space .= '&middot;';

            }

         

         return $space;

      }

      

      function FetchNodes(){

      

         global $list;

      

         $query = "SELECT * FROM `dirs` WHERE `pid`=1";

         $exec  = mysql_query($query);

         $list  = array();

         

            while($dir = mysql_fetch_array($exec)){

            

                Spacer($dir['level']);   

                          

                echo '<b>'.$dir['name'].'</b><br />';

               

                if(IsNode($dir['did']))

                   OpenNode($dir['did']);

               

            }

      }

      

      function IsNode($id){

      

            //è un nodo?

         $query = "SELECT `did` FROM `dirs` WHERE `pid`=".$id;

         $exec  = mysql_query($query);

            //se si 

         if(mysql_num_rows($exec) >= 1){

            return 1;

            //altrimenti

         }else{

            return 0;

         }

         

         unset($query,$exec); //svuoto la memoria   

         

      }

      

      function OpenNode($id){

      

          $query = "SELECT * FROM `dirs` WHERE `pid`=".$id;

          $execi  = mysql_query($query);

            while($dir = mysql_fetch_array($execi)){

                     // inserisci la spaziatura

                  echo Spacer($dir['level']);                           

                  echo '<b>'.$dir['name'].'</b><br />';

                  

                     //se contiene è nodo ripeti 

               if(IsNode($dir['did'])){

                  OpenNode($dir['did']);

               }

            }

               

         unset($query,$exec); //svuoto la memoria

      }

poi basterà chiamare :

FetchNodes();

per vedere l'albero

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Gianni la cosa inizia a farsi complicata ...

lasciando perdere un attimino le query, ora si tratta di implementare in queste funzioni una per mostrare i file contenuti nelle cartelle

cioè :

selezionare i file che hanno come DID quello della cartella che si sta mostrando ... ora cerco una soluzione se non riesco faccio un fischio!

:bye:

risposto 10 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

ok.

Comunque per avere tutti i dati in un array basta la normale fetch all'interno di un ciclo while.

 :bye:

P.S.: per fare delle prove creati un array inserendo dei dati di prova. Poi realizzi l'algoritmo.

risposto 10 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda