Avatar billede nickolajmadsen Nybegynder
04. februar 2012 - 23:16 Der er 10 kommentarer og
1 løsning

PHP menu nummerorden?

Jeg har brug for lidt hjælp mine undermenuer er ikke i nummerorden.

<?php
function fetch_sub_categories($id)
{
    $subresult = mysql_query("SELECT * FROM Categories WHERE parentcategory=".$id);
    $parentresult = mysql_query("SELECT * FROM Categories WHERE id = ".$id);
    if(mysql_num_rows($subresult)>0)
    {
        $parentname = mysql_fetch_array($parentresult);
        echo "<li><a href=\"#\"onclick=\"$('#menubar').toggle(); toggler(this, 'class', 'expand-more', 'expand-less'); return false;\">".$parentname['name']."</a><ul>";
        while($row = mysql_fetch_array($subresult)) {
            fetch_sub_categories($row['id']);
        }
        echo "</ul></li>";
    }
    else {
        $subresult = mysql_query("SELECT * FROM Categories WHERE id = ".$id);
        $row = mysql_fetch_array($subresult);
            echo "<li><a href=\"category.php?c=".$row['id']."\">".$row['name']."</a></li>";
       
    }
}
$result = mysql_query("SELECT * FROM Categories WHERE parentcategory=-1");
while($row = mysql_fetch_array($result))
{
    fetch_sub_categories($row['id']);
}
echo "</ul>";
}
}
else {
    ?>

Hvordan kan jeg få undermenuerne i nummerorden?
Her er lige et billede: http://i39.tinypic.com/5482ex.png
Mit projekt-/domænenavn er skjult af sikkerhedsmæssige årsager.

-Nickolaj Madsen
Avatar billede kjeldsted Novice
04. februar 2012 - 23:31 #1
mysql_query("SELECT * FROM Categories WHERE parentcategory=".$id ORDER BY navn)

Prøv med det. Så vidt jeg lige kan se skulle det kunne gøre det.
Avatar billede nickolajmadsen Nybegynder
04. februar 2012 - 23:54 #2
Hvor får du "navn" fra?
Det virker ikke.
Avatar billede kjeldsted Novice
05. februar 2012 - 00:28 #3
Ja, jeg har lidt svært ved sådan lige at gennemskue din kode... Den kunne godt være skrevet mere optimalt.
Hvad er grunden til at du benytter hele fire querys?
Men jeg kan se (medmindre jeg ser forkert) at feltet med titlen på undermenuen hedder 'navn' i databasen (korrekt?), derfor ORDER BY navn. Men kan da godt se det vist var i den forkerte query. Men i den query hvori du henter titlerne på undermenuerne skal den have en ORDER BY navn.

Desuden bør du ikke hente alle data ned (*), men i stedet kun de du skal bruge. Og så bør du også skifte mysql_fetch_array ud med mysql_fetch_assoc da du ikke benytter det indexerede array.
Avatar billede olebole Juniormester
05. februar 2012 - 02:54 #4
<ole>

Du kan gøre det med ét kald til databasen, hvilket performer bedre:

function getMenu() {
    $sql = 'SELECT * FROM Categories ORDER BY parentcategory, id, name';
    $res = mysql_query($sql);
    $menu = array(
        'items' => array(),
        'parents' => array()
    );
    while ($row=mysql_fetch_assoc($res)) {
        $menu['items'][$row['id']] = $row;
        $menu['parents'][$row['parentcategory']][] = $row['id'];
    }
    return buildMenu($menu);
}
function buildMenu($menu, $parent=0) {
    $arrHTML = array();
    $arrHTML[] = '<ul>';
    foreach ($menu['parents'][$parent] as $id) {
        if (!isset($menu['parents'][$id])) {
            $arrHTML[] = '<li>ID: '.$menu['items'][$id]['id'].' :: Name: '.$menu['items'][$id]['name'].'</li>';
        }
        if (isset($menu['parents'][$id])) {
            $arrHTML[] = ' <li>'.$menu['items'][$id]['id'].' :: Name: '.$menu['items'][$id]['name'];
            $arrHTML[] = buildMenu($menu, $id);
            $arrHTML[] = '</li>';
        }
    }
    $arrHTML[] = '</ul>';
    return implode('', $arrHTML);
}

Der i HTML-koden, hvor du vil udskrive menuen, skriver du:
<?php echo getMenu() ?>

Jeg har nøjes med at udskrive felterne i LI-elementer. Så må du selv formatere resten med links.

/mvh
</bole>
Avatar billede olebole Juniormester
05. februar 2012 - 03:01 #5
- og husk, hvad kjeldsted skrev om * og mysql_fetch_assoc. Husk også at indeksere tabellen.

Hvis jeg var dig, ville jeg desuden kikke på PDO eller prepared statements i mysqli. Det gamle mysql API er temmelig forældet, langsomt og ikke særlig sikkert
Avatar billede nickolajmadsen Nybegynder
05. februar 2012 - 10:29 #6
Fik det til at virke med kjeldsteds kode: mysql_query("SELECT * FROM Categories WHERE parentcategory = ".$id." ORDER BY name");
Måtte bare rette lidt, men det virker da. :D

Tak for hjælpen! :)

-Nickolaj Madsen
Avatar billede kjeldsted Novice
05. februar 2012 - 11:04 #7
Så mangler du bare lige at rette * ;)
Avatar billede olebole Juniormester
05. februar 2012 - 11:14 #8
Jamen, hvorfor dog bruge dusin- eller snesevis af databasekald for at få bygget en menu, når du kan nøjes med ét enkelt?

Med den kode, du bruger, behøver du ikke tænke på resten af det, vi skrev om optimering - eller andre optimeringer. De er småting i sammenligning  =)
Avatar billede nickolajmadsen Nybegynder
05. februar 2012 - 19:06 #9
RTFM: Jeg er ikke prof til det her..

Case solved, skulle kun lave orden i menuerne :-)
Avatar billede olebole Juniormester
05. februar 2012 - 19:43 #10
Nej, du er ikke pro, men det betyder jo ikke, du ikke kan lære at skrive bedre og lidt mere 'pro' kode  *o)

Er problemet løst, vil jeg varmt anbefale, du beder kjeldsted lægge et svar, så du kan lukke tråden med en accept  =)
Avatar billede kjeldsted Novice
05. februar 2012 - 21:02 #11
Så kommer svaret hér
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