Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: Puurakenne tietokantaan

manninen [28.11.2013 22:38:34]

#

Hei!

Olen rakentamassa PHP:llä puumaista kansiorakennetta, mutta jo toisen kansion jälkeen minulla iski tenkkapoo. Muutaman päivän, muutamaan otteeseen olen miettinyt miten olisi järkevintä rakentaa tietokanta. No muutaman kokeilun ja epäonnistuneen tuloksen jälkeen tulin siihen ratkaisuun, että tein sen näin.

juuri, data1, data2, data3, data4, data5
(rajoittaa viiteen alihakemistoon, mutta menkööt)

data kentissä on seuraavanlaisesti.

Juuren nimi, kansio|kansio|kansio, kansio||, ||kansio,|||,|||

Eli data(x) kentissä halutut kansiot ja niiden alikansiot ja niiden alikansiot erotellaan | merkeillä.

Tuntui jossain vaiheessa hyvältä, ei enää. Riippuu miten saatte minua autettua :)

class Tree{
    public function __construct(){}
    public function CreateTree(){
      $k = "SELECT t.juuri as juuritaso, t.juuri_id FROM tree as t WHERE poistettu IS NULL";
      if(!$t = mysql_query($k)){
        return;
      }

 		// Aloitetaan listaelementin rakentaminen
    print '<ul id="browser" class="filetree">';
	  // Käydään silmukassa läpi, mitä alihakemistoja juuritasoon kuuluu.
    while($r = mysql_fetch_assoc($t)){
     print "\n";
     // Luodaan juuritason listaelementti
     print '<li><span class="folder">&nbsp;'. htmlspecialchars($r['juuritaso']) .'</span>';

      $juuriTaso = intval($r['juuri_id']);

      // Luodaan kysely, jolla haetaan juuren alikansiot yms..
      $q = "SELECT branch_id,branch, taso, t1,t2,t3,t4,t5, folder FROM branch WHERE union_id = $juuriTaso";
      if(!$r = mysql_query($q)){  print mysql_error();
      }

      while($res = mysql_fetch_assoc($r)){
        if(!empty($res['branch'])){
        print '<ul><li>';
        print "\n";
        print '<span class="folder">&nbsp;'. htmlspecialchars($res['branch']) .'</span>';
          if(!empty($res['t1'])){

            $kansiot = explode("|", $res['t1']);

             foreach ($kansiot as $kansio) {

              print '<ul><li>';
              print "\n";
              print '<span class="folder">&nbsp;'. $kansio .'</span>';

              $k2 = explode("|", $res['t2']);

              foreach($k2 as $kansio2){
                if(!empty($kansio2)){
                  print '<ul><li>';
                  print "\n";
                  print '<span class="folder">&nbsp;'. $kansio2 .'</span>';
                  print "\n";
                  print '</li></ul>';
                }
              }


              print "\n";
              print '</li></ul>';
            }
          }
        print "\n";
        print '</li></ul>';
        print "\n";
        }
      }

      // Suljetaan juuritason listaelementti
      print '</li>';

    }
    print '</ul>';
   print '</div>';
  }
}
?>

ps. jos ihan tarkkoja ollaan niin juuri haetaan tyhmästi omasta kannastaan, mutta ei puututa muotoseikkoihin.

Anyway.. Miten saan haettua nyt oikeiden alikansioiden alle halutut alikansiot jne.. Mietin myös taulukkoratkaisua, mutta sekään ei oikein meinannut onnistua.

Kiitos ja kumarrus!

Ja toivontaa, että joku ymmärsi mitä selitän :)

manninen [29.11.2013 09:08:57]

#

Juuren nimi, kansio1|kansio2|kansio3, kansio4,kansio6,kansio7||, kansio5||,|||,|||

<pre>
Juuri
  kansio1
    kansio4
      kansio5
    kansio6
    kansio7
  kansio2
  kansio3
</pre>

Suurin piirtein nuin pitäisi mennä. Millä tavalla tietokanta tulisi rakentaa, jotta tämä olisi helpoin ja järkevin toteuttaa.

samip [29.11.2013 09:33:07]

#

manninen kirjoitti:

Millä tavalla tietokanta tulisi rakentaa, jotta tämä olisi helpoin ja järkevin toteuttaa.

Tietokantaan kansiolle parent_id joka on vierasavain isäkansioon. Eli esim:

id   name          parent_id
1    isäkansio     null
2    lapsikansio   1

Koodin puolella avainsana on "rekursio".

Vaihtoehtoinen, ehkä vähän vaikeampi, tapa rakentaa tietokanta: http://www.sitepoint.com/hierarchical-data-database-2/

Lebe80 [29.11.2013 10:32:21]

#

samip:n rakenteelle täältä ääni.

Se on yksinkertainen ja ei virhealtis. Voit halutessasi siirtää yhden päätason toisen alle yhden rivin parent_id:ä muuttamalla, ja homma toimii silti suoraan.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta