Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1

    Estrarre categorie e sottocategorie

    Ciao a tutti.
    Avendo una struttura di categorie e sottocategorie salvate a db così strutturata:

    codice:
    root
       libri
          romanzi
             gialli
             horror
          saggistica
             tipo 1
                belli
                brutti
       fumetti
          tex
             primi numeri
             ultimi numeri
          zagor
    dove ogni categoria ha l'ID, il parent_ID (ovvero l'id della categoria di appartenenza) e il nome, come strutturo la query affinchè possa estrarre i dati ed inserirli in una select che contenga degli option group?
    La struttura teoricamente potrebbe contenere infinite categorie e sottocategorie di categorie e così via.
    Mi date una mano?

  2. #2
    La prima cosa che mi viene in mente è inserire tutte le categorie e sottocategorie nello stesso campo. Esempio:

    tabella categorie:
    libri
    libri->romanzi
    libri->gialli
    libri->horror
    libri->saggistica->tipo 1
    libri->saggistica->belli
    libri->saggistica->brutti
    fumetti
    fumetti->tex
    fumetti->tex->primi numeri
    fumetti->tex->ultimi numeri
    fumetti->zagor

    (che pappina da scrivere! )

    Comunque così facendo avresti infinite possibilità. Non è il massimo della comodità ma ti assicura id univoci per ogni categoria/sottocategoria con livelli infiniti.
    Se poi vuoi estrarre le singole categorie dopo l'estrazione dal database, convertile in array
    Codice PHP:
    $arr_categorie=explode('->',$categorie); 
    e hai pure i livelli giusti ($arr_categorie[0] sarà la categoria base, ecc..).

    Se mi viene in mente qualcos'altro te lo dico
    Ce l'ho fatta! - ItalianPixel -

  3. #3
    Grazie Portapipe per la risposta.
    Nel mentre ho trovato questa funzione che si autorichiama in continuo.
    In teoria non è il massimo in fatto di prestazioni, salvo non avere milioni di categorie e sottocategorie annidate.
    Codice PHP:
    // $parent is the parent of the children we want to see 
    // $level is increased when we go deeper into the tree, 
    //        used to display a nice indented tree 
    function display_children($parent$level) { 
        
    // retrieve all children of $parent 
        
    $get_data "SELECT * FROM tabella WHERE parent_ID='" $parent "'";

    $result mysql_query($get_data);
     
        
    // display each child
        
    while ($row mysql_fetch_array($result)) {
                
    // indent and display the title of this child                    
    print str_repeat(''$level). " <input type=\"radio\" name=\"parent\" value=\"" $row["ID"] . "\" />" $row['nome']."
    \n"
    ;
            
    // call this function again to display this 
            // child's children 
            
    display_children($row['ID'], $level+1); 
        } 

    Richiamando la funzione e passandogli i parametri di $parent = "" (ovvero nulla) e $level = 0, ti mostra tutta la struttura, oltretutto con i nomi "indentati".
    Preso da qui: http://www.sitepoint.com/hierarchical-data-database/

  4. #4
    Mi sembra ottimo ( anche se il mio è più rapido e meno macchinoso per il server )

    Scherzi a parte sembra proprio quello che serve a te.

    A pensarci bene a te cambia poco. Se usi il mio metodo puoi dividere tutte le categorie in varie select in base alla loro posizione nell'array (quello dell'explode) e creare altre categorie unendo le varie opzioni delle select.

    A me piace complicarmi la vita pur di creare un metodo tutto mio
    Sai quante fasciate alla testa?
    Ce l'ho fatta! - ItalianPixel -

  5. #5

    OT

    Inizio a stufarmi di questo lavoro...

  6. #6

    OT

    Ogni tanto anch'io
    Ce l'ho fatta! - ItalianPixel -

  7. #7
    Con questa versione alternativa fai una sola query ed elabori i dati in PHP (limitare il numero di query da' grossi vantaggi in termini di prestazioni):

    Codice PHP:
    <?php
    $sql 
    'SELECT id, parent, name
            FROM tree'
    ;

    $result mysql_query($sql);

    $data = array();

    while ( 
    $row mysql_fetch_object($result) ) {
        if ( 
    $row->parent == ) {
            
    $root $row->id;
        } else {
            
    $data[$row->parent][$row->id] = $row->name;
        }
    }

    function 
    build_tree($main$root) {
        
    $current = array();
        foreach ( 
    $main[$root] as $id => $name ) {
            if ( isset(
    $main[$id]) ) {
                
    $current[$id] = array(
                    
    'name' => $name,
                    
    'children' => build_tree($main$id),
                );
            } else {
                
    $current[$id] = array(
                    
    'name' => $name,
                );
            }
        }
        return 
    $current;
    }

    function 
    print_tree($tree) {
        echo 
    "<ul>";
        foreach ( 
    $tree as $branch ) {
            echo 
    "[*]{$branch['name']}\n";
            if ( !empty(
    $branch['children']) ) {
                
    print_tree($branch['children']);
            }
        }
        echo 
    "[/list]\n";
    }

    $tree build_tree($data$root);

    print_tree($tree);

  8. #8
    k.b. ora la prova, grazie

  9. #9
    Estraggo i dati come segue:
    Codice PHP:
    $sql "SELECT ID, parent_ID, nome FROM cat_prodotti"

    $result mysql_query($sql$conn); 

    $data = array(); 

    while (
    $row mysql_fetch_array($result)) { 
        if (
    $row["parent_ID"] == 0) { 
            
    $root $row["ID"]; 
        } else { 
            
    $data[$row["parent_ID"]][$row["ID"]] = $row["nome"]; 
        } 

    Quando richiamo la funzione build_tree mi dà i seguenti errori:
    codice:
    Notice: Undefined index: 15 in /home/.../prova.php on line 53
    Warning: Invalid argument supplied for foreach() in /home/.../prova.php on line 53
    Alla inea 53 c'è il ciclo foreach della funzione build_tree.
    So why?

  10. #10
    Nessuno che aiuta il povero Dirk Pitt?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.