login  Naam:   Wachtwoord: 
Registreer je!
 Forum

"Ingewikkelde" query

Offline DMM - 15/08/2007 16:40
Avatar van DMMPHP beginner Hallo

Ik geraak niet meteen uit het volgende probleem. Ik heb dus een menu waarbij sommige pagina's subpagina's hebben en andere niet. Een voorbeeldje:

Home
- Over ons
Diensten
- Wat?
- Prijzen
Contact

Deze zaken wil ik dus naar het scherm schrijven. Hiervoor maak ik gebruik van 2 tabellen. Eén met de hoofdpagina's en één met de subpagina's. Een link tussen beide tabellen leg ik zo:

* In de tabel hoofdpagina's maak ik een veld dat aangeeft of er bij de corresponderende hoofdpagina een subpagina is. Een 0 geeft aan dat er geen subpagina is, een 1 geeft aan dat er wel één is.
* In de tabel subpagina's is er een veld dat aangeeft welke subpagina past bij welke hoofdpagina.

Dit voorbeeld zal het (hopelijk  ) verduidelijken:
Tabel Hoofdpagina's:
http://img130.i...db1bk3.jpg
Tabel Subpagina's:
http://img505.i...db2rk8.jpg

Tot en met hier lukt het mij door gebruik te maken van twee queries. De eerste query selecteert alle hoofdpagina's samen met hun subpagina's. De tweede query selecteerd alle hoofdpagina's die geen subpagina's hebben.

Echter, nu moeten de gegevens geselecteerd worden op het zgn. 'volgordeid, een veld dat aanwezig is in mijn tabel. Dat lukt mij niet aangezien ik met twee queries werk (en dus met twee While-lussen).

Kan iemand mij verder helpen?

Alvast bedankt

21 antwoorden

Gesponsorde links
Offline marten - 15/08/2007 16:47
Avatar van marten Beheerder Als ik thuis ben zal ik hier even naar kijken voor je oke? Dus verwacht rond uurtje of 7 een antwoord. (Als er niet iemand me voor is)
Offline ikki007 - 15/08/2007 16:49
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Je maakt 1 while lus die door de hoofdpagina's (direct al op volgorde met b.h.v. een ORDER BY in je query) gaat.
Elke keer laat je hem controleren of die subpagina's heeft.
Heeft die dat wel haal je die erbij een print je die erbij.
Heeft die dat niet print je alleen de hoofdpagina.

Duidelijk? Anders even paar keer doorlezen  
Offline DMM - 15/08/2007 16:49 (laatste wijziging 15/08/2007 16:50)
Avatar van DMM PHP beginner @ Marten: Heel erg bedankt!
@ ikki007: Zal het even bekijken
Offline marten - 15/08/2007 16:53
Avatar van marten Beheerder
Citaat:
Je maakt 1 while lus die door de hoofdpagina's (direct al op volgorde met b.h.v. een ORDER BY in je query) gaat.
Elke keer laat je hem controleren of die subpagina's heeft.
Heeft die dat wel haal je die erbij een print je die erbij.
Heeft die dat niet print je alleen de hoofdpagina.


Dit kan gewoon in 1 query 
Offline ikki007 - 15/08/2007 16:55 (laatste wijziging 15/08/2007 16:55)
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Hier even wat duidelijker.

  1. $hoofdpaginaQuery = mysql_query("SELECT * FROM hoofdpaginas ORDER BY volgordeid ASC");
  2.  
  3. while($arr = mysql_fetch_array($hoofdpaginaQuery))
  4. {
  5. if($arr['subpaginas'] == 1)
  6. {
  7. // hier dat proces weer doorlopen met het ophalen van je subpagina en hoofdpagina + subpagina printen
  8. }
  9. else
  10. {
  11. // Hier de hoofdpagina printen
  12. }
  13. }


@marten: hoe dan  
Offline DMM - 15/08/2007 17:06 (laatste wijziging 15/08/2007 18:37)
Avatar van DMM PHP beginner @ ikki007: Nu heb ik zoiets: http://www.plaatscode.be/6289/ (grove versie, nog niet perfect uitgewerkt, maar werkend)

Nu worden sommige zaken wel meerdere keren op het scherm getoond...
Offline Wim - 15/08/2007 17:12 (laatste wijziging 15/08/2007 17:15)
Avatar van Wim Crew algemeen
  1. SELECT hoofdpaginas.titel AS htitel,
  2. hoofdpaginas.tekst AS htekst,
  3. hoofdpaginas.sectie AS hsectie,
  4. subpaginas.titel AS stitel,
  5. subpaginas.tekst AS stekst,
  6. subpaginas.sectie AS ssectie,
  7. FROM hoofdpaginas
  8. INNER JOIN subpaginas
  9. ORDER BY hoofdpaginas.volgordeid, subpaginas.volgordeid
  10. ON (hoofdpaginas.paginaid = subpaginas.paginas)


