Database opbouw

Status
Niet open voor verdere reacties.

DutchDisturbed

Gebruiker
Lid geworden
31 mei 2004
Berichten
317
Hallo!
ik wil graag min hele website met php gaan schrijven en daarom ook de menu's in een database plakken zodat die makkelijk aan te passen zijn.
Nu is het moelijkste in het hele verhaal hoe ik de database op wil zetten etc.
Ik maak gebruik van 2 menu's. ten eerste het hoofdmenu dat een aantal items bevat, maar geen subonderwerpen en ten tweede een menu met een kop en dan een paar submenu's

(zie http://www.studentencafedebeurs.nl)
hoe moet ik dit aan gaan pakken? elk item moet nl er namelijk ook gelijk de link naar de pagina bij. dus dan krijg je een soort 3dimensionaal iets nl Kop - subitem - link
thnx!
 
Ik zou voor zoiets gaan (als ik je tekst goed begrijp):
Hoofditem:
- id
- naam

Subitem:
- id
- hoofdItemId
- Naam
- Link

Het 2e veld uit de subitem tabel bevat dan een id van het hoofditem.
Nu kun je alle hoofditems uit de database ophalen en daarmee ook de bijbehorende subitems :)
 
ja ziet er logisch uit! heb wel effe moeite om het me voor te stellen...
wat doe ik bijvoorbeeld met hoofditems die dus geen submenu hebben? het hoofdmenu heeft geen submenu's namelijk en dus is het hoofditem een link. misschien het makkelijkst om de 2 menu's te scheiden?
 
Nu zijn de items ook gescheiden.

Ik zie het volgende voor mij.
Tabel Hoofditem: hierin heb je 2 velden, namelijk een id-veld (met een uniek nummer) en een naam (bijv "Home").
Deze gegevens kan je mbv een sql-query gemakkelijk ophalen (SELECT * FROM hoofditem).

Dan de tabel subitems.
Deze tabel bevat 4 velden: id (uniek veld), hoofditemid (dit is een id uit de tabel hoofditem), een naam (bijv "test") en een link (bijv "blaat.php").

Bij het ophalen van de items (incl subitems) kan je eerst alle hoofditems ophalen en dan in de subitems tabel kijken met het id van het hoofditem. Zoiets dus:
PHP:
$query = "SELECT * FROM hoofditem ORDER BY naam ASC";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_assoc($result))
{
  // Haal nu de subitems op (als die er zijn)
  $hoofditemid = $row['id'];
  echo "Hoofditem: ".$row['naam']." - ".$row['link'].": <br/>";

  $query = "SELECT * FROM subitem WHERE hoofditemid='$hoofditemid'";
  $result2 = mysql_query($query) or die(mysql_error());
  while($row2 = mysql_fetch_assoc($result2))
  {
    // Hier zijn je subitems
    // Als er geen subitems zijn wordt dit stuk code overgeslagen
   echo " -- Subitem: ".$row2['naam']." - ".$row2['link']."<br/>";
  }
  
  echo "<br/>";
}

Zoiets had ik in gedachten :)

In de tabel subitem hóeven geen items te staan, dan worden ze gewoon niet opgehaald.
Je kan alsnog gewoon de hoofditems ophalen, die staan immers in een aparte tabel



Edit: ik lees nu pas je stukje over het hoofditem als link.
Je kan dan gewoon een extra veld in de database opnemen in de tabel hoofditem; namelijk link.
Laat deze leeg als er subitems zijn; vul deze als er geen subitems zijn.
Haal ook de link voor het hoofditem op en als deze leeg is, is het hoofditem dus geen link.


oftewel: als er geen subitem voor het hoofditem is, is de link van het hoofditem de juiste link
 
Laatst bewerkt:
Of zoiets:
Als er maar 1 subitem is, met dezelfde naam als hoofditem, dan laat hij die link zien..
PHP:
<?
$SqlQueryHoofd = "SELECT `id`, `naam`
                  FROM `hoofditem`
                  ORDER BY `id` ASC";
$SqlResultHoofd = mysql_query($SqlQueryHoofd) or die(mysql_error());

