esplorare database

Mi dareste una mano nel costruire una funzione per esplorare un database che ha una struttura ad albero? In particolare vorrei creare una select che al suo interno abbia tutta la struttura ad albero del database, in modo tale da poter scegliere uno degli elementi.

Il problema è che non so a priori la profondità della struttura.

Io avevo pensato alla creazione di un array per ogni livello di profondità (che può essere al massimo di 5). Però non so se può essere una soluzione pulita...

inviato 10 anni fa
AndyB
X 0 X

Per la "mappatura" di strutture gerarchiche, ad albero, in un DB ci sono precise tecniche, ormai collaudate e consolidate. Ti riporto 2 articoli di freephp in cui se n'è parlato.

http://freephp.html.it/articoli/view_articolo.asp?id=164

http://freephp.html.it/articoli/view_articolo.asp?id=165

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao AndyB

Supponiamo che tu abbia una struttura qualsiasi, gerarchica con il classico parent_id

Eccoti l'esempio generico di una funzione che viaggia per tutto l'albero.

ho supposto di avere un handler al database che mi restituisca tutto in un oggetto(piu semplice da vedere nell'esempio) e che questo proposto sia un metodo di una classe.

L'oggetto contenitore MyObj puo essere quello che ti fa piu comodo.

<?php
/*
.........definizione classe etc etc
*/
public function getTree($link_id, $levels = -1) {
        if ($levels >= 0)
            $orig_lvl = $levels;/*utile per eventuali limiti es: =min($levels, MIOLIMIT)*/
        else
            $orig_lvl = -1;
        $arr = array();
        $subs = $this->db->query("SELECT * FROM mia_tabella WHERE parent_id = $link_id ORDER BY id ASC");
        /*
        supponiamo che l'handler mi restituisca se ho rige di risultato.
        */
        if ($subs->righe> 0) {

        /*come scrivere while ($riga = mysql_fetch_array($subs)) */
        
            foreach ($subs->righe as $row) {
                $mTmp = new MyObj();
                $mTmp->id = $row['id'];
                $mTmp->parent_id = $row['parent_id'];
                $mTmp->name = $row['name'];
/*
*
* altro codice
*
*/
                $arr[$row['id']] = $mTmp;
                if ($levels == -1 OR $levels > 0) {
                    if ($levels != -1)
                        $levels--;
                    $figli = $this->getTree($row['id'], $levels);
                    $mTmp->figli = @count($figli);
                    if ($figli !== NULL)
                        $mTmp->figli = $figli;
                }
                $levels = $orig_lvl;
            }
            return $arr;
        } else
            return NULL;
    }
/*
etc etc
*/
?>
risposto 10 anni fa
Thesee
modificato 10 anni fa
Gianni Tomasicchio
X 0 X

Grazie per le risposte  O0

Un'altra domanda: sapete come si fa ad estrarre da un database un dato di tipo money? (io in particolare uso un database postgres ma ci interagisco con la classe PEAR)

Ho provato a cambiarne il tipo con settype ma modifica qualsiasi valore in 0.

risposto 10 anni fa
AndyB
X 0 X

Ciao,

ti linko al manuale di postgresql versione 7.3.

Siccome suppongo tu utilizzi almeno la 8, beh...direi che è meglio evitare il tipo money.

Come puoi leggere dal manuale è "deprecated".

http://www.postgresql.org/docs/7.3/interactive/datatype-money.html

In caso tu abbia a che fare con un prodotto che ha gia questo tipo di dato e non puoi fare altro....ti dico la verità..non l'ho mai utilizzato, ma fammi sapere che faccio un paio di test e ti dico  ;)  in caso contrario, usa decimal, o float  O0

Ciuaz  :bye:

risposto 10 anni fa
Thesee
X 0 X

Sì avevo già cambiato il tipo in numeric perchè avevo cercato sia sul sito di postgres che sulla rete ma nulla.

Grazie dell'interessamento  O0

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