Dinamikus ul - li mysql php
Sziasztok!
Saját lapom fejlesztgetése közben egy ( számomra ) érdekes problémába ütköztem és nem nagyon találtam rá megoldást, legalábbis olyat amit fel is tudnék fogni :)
A szitu a következő:
- adott egy mysql tábla : id, parent_id, name
- ebből kellene ul li listát készitenem egy menühöz egy rekurzív függvénnyel
Ha valakinek van tippje pls help, merre induljak el...
Köszi a tippeket...
■ Saját lapom fejlesztgetése közben egy ( számomra ) érdekes problémába ütköztem és nem nagyon találtam rá megoldást, legalábbis olyat amit fel is tudnék fogni :)
A szitu a következő:
- adott egy mysql tábla : id, parent_id, name
- ebből kellene ul li listát készitenem egy menühöz egy rekurzív függvénnyel
Ha valakinek van tippje pls help, merre induljak el...
Köszi a tippeket...
Egy példa
{
$result = mysql_query('
SELECT id, name
FROM tabla
WHERE parent_id = '.(int) $parent
);
// ide valami sql hibakezeles, nem ez a lenyeg most, de legyen! :)
if (mysql_num_rows($result) < 1)
{
// ha nincs olyan elem, aminel ez a szulo, akkor semmit se kell csinalnunk
return;
}
echo '<ul>';
while ($row = mysql_fetch_assoc($result))
{
// kiirjuk az elem nevet, ha vannak "gyerekei", az kulon listaba megy moge
echo '<li>'.$row['name'];
/**
* A lenyeg itt van, mindig az aktualis elemre futtatjuk ujra ezt a
* fuggvenyt, de ott mar ez lesz a szulo elem, es igy tovabb.
*/
listRecursive($row['id']);
echo '</li>';
}
echo '</ul>';
}
Nyilván ha használsz PDO-t vagy egyéb DB layert, akkor máshogy néz ki a queryzés és az iteráció, ha nem közvetlenül kiírni szeretnéd a dolgokat, akkor az is máshogy fog kinézni, nulla HTML formázás a HTML forráskódban (indent/wrap), stb. A rekurzív működés lényegét viszont ebből szerintem át lehet látni.
EDIT: az elfelejtettem, hogy ha a gyökértől szeretnéd a listázást kezdeni, akkor listRecursive(0); használandó, tehát parent 0-ról indul, a db-ben remélhetőleg a gyökérbe szánt elemeknek 0 a parent_id-je.
Épp nemrég csináltam ilyet!
Annyit szólnék még hozzá, amit az oldalon is elmondanak, hogy érdemes cache -elni valamilyen módon a menüt, mert ha sok, akkor ne minden index kérésnél írja ki (forduljon az adatbázishoz), hanem például csak akkor, ha változott a menü, mondjuk új menüpontot vettek fel vagy töröltek. Tehát ilyenkor generálsz egy statikus index.html-t a dinamikus index.php-ből (én legalábbis így csináltam) és a látogatóknak a statikus html-t érnék el.
erőforrás-pazarlás
hmm alternatív megoldás?
weblabor cikkek
Hierarchikus adatkezelés SQL-lel PHP-ben II.
ha viszont csak főmenü- és almenüpontok vannak akkor ez még túlzás is.
hawaii, dj, pálmafák, királyság
deadcode kódja alapján megoldottam a problémát ( gyakorlatilag csak a db select-et kellett a saját cuccomhoz igazitani ), nagyon köszönöm! Viszont érdekelne ( ha más nem tanulás szempontjából ) a rekurzió nélküli dolog is, nem látom át hogyan lehetne megoldani a nélkül, bár ez valószínűleg rookie szintem miatt van... Köszi a segítséget!
Rekurzió
NP
milliós nagyságrend
Adatbázis kezelő
ezt nekem?
higalom, nyugavér
Ez 1 db lekérdezés, nem 1000*1000...
Csak azért neked válaszoltam, mert te mondtad, hogy 1000 mysql_query-t kell futtatni, mysql-ben lehet, de nem csak mysql létezik. Gondoltam jelzem, hogy van alternatíva, beszélgetünk, nem támadlak, ne védekezz :)
szerintem
elhangzott egy megoldás - ami történetesen mysql-t használt - és erre írtam, hogy ez erőforrás-pazarló. amikor az volt a válasz hogy nem - mindenféle indoklás nélkül -, akkor írtam hogy szerintem meg de, 1001 darab mysql_query az pazarló. ha szerinted még mindig teljesen relevánsan válaszoltál nekem, akkor bocs.
na ide hogy jutottunk?
Mert programozók vagyunk :)
te vetetted fel
-.-
Amúgy még mindig nem kaptam választ arra, hogy ebben a formában tárolt adatokat hogy lehet listázni a kért módon rekurzió nélkül, pedig tényleg érdekel.
Engem is
válaszok
ha neked a webfejlesztésnél az erőforrások pazarlása irreleváns, akkor lehet hogy a játékiparban kéne elhelyezkedned.
szükség... hát attól függ honnan nézzük. ahonnan te nézed onnan egy rossz megoldást szükséges használni, ahonnan én nézem, onnan a táblát szükséges módosítani. véleményem szerint a cél alapján kell eszközt választani, ha te az eszközeidnek megfelelően kreálod a célokat, akkor erről felesleges a vitát folytatni.
kérdés, hogy fejlesztőként hihetek-e abban hogy annyi adat lesz holnap is az adatbázisban mint ma, és holnap is feltétlenül kiválóan fog működni a ma készített kódom.
na ez az amit senki nem kérdezett meg tőle, és én a legvalószínűbbnek azt tartom, hogy fő és alkategóriákra van csak szüksége (#5), ez esetben a helyében egy fő- és egy alkategória táblában tárolnám az adataim, mert nincs szükség se rekurzióra se nested set-es megoldásra.
az ebben a formában tárolt adatokat sehogy, ezért ajánlottam a weblabor cikket, aminek az első részében bemutatják a rekurzióra épülő megoldást, majd a második részben mutatnak egy megoldást ami jobb. és itt lehet hogy rosszul fejeztem ki magam, de mentségemre szóljon, hogy kicsit szétzilálódtak a szálak.
Hatékonyság