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:
PHP-Code:
<?
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