PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Menüstruktur aus Datenbank rekursiv auslesen


daf555
25.02.2006, 11:53:36
Hallo!

Arbeite gerade an einer Vereinsverwaltung. Die Menüpunkte werden dabei dynamisch aus einer Datenbank ausgelesen. Da auch verschachtelte Menüstrukturen verarbeitet werden sollen, habe ich eine rekursive Funktion für die Auflistung aller Menüpunkte geschrieben. Sie funktioniert auch bis auf die Tatsache, dass 3 Menüpunkte doppelt aufgelistet werden (Spielart, Saison und Liga), obwohl sie nur einmal in der Datenbank vorhanden sind. Habe leider keinen Debugger, um festzustellen, wo der Fehler liegt und hoffe deshalb auf eure Hilfe.
Hier die entsprechende Tabelle der Datenbank:

#
# Tabellenstruktur für Tabelle `ansicht`
#
CREATE TABLE `ansicht` (
`Nummer` int(5) NOT NULL auto_increment,
`Name` varchar(30) NOT NULL default '',
`Link` varchar(255) NOT NULL default '',
`Sort` int(5) default NULL,
`Submenue` varchar(30) NOT NULL default '',
`Beschreibung` varchar(255) NOT NULL default '',
PRIMARY KEY (`Nummer`)
) TYPE=MyISAM AUTO_INCREMENT=60 ;
#
# Daten für Tabelle `ansicht`
#
INSERT INTO `ansicht` VALUES (3, 'Spiele', 'table.php?ansicht=Spiele', 3, 'Standards', 'Informationen zu den einzelnen Spielen');
INSERT INTO `ansicht` VALUES (4, 'Spieltag', 'table.php?ansicht=Spieltag', 4, 'Standards', 'Alle Informationen zu den einzelnen Spieltagen');
INSERT INTO `ansicht` VALUES (5, 'Ansichten', 'table.php?ansicht=Ansichten&sort=Sort&sortdir=ASC', 97, 'XAdmin', '');
INSERT INTO `ansicht` VALUES (6, 'Filter', 'table.php?ansicht=Filter', 98, 'XAdmin', '');
INSERT INTO `ansicht` VALUES (7, 'Parameter', 'table.php?ansicht=Parameter', 99, 'XAdmin', '');
INSERT INTO `ansicht` VALUES (15, 'Spielart', 'table.php?ansicht=Spielart', 5, 'Standards', 'Diese Tabelle enthält die Spielarten.');
INSERT INTO `ansicht` VALUES (22, 'Liga', 'table.php?ansicht=Liga', 7, 'Standards', 'die Namen der verfügbaren Ligen');
INSERT INTO `ansicht` VALUES (21, 'Saison', 'table.php?ansicht=Saison', 6, 'Standards', 'die wählbaren Saisons, z.B. 2005/2006');
INSERT INTO `ansicht` VALUES (23, 'Tabelle', 'table.php?ansicht=Tabelle', 10, '', '');
INSERT INTO `ansicht` VALUES (24, 'Einzelrangliste', 'table.php?ansicht=Einzelrangliste', 20, '', '');
INSERT INTO `ansicht` VALUES (59, 'SaisonLigaSpieltag', 'table.php?ansicht=SaisonLigaSpieltag', 90, 'Zuordnungen', 'Zuordnung, welche Spieltage es pro Liga und Saison gibt');
INSERT INTO `ansicht` VALUES (26, 'Spiel eintragen', 'formular.php', 25, 'Admin', '');
INSERT INTO `ansicht` VALUES (27, 'SaisonLigaMannschaft', 'table.php?ansicht=SaisonLigaMannschaft', 20, 'Zuordnungen', 'Zuordnung, welche Mannschaft in welcher Saison in welcher Liga spielt');
INSERT INTO `ansicht` VALUES (29, 'SaisonSpieler', 'table.php?ansicht=SaisonSpieler', 23, 'Zuordnungen', 'Zuordnung, welcher Spieler in welcher Saison spielt');
INSERT INTO `ansicht` VALUES (50, 'Spieler', 'table.php?ansicht=Spieler', 2, 'Standards', '');
INSERT INTO `ansicht` VALUES (54, 'Admin', '', 30, '', '');
INSERT INTO `ansicht` VALUES (55, 'SuperAdmin', '', 40, '', '');
INSERT INTO `ansicht` VALUES (56, 'Standards', '', 115, 'SuperAdmin', '');
INSERT INTO `ansicht` VALUES (57, 'Zuordnungen', '', 120, 'SuperAdmin', '');
INSERT INTO `ansicht` VALUES (58, 'XAdmin', '', 50, '', '');

