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.