Avatar billede hobz Nybegynder
12. juli 2004 - 15:36 Der er 14 kommentarer og
1 løsning

Hierakisk menu i PHP og MySQL

Jeg har i en mysqldb lavet følgende fields:
ID
Parent
Tekst

Hvor parent henviser til den entry der er parent for dette menupunkt. F.eks.:
Mad (ID: 1, Parent: NULL, Tekst: Mad)
Varm (ID: 2, Parent: 1, Tekst: Varm)
Stærk (ID: 3, Parent: 2, Tekst: Stærk)
Kold (ID: 4, Parent: 1, Tekst: Kold)
Drikke (ID: 5, Parent: NULL, Tekst: Drikke)
Vin (ID: 6, Parent: 5, Tekst: Vin)
Spiritus (ID: 7, Parent: 5, Tekst: Spiritus)
osv.

Min idé er, at trække alle disse informationer ud med en alm. SELECT * FROM database, og behandle parent/child forholdet mellem disse, meget gerne med en rekursiv funktion, så man kan lave uendelig mange childs og parents.
I eksemplet bliver strukturen:
.Mad
.+ Varm
.++ Stærk
.+ Kold
.Drikke
.+ Vin
.+ Spiritus
Avatar billede jaw Nybegynder
12. juli 2004 - 15:40 #1
Og hvad er så spørgsmålet? ;)
Avatar billede hobz Nybegynder
12. juli 2004 - 15:48 #2
Hvordan laver man denne funktion der kan identificere og behandle disse childs og parents i alfabetisk rækkefølge?
Avatar billede jaw Nybegynder
12. juli 2004 - 15:56 #3
Jeg ved ikke om du kan bruge det her, eller om jeg måske misforstår dig lidt...

<?

//connect

$q = mysql_query("SELECT * FROM menu WHERE parent IS NULL") or die(mysql_error());
while($row = mysql_fetch_array($q)) {
  if(!isset($_GET['parent']) || $_GET['parent'] != $row['id']) {
    echo "<a href='".$_SERVER['PHP_SELF']."?parent=".$row['id']."'>+ " . $row['tekst'] . "</a><br>";
  }
  elseif(isset($_GET['parent']) && $_GET['parent'] == $row['id']) {
    $q1 = mysql_query("SELECT * FROM menu WHERE parent = '".$_GET['parent']."'") or die (mysql_error());
    echo "<a href='".$_SERVER['PHP_SELF']."'>+ " . $row['tekst'] . "</a><br>";
    while($data = mysql_fetch_array($q1)) {
      echo "&nbsp;&nbsp;" . $data['tekst'] . "<br>";
    }
  }
}
?>
Avatar billede jaw Nybegynder
12. juli 2004 - 15:59 #4
Hov, havde lige glemt det med alfabetisk rækkefølge:

<?

//connect

$q = mysql_query("SELECT * FROM menu WHERE parent IS NULL ORDER BY tekst ASC") or die(mysql_error());
while($row = mysql_fetch_array($q)) {
  if(!isset($_GET['parent']) || $_GET['parent'] != $row['id']) {
    echo "<a href='".$_SERVER['PHP_SELF']."?parent=".$row['id']."'>+ " . $row['tekst'] . "</a><br>";
  }
  elseif(isset($_GET['parent']) && $_GET['parent'] == $row['id']) {
    $q1 = mysql_query("SELECT * FROM menu WHERE parent = '".$_GET['parent']."' ORDER BY tekst ASC") or die (mysql_error());
    echo "<a href='".$_SERVER['PHP_SELF']."'>- " . $row['tekst'] . "</a><br>";
    while($data = mysql_fetch_array($q1)) {
      echo "&nbsp;&nbsp;" . $data['tekst'] . "<br>";
    }
  }
}
?>
Avatar billede hobz Nybegynder
12. juli 2004 - 16:48 #5
Det er ikke helt det jeg beder om. Jeg vil gerne kunne klare det i en sql-query, og ikke noget med query strings eller links.
Avatar billede jaw Nybegynder
12. juli 2004 - 16:49 #6
Erh, det forstår jeg ikke... En sql-query kan jo intet udskrive?
Avatar billede jaw Nybegynder
12. juli 2004 - 16:50 #7
Oh, jeg skulle lige lægge trykket de rigtige steder i din sidste kommentar... Bare se bort fra min sidste :)
Avatar billede hobz Nybegynder
12. juli 2004 - 18:35 #8
Okay. Nogle forslag?
Avatar billede jaw Nybegynder
12. juli 2004 - 19:02 #9
Ikke hvis du vil udhente det hele i 1 query, for det er jeg godt nok i tvivl om, om du kan...
Avatar billede hobz Nybegynder
12. juli 2004 - 19:47 #10
Det bliver jo sikkert noget med array-control.
Avatar billede Slettet bruger
13. juli 2004 - 13:19 #11
Jeg har på et tidspunkt lavet noget lignende, hvor jeg hentede ud på denne måde (NB! Null-værdien skal så være et nul, og ikke NULL):

$result=mysql_query("SELECT * FROM menu");

$menu=array();
while($row=mysql_fetch_assoc($result)){
  $menu[$row['parent']][]=$row;
}


Udskriften kan så klares med noget i denne stil:

function menu($parent){
  global $menu;  // For ikke at skulle kopiere arrayet til en hel masse rekursive funktioner.

  echo "<ul>";
  foreach($menu[$parent] as $menuitem){
    echo "<li>";
    echo $menuitem['tekst'];
    if(isset($menu[$menuitem['ID']]){
      menu($menuitem['ID']);
    }
    echo "</li>";
  }
  echo "</ul>";
}
Avatar billede Slettet bruger
13. juli 2004 - 13:19 #12
Selve menu-rekursionen startes så blot med

menu(0);
Avatar billede hobz Nybegynder
13. juli 2004 - 14:54 #13
Små rettelser og så virkede det. Takker!
Avatar billede demon3d Nybegynder
27. november 2004 - 19:41 #14
sandbox:

Hvordan ville koden skulle udformes hvis det skulle bruges til en <select> boks istedet?
Avatar billede Slettet bruger
28. november 2004 - 19:35 #15
En <select> kan da ikke indeholde et egentligt hierarki?

Det nærmeste man kan komme, er med nogle <optgroup label='overskrift'>.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB

De Nationale Geologiske Undersøgelser for Danmark og Grønland (GEUS)

IT-systemadministrator søges til GEUS

Politiets Efterretningstjeneste

Centerchef til Center for Support og Proces i PET

Udviklings- og Forenklingsstyrelsen

Generalist til PMO