Hei,
haen listaa tiedostonimistä/kansionimistä tietokannasta, siten että ensin luetaan ylimmän tason Kansio, sen jälkeen kansion alakansiot ja tiedostot, ala-alakansiot ja tiedostot jne.. Koodiesimerkki alla, jossa haetaan tiedot viideltä tasolta.
Alla oleva koodi toimii haluamallani tavalla, mutta haluaisin mahdollisuuden määrittää "foreach-silmukoiden" määrän, kun tiedossa on tasojen määrä.
Eli, jos tasojen määrä on määritetty kymmeneksi, tulisi foreach 10 kertaa sisäkkäin.
Olen yrittänyt for/while silmukoiden avulla, mutta en saa tuota silmukoiden sisäkkäisyyttä aivoillani toimimaan.
Olisin kiitollinen, jos joku osaa ohjata oikeaan suuntaan.
$this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_ID = 1'); $arrFiles = $this->Lib->DBHandler->result; $list = array(); foreach($arrFiles as $fileName){ $this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC'); $arrFiles = $this->Lib->DBHandler->result; if(!empty($arrFiles)){ foreach($arrFiles as $fileName){ $list[] = $fileName['DI_name']; $this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC'); $arrFiles = $this->Lib->DBHandler->result; if(!empty($arrFiles)){ foreach($arrFiles as $fileName){ $list[] = $fileName['DI_name']; $this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC'); $arrFiles = $this->Lib->DBHandler->result; if(!empty($arrFiles)){ foreach($arrFiles as $fileName){ $list[] = $fileName['DI_name']; $this->Lib->DBHandler->sqlQuery('SELECT * FROM t_dir_'.$idNum.' WHERE DI_parent_id = '.$fileName['DI_ID'].' ORDER BY DI_name ASC'); $arrFiles = $this->Lib->DBHandler->result; if(!empty($arrFiles)){ foreach($arrFiles as $fileName){ $list[] = $fileName['DI_name']; } } } } } } } } }
Oletko kuullut funktioista ja rekursiosta?
Tauluja ei pitäisi koskaan luoda dynaamisesti, eli luultavasti kantarakenteessasi olisi parantamisen varaa.
Jos riittää, että saadaan sisimmän tason tiedot, ongelman voi ratkaista helposti myös näin:
function kysely($id, $tasoja, $taulu) { $sql = "SELECT t{$tasoja}.DI_name FROM {$taulu} AS t{$tasoja}\n"; for ($i = $tasoja; $i > 0; --$i) { $j = $i - 1; $sql .= "JOIN {$taulu} AS t{$j} ON t{$i}.DI_parent_id = t{$j}.DI_ID\n"; } $sql .= "WHERE t{$i}.DI_ID = {$id}\n"; return $sql; } echo kysely(1, 3, "taulu");
SELECT t3.DI_name FROM taulu AS t3 JOIN taulu AS t2 ON t3.DI_parent_id = t2.DI_ID JOIN taulu AS t1 ON t2.DI_parent_id = t1.DI_ID JOIN taulu AS t0 ON t1.DI_parent_id = t0.DI_ID WHERE t0.DI_ID = 1
Toki kyselyyn voi lisätä ylempien tasojen tietojen palautuksen, jolloin ylemmät tiedot tulevat joka riville uudestaan.
function kysely($id, $tasoja, $taulu) { $kentat = array(); for ($i = 0; $i <= $tasoja; ++$i) { $kentat[] = "t{$i}.DI_name AS name_{$i}"; } $kentat = implode(",\n", $kentat); $taulut = array("FROM {$taulu} AS t{$tasoja}"); for ($i = $tasoja; $i > 0; --$i) { $j = $i - 1; $taulut[] = "RIGHT JOIN {$taulu} AS t{$j} ON t{$i}.DI_parent_id = t{$j}.DI_ID"; } $taulut = implode("\n", $taulut); return "SELECT\n{$kentat}\n{$taulut}\nWHERE t{$i}.DI_ID = {$id}\n"; } echo kysely(1, 3, "taulu");
SELECT t0.DI_name AS name_0, t1.DI_name AS name_1, t2.DI_name AS name_2, t3.DI_name AS name_3 FROM taulu AS t3 RIGHT JOIN taulu AS t2 ON t3.DI_parent_id = t2.DI_ID RIGHT JOIN taulu AS t1 ON t2.DI_parent_id = t1.DI_ID RIGHT JOIN taulu AS t0 ON t1.DI_parent_id = t0.DI_ID WHERE t0.DI_ID = 1
Kaikki tiedostot ja hakemistot yhteen tauluun, ei mitään turhia ja epävakaita purkkaviritelmiä. Sitten voit hakea tavaran yhdellä kyselyllä ja järjestellä sen puuksi PHP:n päässä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.