zoiets ongeveer. Is redelijk snel ineen gestoken...

//edit:
mss ben je hier iets mee:
http://www.site...ySQL/Joins
http://www.site...ySQL/Joins
Offline jc2 - 15/08/2007 17:30 (laatste wijziging 15/08/2007 17:31)
Avatar van jc2 PHP interesse Kijk eens hoe ik het zou doen:
voorbeeldtabel

  1. $sectie=$_REQUEST['sectie'];
  2. $paginaQuery = mysql_query("SELECT * FROM paginas WHERE sectie = `$sectie` ORDER BY volgordeid ASC");
  3.  
  4. while($arr = mysql_fetch_array($paginaQuery)){
  5. if($arr['subpagina'] == 1){
  6. $subpaginatitel=$arr['paginatitel'];
  7. // bijv.: &nsbp;&nsbp;&nsbp;<a href='...'><? echo $subpaginatitel ?></a>
  8. }
  9. else{
  10. $paginatitel=$arr['paginatitel'];
  11. // bijv.: <a href='...'><? echo $paginatitel ?></a>
  12. }
  13. }


-- Edit --
Oeps, volgordeid in voorbeeldplaatje vergeten!

-- Edit 2 --
@Wim Marien: Zo kan het ook natuurlijk
Offline DMM - 15/08/2007 17:55 (laatste wijziging 15/08/2007 20:09)
Avatar van DMM PHP beginner @wimmarien: Hoe moet ik het dan doen met de whiles-lus?

@ ikki007: Nu heb ik zoiets: http://www.plaatscode.be/6289/ (grove versie, nog niet perfect uitgewerkt, maar werkend)

Nu worden sommige zaken wel meerdere keren op het scherm getoond...

Kunnen jullie mij verder helpen?
Offline ikki007 - 15/08/2007 21:06
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Bij $query1 kan je toch ook alleen de subpagina's ophalen?
Nu doe je het dubbel.

WHERE paginas = $row['0'];

Want jij gaat nu ook dingen uit paginas halen terwijl je dat bij $query al doet.
Offline DMM - 15/08/2007 21:13
Avatar van DMM PHP beginner Maar dient de WHERE-clausule uit deze query niet om te zien welke subpagina bij welke hoofdpagina hoort?
Of moet ik dit niet doen?

  1. <?php
  2. $query1 = mysql_query("SELECT paginas.paginaid, subpaginas.paginaid, subpaginas.titel, subpaginas.gepubliceerd, subpaginas.sectie, subpaginas.datum FROM paginas, subpaginas WHERE paginas.paginaid = subpaginas.paginas ORDER BY subpaginas.volgordeid ASC") or die(mysql_error());
  3. ?>
Offline ikki007 - 15/08/2007 21:23 (laatste wijziging 15/08/2007 21:29)
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Hier, probeer dit eens:

http://www.plaatscode.be/6293/

Zeg even wat dit doet  
Offline DMM - 15/08/2007 21:37 (laatste wijziging 15/08/2007 22:26)
Avatar van DMM PHP beginner De output begint in ieder geval al op het gewenste resultaat te lijken  . Wel is er nog één probleempje. Bij een pagina die 1 of meer subpagina's heeft, worden alle subpagina's weergegeven. Weet iemand hoe dit kan verholpen worden?

Toch zou ik je (jullie) willen bedanken voor je bereidwilligheid (tot nu toe ) !
Offline ikki007 - 15/08/2007 22:34
Avatar van ikki007 Gouden medailleGouden medaille

PHP ver gevorderde
Zo, probeer dit is:

http://www.plaatscode.be/6294/
Offline DMM - 16/08/2007 10:39 (laatste wijziging 16/08/2007 16:03)
Avatar van DMM PHP beginner Nu krijg ik zoiets:

http://img295.i...b36lr8.jpg
Elke subpagina wordt driemaal weergegeven.

Wimmarien stelde voor om deze query te gebruiken:

  1. SELECT hoofdpaginas.titel AS htitel,
  2. hoofdpaginas.tekst AS htekst,
  3. hoofdpaginas.sectie AS hsectie,
  4. subpaginas.titel AS stitel,
  5. subpaginas.tekst AS stekst,
  6. subpaginas.sectie AS ssectie,
  7. FROM hoofdpaginas
  8. INNER JOIN subpaginas
  9. ORDER BY hoofdpaginas.volgordeid, subpaginas.volgordeid
  10. ON (hoofdpaginas.paginaid = subpaginas.paginas)


