MySql gegevens voor menu uit DB halen

Pagina: 1
Acties:

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 03-05 15:28
De website van mijn werk ben ik aan het ombouwen zodat alle gegevens vanuit een database komen. Hiermee willen we uiteindelijk ook statistieken gaan bij houden.

Het werkende menu is te zien op www.aquariumweb.nl/menu_mobiel.php

Vanuit de bron kun je opmaken dat het hier om een javascript menu maar hier even de code die het menu opbouwt.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    <script language="JavaScript">
            var Link = new Array();
    Link[0] = "0|Abonnementen >>";
    Link[1] = "1|KPN Mobile|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[2] = "1|Vodafone|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[3] = "1|T-Mobile|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[4] = "1|Debitel|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[5] = "1|Orange|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[6] = "1|Galaxy|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[7] = "0|Mobiel Telefoons >>";
    Link[8] = "1|Nokia|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[9] = "1|Siemens|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[10] = "1|Sony Ericsson|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[11] = "1|Samsung|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[12] = "1|Motorola|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[13] = "1|LG|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[14] = "1|Accessoires|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[15] = "0|PDA >>";
    Link[16] = "1|HP|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[17] = "1|Fujitsu Siemens|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[18] = "1|Qtek|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[19] = "0|Car-Totaal >>";
    Link[20] = "1|Handsfreesets|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[21] = "1|Navigatie systemen|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[22] = "1|Audio systemen|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8892|mainFrame";
    Link[23] = "1|Alarm systemen|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
    Link[24] = "1|Volg systemen|http://hipath.siemens-channel.nl/index.php?cs=14130&log=v470d712c1p19&dealercode=712&search=8928|mainFrame";
startup(0);
        </script>


Nu heb ik mijn database met de volgende cellen opgebouwd: id, afdeling, hfdmenu, level, naam, menu_status en menu_order

Het volgende doet dit.

id: Spreekt voor zich
afdeling: De site is verdeeld in vier afdeling. Elke afdeling genereert zijn eigen menu.
hfdmenu: Heb ik als test gebruikt.
level: Is het een hoofmenu of onderliggend menu (abbonementen is hoofdmenu, de providers zijn onderliggende menu items)
naam: Spreekt voor zich
menu_status. Of het menu wel of niet zichtbaar is op de website.
menu_order We willen de volgerde van items kunnen bepalen.

De volgende code gebruik ik om de gegevens uit de db te halen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
            <?php
            $a = ("-1");
    $result=mysql_query("SELECT * FROM menu WHERE afdeling='0' AND level = '0' ORDER BY hfdmenu") or die (mysql_error());
        while ($row=mysql_fetch_object($result)){           
        $a++;
echo("Link[$a] = \"$row->level|$row->naam >>\";");
$result=mysql_query("SELECT * FROM menu WHERE hfdmenu='$row->level' AND level='1' ORDER BY menu_order") or die (mysql_error());
        while ($row=mysql_fetch_object($result)){           
        $a++;
echo("Link[$a] = \"$row->level|$row->naam|content.php?id=$row->id|mainframe\";");}}
            
            ?>

Het resultaat is hier te zien: http://www.aquariumweb.nl/testmenu/test_menu_backup.php
Als ik deze code gebruik geeft hij alleen het eerste menu deze is goed terwijl deze gegevens in mijn db staan.
Afbeeldingslocatie: http://www.aquariumweb.nl/screenshot_db.jpg

Ik ben nu al een tijdje dingen aan het proberen en heb het idee dat het op deze manier nooit gaat werken. M.b.v. mijn boek denk ik dat het met joins moet. Maar hoe????

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Submenu's moeten een eigen id hebben en een id van de parent. Vervolgens vervang je de 2e query door eentje where id gelijk aan row->id en klaar ben je.

Overigens leest je stukje PHP code vrij rot met de huidige indentering.

{signature}


Verwijderd

Voutloos schreef op donderdag 30 juni 2005 @ 12:46:
Submenu's moeten een eigen id hebben en een id van de parent. Vervolgens vervang je de 2e query door eentje where id gelijk aan row->id en klaar ben je.

Overigens leest je stukje PHP code vrij rot met de huidige indentering.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
           <?php

