Hej, jeg vil skabe en menu med php. Problemet er at strukturen er dynamisk, altså ved jeg ikke hvor mange underpunkter der er til et givent hovedpunkt.
jeg har tre primære felter i min database nøglefeltet id parent (int) der peger på 0 eller en værdi fra en id menusubject der indeholder en titel til menupunktet
jeg ville så lave en function ala
function buildMenu($level="0"){ $entries = mysql_query("SELECT * FROM menutable where parent='$what'"); while($entry = mysql_fetch_array($entries)){ echo $entry['id']." - ".$entry['menusubject']; buildMenu($entry['id']); }
}
men det kager den totalt over, men hvorfor... er der en der kan komme med en god beskrivelse af en sådan funktion der gentager sig selv i stil med ovenstående.
// SQL fil CREATE TABLE jamal ( id int(9) unsigned NOT NULL auto_increment, parent_id int(9) NOT NULL default '0', navn varchar(20) NOT NULL default '', PRIMARY KEY (id) ) TYPE=MyISAM;
# # Data dump for tabellen `jamal` #
INSERT INTO jamal VALUES (1, 0, 'hejsa'); INSERT INTO jamal VALUES (2, 0, 'hejsa2'); INSERT INTO jamal VALUES (3, 0, 'hejsa3'); INSERT INTO jamal VALUES (4, 1, 'hejsa4'); INSERT INTO jamal VALUES (5, 3, 'hejsa5'); INSERT INTO jamal VALUES (6, 7, 'hejsa6'); INSERT INTO jamal VALUES (7, 4, 'hejsaasd'); INSERT INTO jamal VALUES (8, 5, 'dasdfdsa');
// samlet.php <? include("connect.php"); ?> Her ser du bare en liste over alle de rækker der er i tabellen. Skrevet op med deres ID først og dernæst deres navn.<br> <select name="hej"><? $res_alle_kat = mysql_query("SELECT * FROM jamal order by id ASC"); while ($row_alle_kat = mysql_fetch_array($res_alle_kat)){ print "<option>".$row_alle_kat[navn]."</option>\n"; } ?></select> <br><br><br><br> Her ser du hvordan du meget let og ret forståeligt for selv en nybegynder, kan lave en kategori-menu med underkategorier. Disse kategorier er hver især udstyret med et id og et parent id, samt et navn. Bemærk! --------- viser blot hvor den næste "hovedkategori" starter. Denne kan selvfølgelig fjernes ved at slette *1<br> <? function getchildmenu($id = 0,$space = ""){ $res = mysql_query("SELECT * FROM jamal where parent_id='$id' order by id ASC") or die (mysql_error()); while ($row = mysql_fetch_array($res)){ print "<option>".$space." - ".$row[navn]."</option>\n"; getchildmenu($row[id],$space." "); print $id; //*1 if (!$id){ //*1 print "<option>-------------</option>\n"; //*1 } //*1 } } ?>
<select name="hej2"> <? getchildmenu(); ?> </select> <br><br><br><br> Læg mærke til at jeg her har valgt ID 6 da denne har flest parents. Tjek evt. mysql!<br> du kan selvfølgelig også bare give getparentmenu() en første parameter, som får den til at starte ved hvilkensomhelst række.<br> Denne funktion er desuden lavet på fuldstændig samme måde som getchildmenu(), dog med et par finjusteringer.<br><? function getparentmenu($id = 6,$space = ""){ $res = mysql_query("SELECT * FROM jamal where id='$id'") or die (mysql_error()); while ($row = mysql_fetch_array($res)){ print "<option>".$space."- ".$row[navn]."</option>\n"; getparentmenu($row[parent_id],$space." "); } }?> <select name="hej3"> <? getparentmenu(); ?> </select>
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.