Hoofdcategorieën
Topicacties

[PHP] Recursief menu 'werkt niet'..

Pagina: 1

Reageer Nieuw Topic
Berichten: 85
Reg. datum: 29 augustus 2006

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,

Keess wijzigde dit bericht 12-12-2007 11:29 (4%)

 
Me OS X

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

* Nieuwe MacBook Pro! \o/ - * DELL 2007WFP te koop

Berichten: 85
Reg. datum: 29 augustus 2006

Inderdaad makkelijk als ik dat even vermeldt:

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

Acties: [view][quote]


Door: RobIII
Moderator PRG/SEA/WEB
Papa van LucaIII en DanuIII

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?
quote:
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.

RobIII wijzigde dit bericht 12-12-2007 11:30 (42%)

Lead me not into temptation, I can find it myself.

Trotse papa van Luca en Danu! | Pick My Icon!

Berichten: 85
Reg. datum: 29 augustus 2006

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

Keess wijzigde dit bericht 12-12-2007 11:53 (7%)

 
Weersverwachting 19 uur:
Berichten: 10.837
Reg. datum: 24 april 2000

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
<?php
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

Cartman! wijzigde dit bericht 12-12-2007 12:31 (9%)

Vanmiddag en vanavond vrij zonnig, bij een maximumtemperatuur tussen de 9 en 10 °C. De wind is zwak, kracht 2 uit NO.

Berichten: 85
Reg. datum: 29 augustus 2006

: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
 
Berichten: 7.892
Reg. datum: 30 juni 2001

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
 
Berichten: 85
Reg. datum: 29 augustus 2006

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.
 
Berichten: 85
Reg. datum: 29 augustus 2006

quote:
Dit werkt inderdaad nog gemakkelijker en met 1 functie, heb het net even getest op mijn tabel en werkt.

Keess wijzigde dit bericht 12-12-2007 12:13 (11%)

 
Berichten: 1
Reg. datum: 19 december 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



VNU Media logo Powered by True

© 1998 - 2009 Tweakers.net - Alle rechten voorbehouden - Uw Privacy - Algemene Voorwaarden

Uitgever van: