Avatar billede zac Nybegynder
29. juni 2005 - 11:57 Der er 2 kommentarer og
1 løsning

2. niveau i menu som udtræk fra tabel med inf. om 1. og 2. niveau

Har tabel menuData med felterne type (prime eller sub), menuId (1-6), og navn (menupunktet) samt url (linket fra menu til side):

type prime - menuId 1 - name Hvad er...? - url
type sub  - menuId 1 - name  A...      - url
type sub  - menuId 1 - name  B...      - url
type prime - menuId 2 - name Hvorfor...  - url
type sub  - menuId 2 - name  H...      - url
type sub  - menuId 2 - neme  I...      - url
type prime - menuId 3 - name ...
...

Kan ikke få denne her til at virke - 2. niveaus select er i 1. niveaus while løkke, men åbenbart ikke korrekt:

    echo "<tr>";   
   
        $result = mysql_query( "SELECT                               
        * FROM                               
        menuData");
       
            while ($row = mysql_fetch_array($result))
            {
           
                $type                  = $row["type"];
                $menuId                = $row["menuId"];
                $name                  = $row["name"];
                $url                    = $row["url"];       
                   
                    if ($type == "prime")
                    {
                   
                            echo "<td>" . $name;                               
                            echo "</td>";
   
                    }
                                                                                                                       
    echo "</tr>";
                                                                                           
    echo "<tr>";
                       
                    echo "<td>";
                   
                        $result = mysql_query( "SELECT                               
                        m1.menuId as m1menuId, m2.menuId as m2menuId,
                        m1.type as m1type, m2.type as m2type
                        m1.name as name, m1.url as url
                        FROM menuData as m1, menuData as m2
                        WHERE m1.menuId = m2.menuId AND m1.type != m2.type ");
                       
                            while ($row = mysql_fetch_array($result))
                            {
                           
                            $m1menuId                  = $row["m1menuId"];
                            $m2menuId                  = $row["m2menuId"];
                            $m1type                  = $row["m1type"];   
                            $m2type                  = $row["m2type"];
                            $name                  = $row["name"];
                            $url                  = $row["url"];           
                               
                            echo "<a href=\"$url\">" . $name . "</a>" . "<br>";                               
                                                                   
                            }
                           
                    echo "</td>";
                   
            }
                                                                                           
    echo "</tr>";
Avatar billede zac Nybegynder
29. juni 2005 - 12:00 #1
Ideen er altså, at den sidste Select vha. tabel alias'er joines til sig selv, men for begge while'erne giver den "mysql_fetch_array(): supplied argument is not a valid MySQL result resource ".
Avatar billede Slettet bruger
30. juni 2005 - 19:05 #2
Jeg har lavet strukturer i den stil, hvor jeg har brugt felterne ID og ParentID til at holde styr på sammenhængen. Det giver også mulighed for mere end kun 2 niveauer, hvis der skulle være brug for det.

Man kan så vælge to forskellige metoder, når man skal hente det ud af databasen:

1) Hent hele svineriet på en gang og put det i et array. Derefter løbes arrayet igennem for at få det ud.

2) Først hent WHERE ParentID=0. Løb den igennem og for hver element hentes WHERE ParentID = $row[ID]

Hvis der ikke er alt for meget i databasen er nummer 1 den bedste metode, for så skal man ikke spørge databasen hele tiden. Hvis der derimod er en hel masse i databasen, og man normalt kun skal bruge et mindre udsnit af det, kan metode 2 være bedre.

Her er et kodeeksempel, hvor jeg går ud fra metode 1:

function displaymenu($parentid) {
  global $menu;
  if(array_key_exists($parentid,$menu){
    echo '<ul>'
    foreach($menu[$parentid] as $menuitem){
      echo '<li>';
      echo "<a href='{$menuitem['url']}'>{$menuitem['name']}</a>";
      displaymenu($menuitem['ID']);
      echo '</li>'
    }
    echo '</ul>';
  }
}

$res=mysql_query("SELECT * FROM menutabel");
while($row=mysql_fetch_assoc($res)){
  $menu[$row['ParentID']][]=$row;
}
mysql_free_result($res);

displaymenu(0);
Avatar billede zac Nybegynder
20. oktober 2005 - 23:49 #3
undskyld den sene svar accept!
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
Computerworld tilbyder specialiserede kurser i database-management

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