Und hier das Skript:

<?
Main();
exit;

function SqlConnect() {
$dbHost = "host";
$dbName = "verein2";
$dbUser = "user";
$dbPass = "password";
$connect = @mysql_connect($dbHost, $dbUser, $dbPass);
$selectDB = @mysql_select_db($dbName, $connect);
}

function Main() {
SqlConnect();
$select = "SELECT Name, Link, Submenue FROM ansicht WHERE Submenue='' ORDER BY Sort";
$qselect = mysql_query($select);
$zaehler = 0;
while ($qselect_row=mysql_fetch_array($qselect)) {
$menuA[$zaehler]['Name']=$qselect_row['Name'];
$menuA[$zaehler]['Link']=$qselect_row['Link'];
$menuA[$zaehler]['Submenue']=$qselect_row['Submenu'];
$zaehler++;
}
echo ParseMenu($menuA);
}

function ParseMenu($array) {
foreach ($array AS $ansichtA) {
if ($ansichtA['Link']=='' && $ansichtA['Name']<>'') {
$inhalt .= "\n<br /><tr><td><a href=\"menu.php?Submenue=".$ansichtA['Name']."\" target=\"Menue\">".$ansichtA['Name']."</a></td></tr>";
$select = "SELECT Name, Link, Submenue FROM ansicht WHERE Submenue='".$ansichtA['Name']."' ORDER BY Sort";
$qselect = mysql_query($select);
$zaehler = 0;
while ($qselect_row=mysql_fetch_array($qselect)) {
$menuA[$zaehler]['Name']=$qselect_row['Name'];
$menuA[$zaehler]['Link']=$qselect_row['Link'];
$menuA[$zaehler]['Submenue']=$qselect_row['Submenu'];
$zaehler++;
}
$inhalt.=ParseMenu($menuA);
} else {
$inhalt.="\n<br /><tr><td><a href=\"".$ansichtA['Link']."\" target=\"Main\">".$ansichtA['Name']."</a></td></tr>";
}
}
return $inhalt;
}
?>

Die Parameter für den Datenbank-Zugriff (Funktion SqlConnect) müsstet ihr natürlich anpassen.
Folgender Hinweis noch zur Datenbank-Tabelle 'ansicht':
Die Spalte 'Submenue' enthält den Namen des ÜBERGEORDNETEN Menüpunktes. Ist die Spalte leer, handelt es sich um das Hauptmenü. Beispiel:
Menüstruktur:
-a
-b
--d
--e
---f
-c
Tabelle 'ansicht':
Name | Link | Submenue
a | http... |
b | |
c | http... |
d | http... | b
e | | b
f | http... | e

daf555
25.02.2006, 17:18:29
Ihr braucht euch nicht mehr zu bemühen. Habe den Fehler selbst ausfindig machen können :)

feuervogel
25.02.2006, 23:43:36
Ihr braucht euch nicht mehr zu bemühen. Habe den Fehler selbst ausfindig machen können :)

schön, dass du ihn für dich behälst und jeder, der ein ähnliches problem hat und hierauf stößt, sich richtig freuen wird, weil ihm das wirklich hilfreich sein wird.

daf555
26.02.2006, 13:04:25
Es fehlte noch ein
$menuA=array();
über der while-Schleife in der Funktion ParseMenu()