Ik heb een kind-ouder tabel met o.a. de volgende nodes:
In het gekozen voorbeeld zou de query als volgt zijn. Ik krijg dan idd keurig "149" terug van mysql:
Ik wil nu deze functie uitbreiden / een tweede functie schrijven zodat ik de properties terugkrijg van alle nodes die leiden tot de huidige pagina. Met andere woorden, iets als:
• of ik een nieuwe functie moet schrijven of deze aan kan passen
• of dit met 1 query kan en zo ja; hoe deze eruit zou moeten zien. Mijn sql kennis is hiervoor nog niet groot genoeg. Het schrijven van de huidige functie kostte me veel moeite; ik hoop een duwtje in de goede richting te krijgen over de uitbreiding ervan
code:
Mijn CMS'je werkt met vriendelijke URL's. Stel een bezoeker die surft naar http://site.com/vlees/rood/. Ik wil er zeker van zijn dat ik de goede pagina 'rood' pak. Rood vlees (nid=149) in dit geval, niet rood fruit (nid=150). Ik controleer dat door de querystring (vlees/rood) naar een array te exploden en dynamisch een query op te bouwen die de goede nid retourneert:1
2
3
4
5
6
7
8
9
10
11
12
13
| +-----+-----+-------+-------+--------+ | nid | pid | title | alias | type | +-----+-----+-------+-------+--------+ | 1 | 0 | Home | | home | +-----+-----+-------+-------+--------+ | 142 | 1 | Vlees | vlees | story | +-----+-----+-------+-------+--------+ | 144 | 1 | Fruit | fruit | story | +-----+-----+-------+-------+--------+ | 149 | 142 | Rood | rood | store | +-----+-----+-------+-------+--------+ | 150 | 144 | Rood | rood | book | +-----+-----+-------+-------+--------+ |
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| function getActiveItem($pad) { $join = ''; $and = ''; $i = count($pad); for ($j = 0; $j < $i; $j++) { $join .= 'INNER JOIN nodes n'.($j+2).' ON n'.($j+1).'.nid = n'.($j+2).'.pid '; $and .= ' AND n'.($j+2).'.alias = "'.$pad[$j].'"'; } $result = db_query('SELECT n'.($i+1).'.nid FROM nodes n1 '.$join.'WHERE n1.pid = 0'.$and.' LIMIT 1'); if (db_num_rows($result) == 1) { return (db_result($result, 0)); } } |
In het gekozen voorbeeld zou de query als volgt zijn. Ik krijg dan idd keurig "149" terug van mysql:
code:
1
2
3
4
5
| SELECT n3.nid FROM nodes n1 INNER JOIN nodes n2 ON n1.nid = n2.pid INNER JOIN nodes n3 ON n2.nid = n3.pid WHERE n1.pid = 0 AND n2.alias = "vlees" AND n3.alias = "rood" LIMIT 1 |
Ik wil nu deze functie uitbreiden / een tweede functie schrijven zodat ik de properties terugkrijg van alle nodes die leiden tot de huidige pagina. Met andere woorden, iets als:
code:
Ik heb alleen geen idee hoe ik dit moet aanpakken. Graag hoor ik jullie tips over:1
2
3
4
5
6
7
8
| $querystring[0]['nid'] = 142 $querystring[0]['pid'] = 1 $querystring[0]['alias'] = vlees $querystring[0]['type'] = story $querystring[1]['nid'] = 149 $querystring[1]['pid'] = 142 $querystring[1]['alias'] = rood $querystring[1]['type'] = store |
• of ik een nieuwe functie moet schrijven of deze aan kan passen
• of dit met 1 query kan en zo ja; hoe deze eruit zou moeten zien. Mijn sql kennis is hiervoor nog niet groot genoeg. Het schrijven van de huidige functie kostte me veel moeite; ik hoop een duwtje in de goede richting te krijgen over de uitbreiding ervan
[ Voor 8% gewijzigd door Reveller op 01-01-2005 19:22 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."