$a = ("-1");
    $result=mysql_query("SELECT * FROM menu 
                                  WHERE afdeling='0' 
                                  AND level = '0' 
                                  ORDER BY hfdmenu") or die (mysql_error());

        while ($row=mysql_fetch_object($result)){            
          
           $a++;
              echo("Link[$a] = \"$row->level|$row->naam >>\";");

              $result=mysql_query("SELECT * FROM menu 
                                                WHERE hfdmenu='$row->level'
                                                AND level='1' 
                                                ORDER BY menu_order") or die (mysql_error());
                 
              while ($row=mysql_fetch_object($result)){            
                
               $a++;
                 echo("Link[$a] = \"$row->level|$row->naam|content.php?id=$row->id|mainframe\";");
               
              }
        }
            
            ?>

Even netter gemaakt
;-)

[ Voor 69% gewijzigd door Verwijderd op 30-06-2005 13:02 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Dat is nog steeds niet echt netjes, al is het wel een stuk beter. ;) In P&W FAQ - Algemeen staat een stukje over net coden, en dus ook over inspringen, misschien heb je daar wat aan.

Overigens heb je in dit geval waarschijnlijk niet veel aan een join. Je zou wel met een union de twee resultsets aan elkaar kunnen zetten, kijk daar maar eens naar. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tja, je 1e query haalt hoofdmenu's op en per hoofmenu haalt de 2e query de submenu's op. Dit is 1 van de vele mogelijk manieren, de code heb je al en joins, unions etc heb je helemaal niet nodig. Als je zorgt dat je submenu's naar een hoofdmenu wijzen in de DB, zie ik het hele probleem verder niet.

{signature}


  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 03-05 15:28
Voutloos schreef op donderdag 30 juni 2005 @ 12:46:
Submenu's moeten een eigen id hebben en een id van de parent. Vervolgens vervang je de 2e query door eentje where id gelijk aan row->id en klaar ben je.
Dit heb ik zo aangepast. (dit was trouwens al een van de manieren die ik geprobeerd heb)
Het volgende doet hij nu. Hij haalt alleen het eerste menu uit de DB. Hij laat Telefooncentrales2 en 3 niet zien. Als ik de sub query er uit haalt, dan komen ze wel alle drie tevoorschijn.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
josvane schreef op donderdag 30 juni 2005 @ 14:06:
. Als ik de sub query er uit haalt, dan komen ze wel alle drie tevoorschijn.
:X

Je vervangt $result met het resultaat van de 2e query, nogal wiedes dat je buitenste loopje dan ook meteen klaar is. Hernoem er aub eens eentje.

{signature}


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Trouwens, waarom gebruik je een MD5 als id en niet gewoon een auto_increment? MD5 kan theoretisch dubbele keys genereren en is daarom geen unieke identifier en dus onbruikbaar als id. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • YopY
  • Registratie: September 2003
  • Laatst online: 01-05 10:25
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php

$a = "-1";
$result = mysql_query ("SELECT * FROM menu 
                                  WHERE afdeling='0'
                                  AND level = '0' 
                                  ORDER BY hfdmenu") 
                                  or die (mysql_error());

while ($row = mysql_fetch_object($result))
{            
     $a++;
     echo ("Link[$a] = \"$row->level|$row->naam >>\";");

     $result = mysql_query("SELECT * FROM menu 
                                       WHERE hfdmenu='$row->level'
                                       AND level='1' 
                                       ORDER BY menu_order")
                                       or die (mysql_error());
                 
     while ($row = mysql_fetch_object($result))
     {            
                
               $a++;
                echo ("Link[$a] = \"$row->level|$row->naam|content.php?id=$row->id|mainframe\";");
               
     }
}
?>


Beter :). Enkele dingen waar je om moet denken:

Geen spaties / ruimte voor de eerste <?php tag, als je bijvoorbeeld een header of een cookie wilt gebruiken geeft hij foutmeldingen aan als je dit doet.

Een paar spaties is niet erg, PHP negeert extra ruimtes tussen de <?php ?> tags dus je kunt zoveel spaties en returns gebruiken als je wilt. Hou het wel een beetje in toom echter ;).

Voor de rest... Doe zoals ik, zoek een paar PHP tutorials op met betrekking tot menus, en baseer daar je code op :).

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 03-05 15:28
Het id wordt gemaakt vanuit de unix tijd. Die ik dan inderdaad met md5 encrypt. Gewoon voor het leuk. Maar zo vanuit de tijd encrypten kan er dan ook een dubbel id uit komen?

Het werkt trouwens

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 05-05 21:37
josvane schreef op donderdag 30 juni 2005 @ 19:12:
Het id wordt gemaakt vanuit de unix tijd. Die ik dan inderdaad met md5 encrypt. Gewoon voor het leuk. Maar zo vanuit de tijd encrypten kan er dan ook een dubbel id uit komen?

Het werkt trouwens
Als je je eerst verdiept had in de werking van MD5, dan had je al snel uitgevonden dat een MD5 hash altijd een 32 lange string is en een combi is van cijfers en letters. Dat betekend dus dat er maar een beperkt aantal MD5 strings zijn, tegenover een onbeperkt aantal invoer strings (losse letter of zelfs gehele bestanden).

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

josvane schreef op donderdag 30 juni 2005 @ 19:12:
Het id wordt gemaakt vanuit de unix tijd. Die ik dan inderdaad met md5 encrypt. Gewoon voor het leuk.
Gewoon voor de leuk? Lijkt me weinig zinnig moet ik zeggen. ;) Sowieso maakt het je URL's onnodig lang, dit terwijl de UNIX-tijd in principe al redelijk uniek is (let wel: redelijk uniek, theoretisch kun je daar zelfs dubbelen mee krijgen). Ik zou als ik jou was, en het mogelijk is, overwegen om toch gewoon integers als id te nemen, misschien die UNIX-tijd, maar het liefst nog gewoon een auto_increment. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1