Maar hoe moet ik het dan doen met de while-lus?
Offline Berten - 16/08/2007 17:16 (laatste wijziging 16/08/2007 17:16)
Avatar van Berten PHP beginner is eenvoudig

je krijgt een resultaat zoals dit: (heb niet alles bekeken is maar om werking uit te leggen:

hoofdpagina##subpagina
#################
home ##profiel
home ##forum
home ##login
forum ##tile1
forum ##tile2


je loopt gewoon door het resultaat van je query zoals je dat al deed, en elke keer als de hoofdpagina <> de vorige hoofdpagina --> je begint aan een nieuwe hoofdpagina.

  1. <?php
  2. $result = mysql_query($query);
  3. $Mainpage = "";
  4. while($row = mysql_fetch_array($result)) {
  5. if ($row[htitel] <> $MainPage) {
  6. // Hier je code om een nieuwe hoofdpagina toe te voegen
  7. $MainPage = $row[htitel];
  8. //voeg nu subpagina toe (de eerste rij waarin de nieuwe
  9. // hoofdpagina voorkomt is gelijk ook al een subpagina: denk
  10. // hieraan!
  11. } else {
  12. // Voeg een gewone subpagina toe
  13. }
  14. }
  15. ?>

iets van die aard zou moeten werken denk'k met die query

Berten
Offline DMM - 16/08/2007 23:10
Avatar van DMM PHP beginner Berten, wat bedoel je dan precies met:

  1. <?php
  2. // ...
  3. // Hier je code om een nieuwe pagina toe te voegen
  4. // ...
  5. // voeg nu subpagina toe (de eerste rij waarin de nieuwe
  6. // hoofdpagina voorkomt is gelijk ook al een subpagina: denk
  7. // hieraan!
  8. // ...
  9. // Voeg een gewone subpagina toe
  10. ?>


Moet ik nog een bijkomende query uitvoeren of...?
Offline Thomas - 17/08/2007 12:20
Avatar van Thomas Moderator Waarom maak je er niet meteen een boom van? Dan heb je meteen meerdere niveaus tot je beschikking.

Als je je query goed bouwt, heb je er maar één nodig, en kun je het daadwerkelijke "sorteerprobleem" verplaatsen naar PHP.
Offline DMM - 17/08/2007 13:31
Avatar van DMM PHP beginner Zou je dit aub iets duidelijker willen uitleggen? Ik snap het concept van een boom wel (denk ik althans ). Maar hoe zit dat dat in de praktijk?
Offline Thomas - 17/08/2007 14:56
Avatar van Thomas Moderator Maak een tabel met kolommen:
id, parent, rest

id = auto_increment id
parent = het parent-id (0 als het de root van de boom is)

query:
SELECT *
FROM tabel
ORDER BY id, parent

PHP:
Bouw een lijst van de items. Hierbij geef je aan welke childs een item heeft. Dit kan met een enkele for(each) lus, omdat parents altijd een lager id hebben dan de childs (je kunt geen child toevoegen aan een niet-bestaande parent).

De lus zal er ongeveer als volgt uitzien:
  1. <?
  2. $tree = array();
  3. while ($row = mysql_fetch_assoc($res)) {
  4. $tree[$row['id']] = array('childs' => array());
  5. // de parent van dit item bestond al, dus voeg dit item toe als child van deze parent
  6. $tree[$row['parent']]['childs'][] = $row['id'];
  7. }
  8. ?>


Het afdrukken is een kwestie van beginnen bij de root, het afdrukken van het huidige item, en vervolgens (recursief) alle childs.
Offline DMM - 17/08/2007 16:09 (laatste wijziging 17/08/2007 21:38)
Avatar van DMM PHP beginner Vooreerst zou ik iedereen willen bedanken die mij tot nu toe heeft proberen te helpen!

Maar verder, van de voorgestelde methode van FangorN versta ik niet alles. Meer bepaald dit deeltje:
  1. $tree[$row['id']] = array('childs' => array());
  2. /* de parent van dit item bestond al, dus voeg dit item toe als child van deze parent */
  3. $tree[$row['parent']]['childs'][] = $row['id'];


Ook dit snap ik niet echt, vooral dan hoe het in praktijk moet worden "vertaald" :
Citaat:
Het afdrukken is een kwestie van beginnen bij de root, het afdrukken van het huidige item, en vervolgens (recursief) alle childs.
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.274s