while($SqlArrayHoofd = mysql_fetch_assoc($SqlResultHoofd)) {
  $SqlQuerySub = "SELECT `naam`, `link`
                  FROM `subitem`
                  WHERE `hoofditemid` = '". $SqlArrayHoofd['id'] ."'";
  $SqlResultSub = mysql_query($SqlQuerySub) or die(mysql_error());
  if (mysql_num_rows($SqlResultSub) == "1") {
    $SqlArraySub = mysql_fetch_assoc($SqlResultSub);
    if ($SqlArraySub['naam'] == $SqlArrayHoofd['naam']) {
      echo "Hoofditem: <a href=\"". stripslashes($SqlArraySub['link']) ."\">". stripslashes($SqlArraySub['naam']) ."</a><br />";
      $GaDoor = "1"
    }
  }
  if ($GaDoor != "1") {
    echo "Hoofditem: ". stripslashes($SqlArrayHoofd['naam']) .": <br />";
    while($SqlArraySub = mysql_fetch_assoc($SqlResultSub)) {
     echo " -- Subitem: <a href=\"". stripslashes($SqlArraySub['link']) ."\">". stripslashes($SqlArraySub['naam']) ."</a><br />";
    }
  }
  $GaDoor = "0";
  echo "<br />";
}
 
ja ok dacht ik al. dat extra veldje bij het hoofditem dan. over de code had ik ng niet zo nagedacht. ik kan dan zelfs van het hoofditem een link maken en subitems toevoegen lijkt me
ga er straks nog even naar kijken
thnx iig
 
Of zoiets:
Als er maar 1 subitem is, met dezelfde naam als hoofditem, dan laat hij die link zien..

Niet om het een of ander, maar wat als je nou de naam van je hoofditem wijzigt? dan klopt het al niet meer (dan moet je bij al je subitems dat ook wijzigen).
Is dus redundante data en dat moet je zoveel mogelijk zien te voorkomen.

Je kan er verschillende oplossingen voor bedenken.
Wat je ook kan doen is kijken of er überhaupt submenu's zijn; zo nee: dan de link uit de hoofdmenu-tabel pakken.
 
Nu zijn de items ook gescheiden.
PHP:
$query = "SELECT * FROM hoofditem ORDER BY naam ASC";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_assoc($result))
{
  // Haal nu de subitems op (als die er zijn)
  $hoofditemid = $row['id'];
  echo "Hoofditem: ".$row['naam']." - ".$row['link'].": <br/>";

  $query = "SELECT * FROM subitem WHERE hoofditemid='$hoofditemid'";
  $result2 = mysql_query($query) or die(mysql_error());
  while($row2 = mysql_fetch_assoc($result2))
  {
    // Hier zijn je subitems
    // Als er geen subitems zijn wordt dit stuk code overgeslagen
   echo " -- Subitem: ".$row2['naam']." - ".$row2['link']."<br/>";
  }
  
  echo "<br/>";
}
hmm ik ben verder gegaan met dit script, maar stuit op wat problemen
ik wil de output als volgt gaan krijgen
<div class="navheading">Sponsors</div> voor de hoofditems
<li><a href="link" name="Weetikveel met spatie">Iets met spaties</a></li> voor subitems

nu kreeg ik dat niet voor elkaar omdat er iets met de spaties fout zat :S?
iig nu heb ik geprobeerd om het via een object te doen dus met
while($row = mysql_fetch_object($result))
en dan met select specifieke kolommen selecteren
als ik dit nu voor de hoofd en subitems doe krijg ik alleen output van de hoofditems.
hoe kan dit!?
thnx
 
Hoe bedoel je iets met spaties?

Wat is je hele code tot nu toe? Post die hier eens anders :) (vergeet de PHP-tags niet)
 
heb het al opgelost. heb dus specifieke kolommen geselecteerd en de mysql_fetch_assoc veranderd naar _object
het probleem was alleen dat ik vergeten was de $hoofditemid aan te passen....
neem aan dat deze manier iig prima is

PHP:
echo "<div id=\"nav2\">";
/* Gegevens ophalen uit de database: */
$query = "SELECT naam, id FROM menu_1 WHERE position='1'";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_object($result))
{
  // Haal nu de subitems op (als die er zijn)
  $hoofditemid = "$row->id";
  echo "<div class=\"navheading\">$row->naam</div>\n<ul>\n";

  $query2 = "SELECT naam, link FROM menu_2 WHERE id_1 ='$hoofditemid'";
  $result2 = mysql_query($query2) or die(mysql_error());
  while($row2 = mysql_fetch_object($result2))
  {
    // Hier zijn je subitems
    // Als er geen subitems zijn wordt dit stuk code overgeslagen
    echo "<li><a href=\"$row2->link\" name=\"$row2->naam\">$row2->naam</a></li>\n";

  }

  echo "</ul>\n";
}
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan