Boomstructuur en PHP

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

Onderwerpen


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Topicstarter
Ik ben momenteel bezig met het maken van een simpele php site waarbij ik graag gebruik wil maken van "mooie" links.Nu wil ik graag deze mooie pad terugzoeken in een boomstructuur in de database, alleen door mijn te verwaarlozen ervaringen met databases loop ik tegen wat problemen aan

Ik heb de volgende tabel in de database:

SQL:
1
2
3
4
5
6
7
8
9
CREATE TABLE `pages` (
  `page_id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) default NULL,
  `title` varchar(255) NOT NULL default '',
  `shortname` varchar(255) default NULL,
  PRIMARY KEY  (`page_id`),
  KEY `parent_id` (`parent_id`),
  CONSTRAINT `fk_page_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `pages` (`page_id`) ON DELETE CASCADE
) TYPE=InnoDB;


Hierbij kan ik dus een structuur hebben zoals:

cursussen (page_id: 1 | parent_id: '' )
cursus1 (page_id: 2 | parent_id: 1 )
cursus2 (page_id: 3 | parent_id: 2 )
inschrijfformulier (page_id: 4 | parent_id: 3 )

Mijn probleem wat ik nu heb is dat ik graag afhankelijk van de boompad de correct page_id terug zou willen hebben, een mogelijk een boompad in dit voorbeeld zou kunnen zijn: "cursussen/cursus1" of "cursussen/cursus2/inschrijfformulier". Waarbij dan respectievelijk de volgende page_id als resultaat zouden terug moeten komen: page_id=2 en page_id=4.

Nu heb ik verschillende ding al reeds geprobeerd zoals het ophalen van alle pagina's dmv. de volgende query:

code:
1
SELECT page_id, parent_id, title, shortname FROM `pages`


Vervolgens hak ik de url in mootjes dmv. explode( '/', $_GET[ 'path' ] ). Daarna loop ik de recordset door dmv. een for-loop, van boven naar beneden door -- omdat van beneden naar boven niet lukte.

PHP:
1
2
3
4
5
6
   $pagina_naam = $record[ 'shortnaam' ];  // pagina naam
   if ( array_key_exists( $pagina_naam, $pad_structuur ) {
         $result[] = $record[ 'page_id' ];
   }

  $page_id = $result[ count( $result ) ];  // resultaat van het pad opslaan en gebruiken.


Nu werkt dit dus niet en ik vroeg me nu af hoe ik dit het beste zou kunnen oplossen. Ik heb ook gekeken naar Data boomstructuur idee, alleen hierbij heb ik vervolgens hetzelfde probleem als ik het goed begrepen heb.

[ Voor 12% gewijzigd door alienfruit op 19-05-2005 11:09 ]


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 18-09 10:39
Denk dat dit wel een artikel is wat je kunt gebruiken :P

Of dit.

[ Voor 24% gewijzigd door riezebosch op 19-05-2005 11:18 ]

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

Verwijderd

Nadeel van Preorder Tree is de hele update/insert methodes, wordt best complex omdat goed werkend te krijgen, maar daarintegen kan je wel je boom/pad snel ophalen middels een paar query's en heb je geen recursieve functies nodig!

Acties:
  • 0 Henk 'm!

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Ben dit probleem zelf ook tegengekomen bij het implementeren van userfriendly URIs.

Maak nu gaebruik van een array waar alle geldige paden in staan. Indien een pad geldig is dan krijg ik dus de pageID terug en krijgt de bezoeker de pagina, indien een pad niet voorkomt in de array dan krijgt de bezoeker een 404 pagina met daarop de sitemap.

Ik denk overigens dat het beter is om je de tabel die jij gebruikt éénmalig in een array te gooien om daar vervolgens je bewerkingen mee te doen...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Acties:
  • 0 Henk 'm!

  • Rhapsody
  • Registratie: Oktober 2002
  • Laatst online: 23:42

Rhapsody

In Metal We Trust

Verwijderd schreef op donderdag 19 mei 2005 @ 11:24:
Nadeel van Preorder Tree is de hele update/insert methodes, wordt best complex omdat goed werkend te krijgen, maar daarintegen kan je wel je boom/pad snel ophalen middels een paar query's en heb je geen recursieve functies nodig!
Het feit dat het opvragen zeer snel gaat is natuurlijk een zeer goed argument om voor deze variant te kiezen. Het wijzigen van een PreOrder Tree zal vermoedelijk veel minder vaak gebeuren.

[ Voor 4% gewijzigd door Rhapsody op 19-05-2005 11:53 ]

🇪🇺 pro Europa! | Puinhoop Veroorzaken en Vertrekken (PVV)


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Topicstarter
Maak nu gaebruik van een array waar alle geldige paden in staan. Indien een pad geldig is dan krijg ik dus de pageID terug en krijgt de bezoeker de pagina, indien een pad niet voorkomt in de array dan krijgt de bezoeker een 404 pagina met daarop de sitemap.

Ik denk overigens dat het beter is om je de tabel die jij gebruikt éénmalig in een array te gooien om daar vervolgens je bewerkingen mee te doen...
Ja, ik haal nu al alle nodes dmv. één query uit de database. Maar hoe maak jij die padden array dan of sla je het niet op in een database?

Acties:
  • 0 Henk 'm!

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
alienfruit schreef op donderdag 19 mei 2005 @ 16:21:
[...]


Ja, ik haal nu al alle nodes dmv. één query uit de database. Maar hoe maak jij die padden array dan of sla je het niet op in een database?
Nadat mijn array heb gevuld met de voor de bezoeker toegankelijke data maak ik een dictionary aan. PHP heeft daar vast wel een equivalent voor...

ASP:
1
2
3
4
5
6
        dim X
        If IsArray(arrMenu) Then
            For X = 0 To UBound(arrMenu, 2)
                call dicFriendlyURIs.add(arrMenu(0, X), buildFriendlyURI(arrMenu(0, X)))
            Next
        End If


Met de volgende functie bouw ik de vriendelijke URI. objTaal.getTaalCode() geeft de language code, die bestaat uit de primary code en de eventuele secondary code.

ASP:
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
    Public Function buildFriendlyURI(menuID)
        dim X
        dim intMenuID, intRelatieID, strFriendlyURI
        dim strTemp : strTemp = ""
        dim intInternalMenuID : intInternalMenuID = menuID
        
        Do 
            For X = 0 To UBound(arrMenu, 2)
                intMenuID       = arrMenu(0, X)
                
                If intInternalMenuID = intMenuID Then
                    intRelatieID    = arrMenu(1, X)
                    strFriendlyURI  = CStr(arrMenu(4, X))
                    
                    If IsNull(intRelatieID) Then
                        strTemp = "/" & objTaal.getTaalCode(arrMenu(13, X)) & "/" & strFriendlyURI & "/" & strTemp
                        Exit Do
                    Else
                        strTemp = strFriendlyURI & "/" & strTemp
                    End If
                    
                    intInternalMenuID = intRelatieID
                    Exit For
                End If
            Next
        Loop
        
        buildFriendlyURI = strTemp
    End Function


Ik sla dus geen volledige paden op in de database, wèl de URI name van de betreffende pagina...

[ Voor 11% gewijzigd door faabman op 19-05-2005 22:06 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Topicstarter
Ja, ik sla zelf de URL naam van de pagina op :) Dit is dan bij mij de "shortname".
Omdat de pagina titel gebruiken het niet echt vriendelijker maakt. Ik ga jij idee eens uitwerken, als ik wat met databases moet dan is het altijd tig keer moeilijker dan zonder :(
Pagina: 1