Toon posts:

[PHP] Recursief menu 'werkt niet'..

Pagina: 1
Acties:
  • 1.394 views sinds 30-01-2008
  • Reageer

Onderwerpen


  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
Hallo,

Ik heb een recursieve functie die een menu opbouwt...
Dit werkt lokaal prima, maar op mijn www-webserver niet, beide PHP5.

Heb de 2 functies hier beneden herschreven, de 1e deed alles met veel omwegen, dacht dat het daar aan lag, maar deze werkt dus ook niet, terwijl dit toch wel een 'nette' code is om mijn menu op te bouwen?

Kan het te maken hebben dat ik lokaal MySQL5 en extern MySQL4 gebruik?

Hier de code en de MySQL tabel, misschien dat iemand het zelf wil proberen en/of mijn fout ziet, kijk misschien ergens overheen:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
function GetMainCat($level = 0)
{
    global $MySQL;
    
    $sql = $MySQL->Query("SELECT id, name FROM menu WHERE id > " . $level . " AND parent_id = id ORDER BY id ASC LIMIT 1");
    if (!$sql)
    {
        trigger_error("MySQL Error", E_USER_ERROR);
        exit;
    }
    if ($MySQL->GetRecordCount($sql) == 0)
    {
        return true;
    }
    
    $result = $MySQL->GetResult($sql);
    echo "<br><br>" . $result['name'] . "<hr>";
    
    GetSubCat($result['id']);
    
    // Haal de volgende hoofdcategorie op...
    GetMainCat($result['id']);
    return true;
}

function GetSubCat($parent_id, $level = 0)
{
    global $MySQL;
    
    $sql = $MySQL->Query("SELECT id, name FROM menu WHERE parent_id = " . $parent_id . " AND NOT parent_id = id");
    if ($MySQL->GetRecordCount($sql) == 0)
    {
        return true;
    }
    $i = 0;
    while ($result = $MySQL->GetResult($sql))
    {
        $struct = "";

        while ($i <= $level)
        {
            $struct .= " - ";
            $i++;
        }
        
        echo $struct . $result['name'] . "(" . $result['id'] . "|" . $level . ")<br>";
        $i = 0;
        
        GetSubCat($result['id'], ($level + 1));
    }
    return true;
}

GetMainCat();
?>


De MySQL tabel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE TABLE `menu` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL default '0',
  `name` varchar(50) NOT NULL default '',
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;

-- 
-- Gegevens worden uitgevoerd voor tabel `menu`
-- 

INSERT INTO `menu` VALUES (22, 22, 'Hoofdmenu 1');
INSERT INTO `menu` VALUES (23, 22, 'Subcategorie 1');
INSERT INTO `menu` VALUES (24, 22, 'Subcategorie 2');
INSERT INTO `menu` VALUES (25, 23, 'Sub-subcategorie 1');
INSERT INTO `menu` VALUES (26, 24, 'Sub-subcategorie 1');
INSERT INTO `menu` VALUES (27, 23, 'Sub-subcategorie 2');
INSERT INTO `menu` VALUES (28, 23, 'Sub-subcategorie 3');
INSERT INTO `menu` VALUES (29, 26, 'Sub');
INSERT INTO `menu` VALUES (30, 29, 'Nog een sub');
INSERT INTO `menu` VALUES (31, 30, 'en nog een');


Hij geeft alleen de hoofdcategorieen weer, dus geen subcategorieeen, verder geen errors.

Bij voorbaat veel dank,

[Voor 4% gewijzigd door Keess op 12-12-2007 11:29]


  • --MeAngry--
  • Registratie: september 2002
  • Laatst online: 09:07

--MeAngry--

aka Qonstrukt

En wat werkt er dan precies niet? Wat voor foutmeldingen krijg je?

Kia e-Soul MY2020 64kWh ExecutiveLine


  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
Inderdaad makkelijk als ik dat even vermeldt:

Hij geeft alleen de hoofdcategorieen weer, dus geen subcategorieeen, verder geen errors.

  • RobIII
  • Registratie: december 2001
  • Laatst online: 09:31

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Kijk even in onze Programming Beleid Quickstart voor hoe we hier graag topics zien. Zoals je zult lezen mis ik nogal het een en ander (zoals hierboven ook al wordt opgemerkt). Wil je zo vriendelijk zijn je topicstart daar even op aan te passen?
Keess schreef op woensdag 12 december 2007 @ 11:28:
Inderdaad makkelijk als ik dat even vermeldt:

Hij geeft alleen de hoofdcategorieen weer, dus geen subcategorieeen, verder geen errors.
En heb je al gedebugged?
Debuggen: Hoe doe ik dat?

Als 'ie geen subcategorieën weergeeft moet dat makkelijk zijn op te sporen waarom dat zo is.

