Avatar billede kasbas91 Nybegynder
16. september 2010 - 14:20 Der er 24 kommentarer og
1 løsning

Hej eksperten, hvordan kan man lave dropdowns i php...

Hej eksperten.

Jeg tænkte at det kunne være fedt at have dropdowns på sin globale menu.

Men hvordan kan man lave dropdowns i php, når indholdet bliver hentet via MySQL.

Jeg har prøvet at lege lidt med det, men kan virkelig ikke få det til at spille på nogen måde.

Jeg tror at man kan gøre det sådan her, jeg styler en menu i css som man vil gøre til en dropdown og har sat
ul li = <a href=""></a> /li /ul tags, og henter indholdet fra MySQL.

Min database kan se således:

MIN GLOBALE MENU:
------------------------
CREATE TABLE IF NOT EXISTS `global_navigation` (
  `nav_id` int(11) NOT NULL AUTO_INCREMENT,
  `nav_title` varchar(128) DEFAULT NULL,
  `nav_target` varchar(128) DEFAULT NULL,
  `nav_content` longtext,
  `nav_alias` varchar(128) DEFAULT NULL,
  `nav_position` int(11) DEFAULT '0',
  `nav_active` varchar(128) DEFAULT NULL,
  PRIMARY KEY (`nav_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

SUB MENUER:

CREATE TABLE IF NOT EXISTS `dynamic_subnav_menu` (
  `subnav_id` int(11) DEFAULT NULL,
  `nav_id` int(11) DEFAULT '0' COMMENT 'Her matcher vi denne nav_id sammen med den fra global_navigation',
  `subnav_title` varchar(128) DEFAULT NULL,
  `subnav_target` varchar(128) DEFAULT NULL,
  `subnav_content` longtext,
  `subnav_alias` varchar(128) DEFAULT NULL,
  `subnav_position` int(11) DEFAULT '0',
  `subnav_active` int(11) DEFAULT '0'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


Men så er det bare og det overhovedet er rigtigt. Og kan ikke få det til at virke i php delen...

Håber i vil hjælpe mig... ;P
Avatar billede kasbas91 Nybegynder
16. september 2010 - 15:02 #1
Her er min globale navigation:



<?php
$global_navigation = "SELECT * FROM `global_navigation` WHERE `nav_active` = 1 ORDER BY `nav_position` ASC";
if($global_navigation_result = $mysqli->query($global_navigation)){
    while($this_global_navigation = $global_navigation_result->fetch_object()){
        if($global_navigation_result->num_rows >= 1){
            $set_nav_id = $this_global_navigation->nav_id;
            echo "<li><a href=\"index.php?subj={$this_global_navigation->nav_id}\" title=\"{$this_global_navigation->nav_title}\" target=\"{$this_global_navigation->nav_target}\">{$this_global_navigation->nav_title}</a></li>";
        }
    }
    //$global_navigation_result->close();
}
?>


Men hvordan kan man lave dropdowns fra denne menu..
Avatar billede majbom Novice
16. september 2010 - 17:39 #2
<?php
echo "<select name='din_select'><option value=''>vælg noget...</option>\n";
$options = "";
$global_navigation = "SELECT * FROM `global_navigation` WHERE `nav_active` = 1 ORDER BY `nav_position` ASC";
if($global_navigation_result = $mysqli->query($global_navigation)){
    while($this_global_navigation = $global_navigation_result->fetch_object()){
        if($global_navigation_result->num_rows >= 1){
            $set_nav_id = $this_global_navigation->nav_id;
            $options .= "<option value='index.php?subj={$this_global_navigation->nav_id}'>"{$this_global_navigation->nav_title}</option>\n";
        }
    }
    //$global_navigation_result->close();
}
echo $options;
echo "</select>";
?>


og så skal der jo en onchange-event på, så der sker noget når der vælges - hvis det er dér der skal skiftes side, ellers kan du bruge en knap eller billede...
Avatar billede kasbas91 Nybegynder
16. september 2010 - 18:21 #3
Øhh det var ikke det jeg mente med dropdown.

Altså en top menu hvor man føre musen over fx skoleopgaver så kommer der under menuer frem... Hvis du forstår..
Avatar billede kasbas91 Nybegynder
16. september 2010 - 19:17 #4
Fx. http://themeforest.net/item/corporate-works-/full_screen_preview/121469

Lidt ligesom denne menu med undermenuer....
Avatar billede majbom Novice
16. september 2010 - 19:48 #5
nååh, det er jo ikke php - det er (D)HTML og Javascript du skal have fat i - så nej :)
Avatar billede kasbas91 Nybegynder
16. september 2010 - 21:33 #6
Når okay, så dropper vi det bare, men jeg vil lige høre om noget,

jeg har lavet en venstre menu, den funger også fint,

den virker således at man trykker på fx skoleopgaver i den globale

menu i toppen, så kommer der automatisk

nogle punkter i venstre side. Og de punkter der kommer kan man så

trykke på om så kommer der nogle nye sub punkter...

Hvis du forstår.

Men så er mit problem at at de sub punkter der kommer under de andre

som bliver vist 2 gange og de bliver vist ens...


Jeg har noget kode hvis det måske kan hjælpe dig..

Min globale menu:



<?php
$global_navigation = "SELECT * FROM `global_navigation` WHERE `nav_active` = 1 ORDER BY `nav_position` ASC";
if($global_navigation_result = $mysqli->query($global_navigation)){
    while($this_global_navigation = $global_navigation_result->fetch_object()){
        if($global_navigation_result->num_rows >= 1){
            $set_nav_id = $this_global_navigation->nav_id;
            echo "<li><a href=\"index.php?subj={$this_global_navigation->nav_id}\" title=\"{$this_global_navigation->nav_title}\" target=\"{$this_global_navigation->nav_target}\">{$this_global_navigation->nav_title}</a></li>";
        }
    }
    //$global_navigation_result->close();
}
?>



Og mine punkter også i venstre side:



<?php
$dynamic_leftbar = "SELECT * FROM `dynamic_leftnav` l JOIN `global_navigation` n ON l.`nav_id` = n.`nav_id` WHERE n.`nav_id` = '".$_GET['subj']."'";
if($dynamic_leftbar_result = $mysqli->query($dynamic_leftbar)){
    while($this_leftbar = $dynamic_leftbar_result->fetch_object()){
        if($dynamic_leftbar_result->num_rows >= 1){
            echo "<li><a href=\"index.php?subj={$this_leftbar->nav_id}&#8834;={$this_leftbar->leftnav_id}\" title=\"{$this_leftbar->leftnav_title}\" target=\"{$this_leftbar->leftnav_target}\">{$this_leftbar->leftnav_title}</a></li>";
            $dynamic_subnav = "SELECT * FROM `dynamic_subnav` WHERE `leftnav_id` = '".$_GET['sub']."'";
            if($dynamic_subnav_result = $mysqli->query($dynamic_subnav)){
                while($this_dynamic_subnav = $dynamic_subnav_result->fetch_object()){
                    if($dynamic_subnav_result->num_rows >= 1){
                        echo "<li> - <a href=\"index.php?subj={$this_dynamic_subnav->nav_id}&#8834;={$this_dynamic_subnav->leftnav_id}&subnav={$this_dynamic_subnav->subnav_id}\" title=\"{$this_dynamic_subnav->subnav_title}\" target=\"{$this_dynamic_subnav->subnav_target}\">{$this_dynamic_subnav->subnav_title}</a></li>";
                    }
                }
            }
        }
    }
}
?>



Du kan også prøve siden af her og se hvad jeg mener:

http://prowdesign.dk/skolen/index.php
Avatar billede majbom Novice
16. september 2010 - 21:50 #7
det er jo fordi du kører query'en der henter underpunkter ved hvert punkt i din venstre menu - du skal kun køre den ved det punkt der er valgt jo.

det kunne gøres med en if-sætning, hvor du tjekker om det valgte punkt ($_GET['sub']) er det samme som id'et på det punkt du netop har genereret - håber det gav mening :)

desuden er det fedt at se du bruger mysqli, men du bør bruge prepared statements de steder hvor du bruger variabler i dine queries i hvert fald hvis variablen kan ændres af klienten som $_GET['sub']

http://dk2.php.net/manual/en/class.mysqli-stmt.php

på den måde undgår du sql-injections
Avatar billede kasbas91 Nybegynder
16. september 2010 - 21:58 #8
Jeg forstår dig ikke helt tror jeg ;P

Er det sådan du mener det:



<?php
$dynamic_leftbar = "SELECT * FROM `dynamic_leftnav` l JOIN `global_navigation` n ON l.`nav_id` = n.`nav_id` WHERE n.`nav_id` = '".$_GET['subj']."'";
if($dynamic_leftbar_result = $mysqli->query($dynamic_leftbar)){
    while($this_leftbar = $dynamic_leftbar_result->fetch_object()){
        if($dynamic_leftbar_result->num_rows >= 1){
            echo "<li><a href=\"index.php?subj={$this_leftbar->nav_id}&#8834;={$this_leftbar->leftnav_id}\" title=\"{$this_leftbar->leftnav_title}\" target=\"{$this_leftbar->leftnav_target}\">{$this_leftbar->leftnav_title}</a></li>";
            if($_GET['sub']){ // HAR GET SUB HER, ER DET, DET DU MENER
                $dynamic_subnav = "SELECT * FROM `dynamic_subnav` WHERE `leftnav_id` = '".$_GET['sub']."'";
                if($dynamic_subnav_result = $mysqli->query($dynamic_subnav)){
                    while($this_dynamic_subnav = $dynamic_subnav_result->fetch_object()){
                        if($dynamic_subnav_result->num_rows >= 1){
                            echo "<li> - <a href=\"index.php?subj={$this_dynamic_subnav->nav_id}&#8834;={$this_dynamic_subnav->leftnav_id}&subnav={$this_dynamic_subnav->subnav_id}\" title=\"{$this_dynamic_subnav->subnav_title}\" target=\"{$this_dynamic_subnav->subnav_target}\">{$this_dynamic_subnav->subnav_title}</a></li>";
                        }
                    }
                }   
            }
        }
    }
}
?>

Avatar billede majbom Novice
16. september 2010 - 22:09 #9
jeg har lidt svært ved at gennemskue din kode dér, men essensen er at der hvor du har lavet if-sætningen skal sammenligne $_GET['sub'] med id'et på det punkt du netop har genereret.

de punkter du har der hedder "billedbehandling" og "typografi" under skoleopgaver må have et id, som har en reference til de respektive underpunkter - det er det id du skal sammenligne med $_GET['sub'] i den if-sætning...
Avatar billede kasbas91 Nybegynder
16. september 2010 - 22:57 #10
Ja se nu virker det skam... Men et spørgsmål mere

Her udskriver den indholdet fra de forskellige menu punkter..

Og fx,

# Billedebehandling
# Typografi

Når man trykker på dem kommer der en tekst, og det er den her:



if($_GET['sub']){
                $dynamic_leftnav_content = "SELECT * FROM `dynamic_leftnav` WHERE `leftnav_id` = '".$_GET['sub']."'";
                if($dynamic_leftnav_content_result = $mysqli->query($dynamic_leftnav_content)){
                    while($this_leftnav_content = $dynamic_leftnav_content_result->fetch_object()){
                        if($dynamic_leftnav_content_result->num_rows >= 1){
                            //echo "<p>{$this_leftnav_content->leftnav_content}</p>";
                        }
                    }
                    $dynamic_leftnav_content_result->close();
                }
            }



Og den tekst som kommer, bliver der selv om man går ned på en af de under punkter og det skal den jo ikke... Så kommer teksterne bare til at stå oven i hinanden.

Prøv at kigge her:

http://prowdesign.dk/skolen/index.php?subj=1&sub=1&subnav=1


<?php
            if($_GET['subj'] && $_GET['sub']){
                $dynamic_content = "SELECT * FROM `dynamic_content` WHERE `id` = '".$_GET['subj']."'";
                if($dynamic_content_result = $mysqli->query($dynamic_content)){
                    while($this_content = $dynamic_content_result->fetch_object()){
                        if($dynamic_content_result->num_rows >= 1){
                            echo "<p>{$this_content->dynamic_content}</p>";
                        }
                    }
                    $dynamic_content_result->close();
                }
            }

            if($_GET['subnav']){
                $dynamic_subnav_content = "SELECT * FROM `dynamic_subnav` WHERE `subnav_id` = '".$_GET['subnav']."'";
                if($dynamic_subnav_content_result = $mysqli->query($dynamic_subnav_content)){
                    while($this_subnav_content = $dynamic_subnav_content_result->fetch_object()){
                        if($dynamic_subnav_content_result->num_rows >= 1){
                            echo "<p>{$this_subnav_content->subnav_content}</p>";
                        }
                    }
                    $dynamic_subnav_content_result->close();
                }
            }
            ?>



Håber det er til at forstå... ;P

Kunne være lækkert hvis du kendte et svar på dette,
fordi jeg har prøvet alt muligt...
Avatar billede majbom Novice
16. september 2010 - 23:17 #11
hvis den kun skal vise det punkt du er på, altså hvis du er på et underpunkt, skal den kun vise underpunktet og ikke dens parent, så skal du jo tjekke på i din første while hvor du echo'er om $_GET['subnav'] er sat, hvis den er det, skal du ikke echo'e parent-punktet...

og så husk lige det der med prepared statements :)
Avatar billede kasbas91 Nybegynder
16. september 2010 - 23:26 #12
Okay jeg forstår det ikke lige ;P.

Jamen altså:

Når jeg trykker på parent punktet:
Er url: http://prowdesign.dk/skolen/index.php?subj=1&sub=1

Og hvis jeg trykker på underpunktet:
Er url: http://prowdesign.dk/skolen/index.php?subj=1&sub=1&subnav=1

Så den bliver stadig ved med at tage fra &sub=1.

Og derfor udskriver den vel også parent punktet indhold ud sammen med underpunktet.
Avatar billede majbom Novice
16. september 2010 - 23:39 #13
nemlig, så hvis du nu, der hvor du udskriver parent-punktet, tjekker om der er valgt underpunkt kan du jo undlade at udskrive parent-punktet...
Avatar billede kasbas91 Nybegynder
16. september 2010 - 23:43 #14
ja hmm, hvordan kan jeg tjekke det,

min hovede står fuldstændig stille lige nu... hehe...

Hvordan kan sådan et tjek se ud ... undskyld jeg spørger

efter så meget, men skal bare lige have det banket ind. Så jeg kan

frem over... ;P
Avatar billede majbom Novice
16. september 2010 - 23:57 #15
if($dynamic_content_result->num_rows >= 1){
  if(!isset($_GET['subnav'])){
      echo "<p>{$this_content->dynamic_content}</p>";
  }
}


skulle kunne gøre det :)
Avatar billede kasbas91 Nybegynder
17. september 2010 - 00:02 #16
Nu kan man ikke se parent punktet's content når man
trykker på det ;P

Og det skulle man helst, men det skulle forsvinde igen når man trykker på et under punkt..
Avatar billede kasbas91 Nybegynder
17. september 2010 - 00:05 #17
JEEPSSS nu virker det, det var bare mig som ikke var helt vågen....


Jeg takker rigtig mange mange gange for din hjælp.... ;P
Avatar billede kasbas91 Nybegynder
17. september 2010 - 00:09 #18
Nu skal jeg se om jeg kan få de der prepared statements til at virke, har aldrig rodet med sådan noget i mysqli.. ;P
Avatar billede kasbas91 Nybegynder
17. september 2010 - 00:23 #19
Er det, det her du mener:


                    <?php
                    if($stmt = $mysqli->prepare("SELECT `nav_id`, `nav_title`, `nav_target` FROM `global_navigation` WHERE `nav_active` = 1 ORDER BY `nav_position` ASC")){
                      $stmt->execute();
                      $stmt->bind_result($nav_id, $nav_title, $nav_target);
                     
                      while ($stmt->fetch()) {
                                echo "<li><a href=\"index.php?subj={$nav_id}\" title=\"{nav_title}\"
                                target=\"{nav_target}\">{$nav_title}</a></li>";
                        }
                          /* Close the statement */
                        $stmt->close();
                    }
                    ?>

Avatar billede majbom Novice
17. september 2010 - 07:10 #20
ja næsten, du skal bare bruge det hvor du bruger variabler i din query, som her:

$dynamic_subnav_content = "SELECT * FROM `dynamic_subnav` WHERE `subnav_id` = '".$_GET['subnav']."'";

hvor skifter variablen ud med spørgsmålstegn og binder variablen til efter du har prepared dit statement...
Avatar billede kasbas91 Nybegynder
17. september 2010 - 09:10 #21


if($stmt = $mysqli->prepare("SELECT `nav_id`, `nav_content` FROM `global_navigation` WHERE `nav_id` = ?")){
                      $stmt->execute();
                      $stmt->bind_result($_GET['subj'], $nav_content);
                     
                      while ($row = $stmt->fetch()) {
                        if(!isset($_GET['sub'])){
                            echo "<p>{$nav_content}</p>";
                        }
                        }
                        /* Luk statement */
                    $stmt->close();
                }



Jeg har prøvet det her, men kan ikke få det til at virke.
Avatar billede kasbas91 Nybegynder
17. september 2010 - 09:33 #22
Jeg har fået fixet det. Men har du lige tid et øjeblik..

Jeg kan ikke få det til at virke 100%.

Hvorfor kan jeg ikke forbinde disse to prepare statements.
Man jeg ikke sætte dem sammen ved fetch...



<?php
<?php
if($stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `leftnav_title`, `leftnav_target` FROM `dynamic_leftnav` WHERE `nav_id` = '".$_GET['subj']."'")){
$stmt->bind_param('i', $nav_id);
$nav_id = $_GET['subj'];
$stmt->execute();
$stmt->bind_result($nav_id, $leftnav_id, $leftnav_title, $leftnav_target);
while ($stmt->fetch()) {
echo "<li><a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}\" title=\"{$leftnav_title}\" target=\"{$leftnav_target}\">{$leftnav_title}</a></li>";
}   

// Hvorfor kan jeg ikke forbinde disse to prepare statements

$stmt = $mysqli->prepare("SELECT `nav_id`, `leftnav_id`, `subnav_id`, `subnav_title`, `subnav_target` FROM `dynamic_subnav` WHERE `leftnav_id` = '".$_GET['sub']."'");
$stmt->bind_param('i', $leftnav_id);
$leftnav_id = $_GET['sub'];
$stmt->execute();
$stmt->bind_result($nav_id, $leftnav_id, $subnav_id, $subnav_title, $subnav_target);
while ($stmt->fetch()) {
echo "<li> - <a href=\"index.php?subj={$nav_id}&sub={$leftnav_id}&subnav={$subnav_id}\"title=\"{$subnav_title}\" target=\"{$subnav_target}\">{$subnav_title}</a></li>";
}
/* Luk statement */
$stmt->close();
}

Avatar billede majbom Novice
17. september 2010 - 12:38 #23
$stmt->bind_param('i', $nav_id);

bruger du til at binde en variabel til et spørgsmålstegn i dit statement, så ét spørgsmålstegn, ét parameter/variabel

du sætter $_GET variablen direkte ind i statement'et, så giver det ingen effekt

du kan prøve at udskrive $stmt->error eller $mysqli-error alt efter hvor i koden du er, for at se om der måske er et problem dér.

nu tror jeg osse denne tråd er løbet langt nok fra det oprindelige spørgsmål :)
Avatar billede kasbas91 Nybegynder
17. september 2010 - 14:28 #24
Ja det er den nok, men du skal i hvert fald have mange tak for din hjælp... Skal jeg oprette en ny tråd hvis det bliver ved med at bøvle... ;P
Avatar billede majbom Novice
17. september 2010 - 19:45 #25
selv tak - ja det synes jeg - det giver også et bedre overblik for brugere der har samme problem og søger herinde :)
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