Avatar billede Morten Professor
24. maj 2017 - 10:03 Der er 7 kommentarer og
2 løsninger

Hjælp til dynamic menu

Hej Eksperter

Jeg er ved at få lavet en dynamic menu, men kan ikke få det sidste på plads.
Her er koden:
<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
   
        while ($stmt->fetch()) {
?>
<li><a href="#"><?php echo $menu; ?></a>
<?php
    /* Sub menu */
    if ($stmt = $con->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_menu` WHERE id = ?' )) {
        /* Bind parametre */
        $stmt->bind_param('i', $sub_id);

        /* Sæt værdier på parametrene */
        $sub_id = $id;

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($sub_menu_id, $menu_id, $sub_menu);
   
        ?>
        <ul> 
  <?php
  while ($stmt->fetch()) {
  ?><li><a href="#"><?php echo $sub_menu; ?></a></li><?php
  }}}
  ?>
</ul>
</li>

    <?php
}
?>
</ul>
</div>
Her fejler den: Call to a member function fetch() on boolean in C:\wamp64\www\dynamic_menu_test\index.php on line 22

Har prøvet alt muligt men det virker kun på denne måde:
<div id="menu">
<ul>
<?php
$res=$con->query("SELECT * FROM tbl_menu");
while($row=$res->fetch_array())
{
?>
<li><a href="#"><?php echo $row['menu']; ?></a>
<?php
$res_pro=$con->query("SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM tbl_sub_menu WHERE menu_id=".$row['id']);
?>
        <ul>   
  <?php 
  while($pro_row=$res_pro->fetch_array())
  {
  ?><li><a href="#"><?php echo $pro_row['sub_menu']; ?></a></li><?php
  }
  ?>
</ul>
</li>

    <?php
}
?>
</ul>
</div>

Med venlig hilsen
Morten
Avatar billede Morten Professor
24. maj 2017 - 10:07 #1
Ved den første kode jeg viste skal der ved sub menuen være SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_sub_menu` WHERE id = ? lavede en fejl, men det gør stadig ikke en forskel.
Avatar billede Morten Professor
24. maj 2017 - 10:11 #2
SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_sub_menu` WHERE menu_id = ?
Avatar billede Rune1983 Ekspert
24. maj 2017 - 11:03 #3
Er du ikke nødt til at gemme $stmt som $stmt2 da du allerede har en variabel med de data en gang forinden.
Avatar billede olsensweb.dk Ekspert
24. maj 2017 - 11:03 #4
i din prepare statement:

du genbruger dit stmt og con i din sub query før du er færdig med din hoved query
det kan kun gå galt

der er sikkert flere fejl
hvordan ser dine 2 tabeller ud ?? så vi kan teste
Avatar billede Morten Professor
24. maj 2017 - 11:08 #5
Koden blev færdig:

<div id="menu">
<ul>
<?php
    /* Menu */
    if ($stmt = $con->prepare('SELECT `id`, `menu` FROM `tbl_menu`' )) {

        /* Eksekver forespørgslen */
        $stmt->execute();

        /* Bind resultatet */
        $stmt->bind_result($id, $menu);
   
        while ($stmt->fetch()) {
?>
<li><a href="#"><?php echo $menu; ?></a>
<?php
    /* Sub menu */
    if ($stmt1 = $con1->prepare('SELECT `sub_menu_id`, `menu_id`, `sub_menu` FROM `tbl_sub_menu` WHERE menu_id = ?' )) {
        /* Bind parametre */
        $stmt1->bind_param('i', $sub_id);

        /* Sæt værdier på parametrene */
        $sub_id = $id;

        /* Eksekver forespørgslen */
        $stmt1->execute();

        /* Bind resultatet */
        $stmt1->bind_result($sub_menu_id, $menu_id, $sub_menu);
   
        ?>
        <ul>
  <?php
  while ($stmt1->fetch()) {
  ?><li><a href="#"><?php echo $sub_menu; ?></a></li><?php
  }}
  ?>
</ul>
</li>

    <?php
    }}
?>
</ul>
</div>

Fedt mand tak for hjælpen :)

Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
25. maj 2017 - 06:35 #6
fik du din sub menu udskrevet under prepare statement ??

hvorfor har du din manu opdelt i 2 tabeller ??

jeg ville samle det i 1 tabel.
her er et eks jeg legede med ifm dit gamle spm
https://www.computerworld.dk/eksperten/spm/1008067?k=8205649


sql
--
-- Database: `test`
--


CREATE TABLE `drop_down` (
  `id` int(11) NOT NULL,
  `menu` varchar(255) NOT NULL,
  `parent_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `drop_down` (`id`, `menu`, `parent_id`) VALUES
(1, 'united states', 0),
(2, 'india', 0),
(3, 'russia', 0),
(4, 'britan', 0),
(5, 'Maharashtra', 2),
(6, 'Bihar', 2),
(7, 'texas', 1),
(8, 'montana', 1),
(9, 'washington', 1),
(10, 'moscow', 3),
(11, 'karnataka', 2),
(12, 'bangalore', 11),
(13, 'belgaum', 11),
(14, 'mysore', 11),
(15, 'brindavan', 14),
(16, 'mysore palace', 14);


ALTER TABLE `drop_down`
  ADD PRIMARY KEY (`id`);


ALTER TABLE `drop_down`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=17;



code, skal oversættes til prepare statement
<?php
// http://www.websitesdevelopments.com/blog/post/dynamic-multilevel-css-drop-down-menu-using-css-php-and-mysql
// siden existerer ikke mere,  oversat til mysqli

$con = mysqli_connect("127.0.0.1", "root", "", "test");

function sub($items, $id) {
    echo "<ul>";
    foreach ($items as $item) {
        if ($item['parent_id'] == $id) {
            echo "<li><a href='#'>" . $item['menu'] . "</a>";
            sub($items, $item['id']);
            echo "</li>";
        }
    }
    echo "</ul>";
}
?>
<html>
    <head>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <h2>Dynamic Multilevel CSS Drop Down Menu using, CSS, php and Mysql</h2>
        <?php
        $sql = "SELECT * FROM drop_down";
        $result = $con->query($sql);
        $row_count = $result->num_rows;
        if ($row_count) {
            $rows = $result->fetch_all(MYSQLI_ASSOC);
        }
        $items = $rows;
        $id = '';
        echo "<ul class = 'multidrop'>";
        foreach ($items as $item) {
            if ($item['parent_id'] == 0) {
                echo "<li><a href='#'>" . $item['menu'] . "</a>";
                $id = $item['id'];
                sub($items, $id);
                echo "</li>";
            }
        }
        echo "</ul>";
        ?>
    </body>
</html>
Avatar billede Morten Professor
25. maj 2017 - 07:36 #7
Hej

Ja jeg fik det lavet i prepare statement med noget hjælp fra jer ;)

Fordi jeg har delt den op i to var fordi jeg fandt det et sted men har så skrevet det om til prepare statement.

Her er hvor jeg fandt koden, http://www.codingcage.com/2015/03/dynamic-drop-down-menu-using-php-and.html

Men jeg vil da lige prøve den metode du har lavet og se om jeg kan skrive det om til prepare statement

Tak for du har taget dig tid til at lave det.
Avatar billede olsensweb.dk Ekspert
25. maj 2017 - 12:26 #8
>Men jeg vil da lige prøve den metode du har lavet og se om jeg kan skrive det om til prepare statement

her er den skrevet om til Prepare Statement

<?php
// http://www.websitesdevelopments.com/blog/post/dynamic-multilevel-css-drop-down-menu-using-css-php-and-mysql
// oversat til mysqli

$con = mysqli_connect("127.0.0.1", "root", "", "test");

function sub($items, $id) {
    echo "<ul>";
    foreach ($items as $item) {
        if ($item['parent_id'] == $id) {
            echo "<li><a href='#'>" . $item['menu'] . "</a>";
            sub($items, $item['id']);
            echo "</li>";
        }
    }
    echo "</ul>";
}
?>
<!DOCTYPE html>
<html lang="da">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" >
        <title>demo</title>

        <style type="text/css">
        </style>

    <body>
        <h2>Dynamic Multilevel CSS Drop Down Menu using, CSS, php and Mysql</h2>
        <?php
        $sql = 'SELECT * FROM drop_down';
        if ($stmt = $con->prepare($sql)) {
            $stmt->execute();           
            /*
            * ref  https://stackoverflow.com/questions/29309453/php-mysqli-prepared-statement-with-select
            * You would use PHP's get_result() rather than bind_result().
            */
            $result = $stmt->get_result();           
            $row_count = $result->num_rows;
            if ($row_count) {
                $rows = $result->fetch_all(MYSQLI_ASSOC);
            }
            $items = $rows;
            $id = '';
            echo "<ul>";
            foreach ($items as $item) {
                if ($item['parent_id'] == 0) {
                    echo "<li><a href='#'>" . $item['menu'] . "</a>";
                    $id = $item['id'];
                    sub($items, $id);
                    echo "</li>";
                }
            }
            echo "</ul>";
        }

        ?>
    </body>
</html>

tabellen bør nok udvides med en collonne til URL/link/href
så der ikke stå # i dette <a href='#'> i hoved og undermenuer
Avatar billede Morten Professor
25. maj 2017 - 12:41 #9
1000 tak, jeg prøvede rigtig meget her til morgen, at få det lavet om, og kan se det der ser meget bedre ud, og mere overskueligt, og så virker det perfekt
Du har givet mig en ny metode at løse det på. 1000 tak for hjælpen.
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

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