[Voor 42% gewijzigd door RobIII op 12-12-2007 11:30]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
Het probleem is dat de MySQL query geen resulaten teruggeeft, denk nu dus dat het aan de gebruikte MySQL versie ligt, als ik bij phpMyAdmin de querys uitvoer op de 2 verschillende databases, (precies dezelfde tabel) krijg ik bij de lokale server 2 resulaten en de externe (v.4) 0 resultaten:

De query:

code:
1
SELECT `id`, `name`, `parent_id` FROM menu WHERE `parent_id` = 22 AND NOT `parent_id` = `id`


En dit de tabel inhoud, wat dus (volgens mij?) gewoon 2 resulaten zou moeten geven?

code:
1
2
3
4
5
6
7
8
9
10
11
id parent_id  name
22 22 Hoofdmenu 1 
23 22 Subcategorie 1 
24 22 Subcategorie 2 
25 23 Sub-subcategorie 1 
26 24 Sub-subcategorie 1 
27 23 Sub-subcategorie 2 
28 23 Sub-subcategorie 3 
29 26 Sub 
30 29 Nog een sub 
31 30 en nog een

[Voor 7% gewijzigd door Keess op 12-12-2007 11:53]


  • Cartman!
  • Registratie: april 2000
  • Niet online
Volgens mij heb je het idee van recursie niet zo goed begrepen in dit geval, dit kun je in 1 functie doen.

Je geeft alle hoofdcategorien parent_id = 0 mee. Je kunt dan een functie als deze gebruiken ervoor die netjes een array teruggeeft met de structuur:

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
30
31
32
33
34
35
36
37
38
39
40
function fetchNavigation($argIntParentId = 0, $argIntLevel = -1)
{
    // init level
    ++$argIntLevel;

    // do query
    $strSql = '
        SELECT
            *
        FROM 
            menu
        AND
            parent_id = ' . $argIntParentId . '
        ';
        
    $objResult = mysql_query($strSql);          
    
    // get results
    if (0 < mysql_num_rows($objResult))
    {
        // loop trough results
        while ($arrRow = mysql_fetch_assoc($objResult))
        {           
            $arrCat['id']           = $arrRow['id'];
            $arrCat['name']         = $arrRow['name'];
            $arrCat['parent_id']    = $arrRow['parent_id'];
            $arrCat['level']        = $argIntLevel;
            
            // add to array
            $arrCats[] = $arrCat;
            $arrSubs = $this->fetchNavigation($arrRow['id'], $argIntLevel);
            if(is_array($arrSubs)) $arrCats = array_merge($arrCats, $arrSubs);
        }
        return $arrCats;
    }
    else
    {
        return FALSE;   
    }
}

let op, code is ongetest omdat ik hem gestript hebt van andere (voor jou) overbodige features.

edit: nog n foutje weggewerkt

[Voor 9% gewijzigd door Cartman! op 12-12-2007 12:31]


  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
:X opgelost, kreeg ineens een ingeving

code:
1
WHERE `parent_id` = 22 AND NOT `parent_id` = `id`

[/code]

vervangen door:

code:
1
WHERE `parent_id` = 22 AND `parent_id` <> `id`


Dus toch te maken met de gebruikte MySQL versie..

Bedankt

  • Noork
  • Registratie: juni 2001
  • Niet online
Het lijkt me sterk dat het aan Mysql ligt. Zo exotisch zijn je statements niet. Klopt je data wel?

Heb je al geprobeerd om je query even te debuggen.
Dus zoiets (krijg je bij stap 2 en 3 wel data terug?)
1. SELECT * FROM menu WHERE `parent_id` = " . $parent_id . " AND NOT `parent_id` = `id`
2. SELECT * FROM menu WHERE `parent_id` = " . $parent_id
3. SELECT * FROM menu

  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
Bij stap 2 krijg ik dan alle rijen terug met parent_id 22, waarbij de rij met id 22 dus weggelaten zou moeten worden, dit kan ik in de PHP code zelf doen, maar dit leek me gemakkelijker in de SQL query zelf.
Stap 1 werkt dus niet met mysql versie 4, waarom :? waarna AND NOT vervangen door <> werkt het wel.

  • Keess
  • Registratie: augustus 2006
  • Laatst online: 22-07-2019
Dit werkt inderdaad nog gemakkelijker en met 1 functie, heb het net even getest op mijn tabel en werkt.

[Voor 11% gewijzigd door Keess op 12-12-2007 12:13]


  • C0D3R
  • Registratie: december 2007
  • Laatst online: 19-12-2007
Ik heb zoon zelfde soort database alleen hoe kan je dit netjes met rewrite_urls doen???

(main_cat_rewrite/sub_cat_rewrite/page_rewrite).html?
Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2022 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee