bra Posted February 1, 2005 Report Share Posted February 1, 2005 (edited) Sveiki, Es esmu iesācējs PHP valodā, esmu daudz ko pētījis un domājis par dinamisku satura organizēšnu tad nu man radās šāds jautājums, ņemot par piemēru šo topiku http://php.lv/f/index.php?showtopic=1569http://php.lv/f/index.php?showtopic=1569 kā varētu izskatīties izvads šaidai datu atlasīšanai Kaklz dotajam piemēram tas ir kā būtu labāk jāveido SQL pieprasījumi lai teiksim ciklā izvadītos Pirmā sadaļa pirmā apakšada Otrā apakšadaļa Otrās apakšsadaļas apakšadaļa Otrā Sadaļa utt. t.i. Lai katrai sadaļai apakšā kārtotos tai piederošās apakšadaļas. Problēmu man nav nekādu ja izināms cik tad būs to apakš sadaļu, bet ja pēkšņi ir nepieciešamas vairāk atkal ir jāraksta jauns querijs kā optimizēt šo te lietu. Varbū šis te ir diezgan lāmīgs jautājums, bet es esmu iesācējs PHP valodā, būšu priecīgs par katru ideju un palīdzību. Edited February 1, 2005 by bra Link to comment Share on other sites More sharing options...
Kaklz Posted February 1, 2005 Report Share Posted February 1, 2005 Nekādi SQL pieprasījumi nav jālabo, ir jālabo tikai nododamie parametri, kurus padod caur URL. Link to comment Share on other sites More sharing options...
рпр Posted February 1, 2005 Report Share Posted February 1, 2005 uzzini, kas ir rekursija Link to comment Share on other sites More sharing options...
bubu Posted February 1, 2005 Report Share Posted February 1, 2005 function printMenu($id=0) { $q = mysql_query("SELECT id, teksts FROM tabula WHERE parent_id=$id"); echo '<ul>'; while ($r = mysql_fetch_row($q)) { echo '<li>'; echo '<a href="sadalja.php?id='.$r[0].'">'.$r[1].'</a>'; printMenu($r[0]); echo '</li>'; } echo '</ul>' } printMenu(); Un noformējumu atstāj CSS ziņā. Link to comment Share on other sites More sharing options...
bra Posted February 1, 2005 Author Report Share Posted February 1, 2005 skaidrs ir veins par to $_GET; būšanu, bet mans jautājums ir kā ar php / Sql pirprasīju palīdzību panākt to rekursiju uzzini, kas ir rekursija rekursija ir cikls(darbība) kura turpinās līdz ir atrisināta problēma ( to es zināju ) VArbūt nebiju korekti noforulējis jautājumu, tātad. Kāda varētu izskatīties pieprasījumu veidošana php/sql lai panāktu ka katra apakšadaļa kārtojas zem sadaļai, kurai tā ir piesaistīta. t.i. ja man ir teiksim 3 sadaļas galvanā sadaļai kurai ir piesastītaas 2. lai arī tā tas tiktu attēlots Pirmā sadaļa piesatītā apakšadaļa piesatītā apakšadaļa Jautājums ir par pašu sintaksi lai man nebūtu jānnorāda ka te būs 1 līmeņa sadaļas zem tām 2 līmeņa sadaļas utt. lai tas notiktos automātiski Paldies jau iepriekš Link to comment Share on other sites More sharing options...
Venom Posted February 1, 2005 Report Share Posted February 1, 2005 tabulas struktūra id|parent_id|label resp. piem. 1 - mājas tehnika _2 - veļas mašīnas __3 - bosh __5 - electrolux _4 - televizori 9 - datortehnika pierakstās kā 1|0|mājas tehnika 2|1|veļas mašīnas 3|2|bosh 4|1|televizori 5|2|electrolux 9|0|datortehnika $toplevel=$info=array(); SELECT * FROM tabula while $f=fetch... //taisām saistīto sarakstu $info[$f['id']]['label']=$f['label']; if (!if['parent_id']) $toplevel=$f['id']; else { if (empty($info[$f['parent_id']]['children'])) $info[$f['parent_id']]['children']=array(); $info[$f['parent_id']]['children'][]=$f['id']; } //while beidzas function recurse_branch($id,$indent='<br />') { global $info; echo $indent.$info[$id]['label']; if (!isset($info[$id]['children'])) return; foreach($info[$id]['children'] as $id) recursive_branch($id,$indent.' '); } foreach($toplevel as $id) recurse_branch($id); Link to comment Share on other sites More sharing options...
bubu Posted February 1, 2005 Report Share Posted February 1, 2005 ...rekursija ir cikls(darbība) kura turpinās līdz ir atrisināta problēma ( to es zināju )... 13294[/snapback] Nē ne tā. Rekursija ir tāda funkcija, kas izsauc sevi. (un nav jau teikts, ka problēma tiek atrisināta, tas jau var notikties mūžīgi, protams līdz atmiņa izbeidzās :) Link to comment Share on other sites More sharing options...
bra Posted February 3, 2005 Author Report Share Posted February 3, 2005 ņa Venom vai nevarētu lūdzu bik apskaidrot, kas tur notiek un ja iespējams uzraxtīt mazliet iesācējam patīkamākā valodā, nevēlos kļūt par copy/paste cokedri, jo vēlos ko arī iemacīties nevis visu mūžu copy/paste ;) Link to comment Share on other sites More sharing options...
bubu Posted February 3, 2005 Report Share Posted February 3, 2005 A mans kods tev neder? Vai arī to tu nesaproti? Link to comment Share on other sites More sharing options...
bra Posted February 3, 2005 Author Report Share Posted February 3, 2005 diemžel kautkas niet vai arī nesaprotu teiksim kādēļ ir $id=0 ja zinot ka pie autoinscramet 0 nu nekādīgi un nekad nvar būt Link to comment Share on other sites More sharing options...
Venom Posted February 3, 2005 Report Share Posted February 3, 2005 vēlreiz: tabulas struktūra id|parent_id|label 1|0|mājas tehnika 2|1|veļas mašīnas 3|2|bosh 4|1|televizori 5|2|electrolux 9|0|datortehnika paņem lapiņu un izej tabulai no augšas uz leju, no sākuma pierakst id=1 mājas tehnika otram elementam parent_id =1, t.i. viņš ir jāraksta zem pirmā: id=1 mājas tehnika _id=2 veļas mašīnas utt. parent_id==0 ir tiem, kas ir pašā sākumā, resp, tiem nav vecākā elementa -viņi paši ir roots of all evil $toplevel=$info=array(); SELECT * FROM tabula //taisām saistīto sarakstu "vienkārši" masīvs, kurā elementi ir sabāzti tā, ka mēs varam iegūt sekojošu info: elt->label - tekstuālais nosaukums un, ja elt ir apakšzari, tad būs arī elt->children=masīvs, kurā tiek savākti šo apakšzaru id pa ceļam iekš $toplevel savācam "saknes", t.i. tos elementus, kuriem nav vecākā tālāk ņemam rokās funkciju, kas ņem kādu id, aiziet uz masīvu un ā) izzīmē tekstu (papildus tiek pielietots $indent atstarpe no kreisās malas, kas ar katru dizļuma līmeni tiek pagarināts) bē) pārbauda - ja elementam ir bērni, ņem pēc kārtas to id un tāpatās padod funkcijai - apstrādāšanai. te arī ir rekursijas moments. function recurse_branch($id,$indent='<br />') { global $info; echo $indent.$info[$id]['label']; //izrakstām nosaukumu if (!isset($info[$id]['children'])) //ja nav apakšzaru, ar šo zaru darbības pabeigtas return; //nē - ir bērni, katru izrakstām dziļāk foreach($info[$id]['children'] as $id) recursive_branch($id,$indent.' '); } //piemērojam f-ju augšējā līmeņa saknēm foreach($toplevel as $id) recurse_branch($id); Link to comment Share on other sites More sharing options...
bubu Posted February 3, 2005 Report Share Posted February 3, 2005 diemžel kautkas niet vai arī nesaprotu teiksim kādēļ ir $id=0 ja zinot ka pie autoinscramet 0 nu nekādīgi un nekad nvar būt 13339[/snapback] Tas $id ir php mainīgais, nevis datubāzes lauks! Paskaties selektā: SELECT id, teksts FROM tabula WHERE parent_id=$id Te taču tas $id tiek izmantots galīgi pie citas kolonnas, nevis ID!! Link to comment Share on other sites More sharing options...
Venom Posted February 3, 2005 Report Share Posted February 3, 2005 tu man? es vispār te skaidroju kā glabāt vairāklīmeņu sazarotās struktūras, ķip var paspēlēties ar http://venom.venta.lv/ven.menu/ Link to comment Share on other sites More sharing options...
bubu Posted February 3, 2005 Report Share Posted February 3, 2005 (edited) Nē ne tev, bet gan bra. :) Ar tavējo menu esmu jau spēlējies. Edited February 3, 2005 by bubu Link to comment Share on other sites More sharing options...
neo Posted April 10, 2006 Report Share Posted April 10, 2006 (edited) bubu, kaa dabuut tos liimenus ieks List/menu. Tipa izmeeginaaju shaadi: echo "<select>"; function printMenu($id=1) { $q = mysql_query("SELECT id, teksts FROM tabula WHERE parent=$id ORDER BY seciba"); while ($r = mysql_fetch_row($q)) { echo '<option>'; echo $r[1]; printMenu($r[0]); echo '</option>'; } } printMenu(); echo "</select>"; Vizuaali visi ieraksti sanaak vienaa liimenii. Kaa lai panaak, ka lai apakseejie liimeni pastumjas uz labo pusi? It kaa jau var ar , bet kuraa vietaa tos likt? Edited April 10, 2006 by neo Link to comment Share on other sites More sharing options...
Recommended Posts