PHP Gallery Tree renderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Hallo tweakers,

Ik zit met een lastig probleem. Ik wil een tree maken van de categorieën. Dit wil ik als volgt laten zien.
code:
1
2
3
4
5
6
7
Test Gallery 1
Test Gallery 2
Test Gallery 3
- Sub Categorie 1
Test Gallery 4
Test Gallery 5
Test Gallery 6


De database structuur ziet er zo uit:
code:
1
2
3
4
5
6
7
8
id     name                       parent         thumb
1   Test Gallery 1                          gallery/thumb_001.png
2   Test Gallery 2                      gallery/thumb_002.png
3   Test Gallery 3                      gallery/thumb_003.png
4   Test Gallery 4                      gallery/thumb_004.png
5   Test Gallery 5                      gallery/thumb_005.png
6   Test Gallery 6                      gallery/thumb_006.png
7   Sub Categorie 1     3           gallery/thumb_007.png


En heb het geprobeerd om met de volgende functie die structuur te krijgen:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
    function galleryGetTree($parent){
        $sql="SELECT * FROM gallery_categorie WHERE parent='".$parent."'";
        $res=mysql_query($sql);
        if($res){
            while($n = mysql_fetch_assoc($res)){
                $r[] = galleryGetTree($n['parent']);
            }
        }
        return $r;
    }

    print_r(galleryGetTree(''));


Maar dat wil niet werken. Want dan zit het script vast in een loop en krijg ik na 60 seconden de timeout.
code:
1
Fatal error: Maximum execution time of 60 seconds exceeded in F:\HTDOCS\dev.kevinvdburgt.nl\holland_int\admin\page\i_manage.php on line 31


Wat gaat er fout? en hoe moet het wel?

Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Vervang $r[] = galleryGetTree($n['parent']); door $r[] = galleryGetTree($n['id']);

Edit: en zoals ZanderZ zegt, je structuur is niet zo goed (je php). Je doet nu veel teveel queries...

[ Voor 39% gewijzigd door Tharulerz op 05-08-2010 00:24 ]


Acties:
  • 0 Henk 'm!

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 19-09 13:37
Daar heeft crisp ooit een mooie blog over geschreven: Formatting a multi-level menu using only one query. Dat zou je een flink eind opweg moeten helpen :)

Full-stack webdeveloper in Groningen


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
Het heeft me een heel stuk duidelijker gemaakt, ik snap ook precies wat hij bedoeld. Maar nu krijg ik een rare fout, terwijl toch alles bijna hetzelfde is.

Dit is wat ik er van gebakken heb:
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
    function buildMenu($parent, $menuData){
        $html='';
        if(isset($menuData['parents'])){
            $html = '<ul>';
            foreach($menuData['parents'][$parent] as $item){
                $html.= '<li>' . $menuData['items'][$item]['name'];
                $html.= buildMenu($item, $menuData);
                $html.= '</li>';
            }
            $html.= '</ul>';
        }
        return $html;
    }

    $menuData = array(
        'items' => array(),
        'parents' => array()
    );

    $sql="SELECT * FROM gallery_categorie ORDER BY id ASC";
    $res=mysql_query($sql);
    if($res){
        while($node=mysql_fetch_assoc($res)){
            $menuData['items'][$node['id']] = $node;
            $menuData['parents'][$node['parent']] = $node['id'];
        }
    }
    
    echo buildMenu(0, $menuData);


En dit is de fout die ik krijg, ik snap niet waarom, maar hij controleert toch ook met isset() ?
PHP:
1
Warning: Invalid argument supplied for foreach() in F:\HTDOCS\dev.kevinvdburgt.nl\holland_int\admin\page\i_manage.php on line 33

Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
code:
1
if(isset($menuData['parents'])){


moet worden

code:
1
if(isset($menuData['parents'][$parent])){


Hoe moeilijk kan het zijn om code te kopiëren...

En dan nog, je ziet dat je een error krijgt op de foreach, je vergelijkt die code (en de regels errond) met die van crisp, je vindt de fout, en het is opgelost?


Misschien moet je deze code ook even toepassen:
*knip* laat je dat flauw doen aan die jongens met een rode naam over?

[ Voor 15% gewijzigd door MueR op 05-08-2010 02:01 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Begin eens bij het begin: Debuggen: Hoe doe ik dat?
Je topicstart maar ook deze vraag zijn prima door jezelf te beantwoorden.

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

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • xehbit
  • Registratie: Februari 2009
  • Laatst online: 26-08 22:19
RobIII schreef op donderdag 05 augustus 2010 @ 01:14:
Begin eens bij het begin: Debuggen: Hoe doe ik dat?
Je topicstart maar ook deze vraag zijn prima door jezelf te beantwoorden.
Echt weer copy&paste werk was het indd, code heel goed doorgelezen en functie's opgezocht wat het precies doet/werkt en dan zelf een soortgelijke code maken. En dat is gelukt! Thx!

Acties:
  • 0 Henk 'm!

Verwijderd

Een mooier voorbeeld van hoe dit sneller / makkelijker kan is met Modified Preorder Tree Traversal, ofwel MPTT, waarbij je in 1 query een hele tree structuur (ook hele grote) kunt opvragen zonder de overhead van recursive queries.

er zijn meerdere goede voorbeelden te vinden online, waaronder deze :
http://www.phpro.org/tuto...a-with-PHP-and-MySQL.html

Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Verwijderd schreef op vrijdag 06 augustus 2010 @ 09:55:
er zijn meerdere goede voorbeelden te vinden online, waaronder deze :
http://www.phpro.org/tuto...a-with-PHP-and-MySQL.html
Heb je crisps blogpost uberhaupt gelezen? Dat is namelijk eenzelfde methode, imho zelfs makkelijker.

Anyone who gets in between me and my morning coffee should be insecure.

Pagina: 1