Jump to content
php.lv forumi

Par dinamiskiem pieprasījumiem


bra

Recommended Posts

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 by bra
Link to comment
Share on other sites

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

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

...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

ņ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

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

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

  • 1 year later...

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 by neo
Link to comment
Share on other sites

×
×
  • Create New...