Kategorien mit Dropdown-Feldern verknüpfen

qsrs

Erfahrenes Mitglied
Hallo,

habe hier ein Javascript gefunden, mit welchem man 2 Select-Felder insofern nutzt, dass z.B. Select-Feld 1 eine Hauptkategorie enthält, und Select-Feld 2 die dazugehörige Subkategorie. Wählt man eine Hauptkategorie, ändert sich im zweiten Select-Feld dynamisch der Inhalt.

Meine MySQL-Tabelle sieht so aus:

id | category_name | category_id
1 | obst | 0
2 | apfel | 1
3 | birne | 1

Habe es versucht so umzusetzen:
PHP:
//Die Abfrage der Hauptkategorien
$sql0 = "SELECT * FROM `$dbtable4` WHERE `category_id` = '0'"; 
$query0 = mysql_query ($sql0, $dbconnect); 
for ($i1 = 0; $i1 < mysql_num_rows ($query0); $i1++) {
$array0[$i1] = mysql_fetch_array ($query0); 
}
 
//Die Abfrage der Subkategorien
$sql = "SELECT * FROM `$dbtable4` WHERE `category_id` != '0'"; 
$query = mysql_query ($sql, $dbconnect);
for ($i = 0; $i < mysql_num_rows ($query); $i++) {
$array[$i] = mysql_fetch_array ($query);
}

Das javascript:
Code:
<script type="text/javascript"><!--
	 function hideSelect(obj) { 
	 document.getElementById(obj.options[obj.selectedIndex].value).style.display = 'inline'; 
	 for (var i=0; i<obj.options.length; i++) { 
	 if (i != obj.selectedIndex) { 
	document.getElementById(obj.options[i].value).style.display = 'none';
	 } 
	 } 
	 }
//--></script>

PHP:
<select onchange="hideSelect(this)">
//Ausgabe der Hauptkategoriene im Select-Feld 1 (Soweit funktioniert noch alles)
<?php for ($i1 = 0; $i1 < count ($array0); $i1++) { echo "<option value=\"".$array0[$i1][id]."\">".$array0[$i1][category]."</option>"; } ?>
</select>
 
//Ausgabe der Subkategorien (funktioniert nicht mehr)
<?php for ($i = 0; $i < count ($array); $i++) { echo "<select id=\"".$array[$i][category_id]."\" name=\"".$array[$i][category_id]."\" style=\"display:none\"><option value=\"".$array[$i][id]."\">".$array[$i][category]."</option></select>"; } ?>

Die Ausgabe der Subkategorien funktioniert nicht mehr korrekt. Zuerst wird gar kein Feld angezeigt, was daran liegt, dass display:none für alle gilt. Ich weiß aber nicht, wie ich in der Schleife standardmäßig die erste Subkategorie anzeigen lassen soll.

Dann stimmt die Zahl der Ausgabe nicht. Es wird immer nur eine Subkategorie angezeigt. Und wenn ich die Hauptkategorie im Dropdownfeld ändere, erscheinen auch plötzlich mehrere Dropdownfelder von den Subkategorien.

Gibt es für dieses Javascript eine PHP/MySQL-Lösung. Was mache ich falsch?
 
Hallo,
wenn du folgende SQL Befehle:
Code:
-- 
-- Tabellenstruktur für Tabelle `hauptkategorien`
-- 
CREATE TABLE `hauptkategorien` (
  `hauptkategorien_id` int(11) NOT NULL auto_increment,
  `hauptkategorien_name` varchar(255) NOT NULL default '',
  `hauptkategorien_identifikation` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`hauptkategorien_id`)
);
-- 
-- Daten für Tabelle `hauptkategorien`
-- 
INSERT INTO `hauptkategorien` VALUES (1, 'Deutschland', 'de');
INSERT INTO `hauptkategorien` VALUES (2, 'Oesterreich', 'at');
 
-- 
-- Tabellenstruktur für Tabelle `subkategorien`
-- 
CREATE TABLE `subkategorien` (
  `subkategorien_id` int(11) NOT NULL auto_increment,
  `subkategorien_name` varchar(255) NOT NULL default '',
  `subkategorien_identifikation` varchar(255) NOT NULL default '',
  `subkategorien_style` varchar(255) NOT NULL default 'none',
  PRIMARY KEY  (`subkategorien_id`)
);
-- 
-- Daten für Tabelle `subkategorien`
-- 
INSERT INTO `subkategorien` VALUES (2, 'Bayern', 'de', 'inline');
INSERT INTO `subkategorien` VALUES (1, 'Baden-Wuerttemberg', 'de', 'none');
INSERT INTO `subkategorien` VALUES (3, 'Berlin', 'de', 'none');
INSERT INTO `subkategorien` VALUES (4, 'Brandenburg', 'de', 'none');
INSERT INTO `subkategorien` VALUES (5, 'Bremen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (6, 'Hamburg', 'de', 'none');
INSERT INTO `subkategorien` VALUES (7, 'Hessen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (8, 'Mecklenburg-Vorpommern', 'de', 'none');
INSERT INTO `subkategorien` VALUES (9, 'Niedersachen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (10, 'Nordrhein-Westfalen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (11, 'Rheinland-Pfalz', 'de', 'none');
INSERT INTO `subkategorien` VALUES (12, 'Saarland', 'de', 'none');
INSERT INTO `subkategorien` VALUES (13, 'Sachsen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (14, 'Sachsen-Anhalt', 'de', 'none');
INSERT INTO `subkategorien` VALUES (15, 'Schleswig-Holstein', 'de', 'none');
INSERT INTO `subkategorien` VALUES (16, 'Thuerigen', 'de', 'none');
INSERT INTO `subkategorien` VALUES (17, 'Burgenland', 'at', 'none');
INSERT INTO `subkategorien` VALUES (18, 'Kaernten', 'at', 'none');
INSERT INTO `subkategorien` VALUES (19, 'Niederoesterreich', 'at', 'none');
INSERT INTO `subkategorien` VALUES (20, 'Oberoesterreich', 'at', 'none');
INSERT INTO `subkategorien` VALUES (21, 'Salzburg', 'at', 'none');
INSERT INTO `subkategorien` VALUES (22, 'Steiermark', 'at', 'none');
INSERT INTO `subkategorien` VALUES (23, 'Tirol', 'at', 'none');
INSERT INTO `subkategorien` VALUES (24, 'Vorarlberg', 'at', 'none');
INSERT INTO `subkategorien` VALUES (25, 'Wien', 'at', 'none');

ausführst, kannst du folgendes Script für dein Vorhaben verwenden:
PHP:
<html>
<head>
	<title>Menü</title>
	 <script type="text/javascript"><!--
	 function hideSelect(obj) {
	 document.getElementById(obj.options[obj.selectedIndex].value).style.display = 'inline';
	 for (var i=0; i<obj.options.length; i++) {
	 if (i != obj.selectedIndex) {
	document.getElementById(obj.options[i].value).style.display = 'none';
	 }
	 }
	 }
	 //-->
	</script>
</head>
<body>
	<div> 
	 <?
		include("connect.php");
		 $sql_hauptkategorien = "SELECT * FROM hauptkategorien";
		 $query_hauptkategorien = mysql_query($sql_hauptkategorien);
		 ?><select onchange="hideSelect(this)"><?
		 while ($hauptkategorien = mysql_fetch_object($query_hauptkategorien)){
			?><option value="<?=$hauptkategorien->hauptkategorien_identifikation?>"><?=$hauptkategorien->hauptkategorien_name?></option><?
		 }
		 ?></select><?
		 $sql_DISTINCT = "SELECT DISTINCT(subkategorien_identifikation) as subkategorien_identifikation, subkategorien_style FROM subkategorien";
		 $query_DISTINCT = mysql_query($sql_DISTINCT);
		 while ($subkategorien = mysql_fetch_object($query_DISTINCT)){
			$sql_subkategorien = "SELECT * FROM subkategorien WHERE subkategorien_identifikation = '$subkategorien->subkategorien_identifikation'";
			$query_subkategorien = mysql_query($sql_subkategorien);
			?><select id="<?=$subkategorien->subkategorien_identifikation?>" name="<?=$subkategorien->subkategorien_identifikation?>" style="display:<?=$subkategorien->subkategorien_style?>"><?
			while ($subkategorien = mysql_fetch_object($query_subkategorien)){
			 ?><option><?=$subkategorien->subkategorien_name?></option><?
			}
			?></select><?
		 }
		?>
	</div>
</body>
</html>

mfg
forsterm
 
Zuletzt bearbeitet:
Vielen Dank für die Antwort. Meine Haupt- und Subkategorien liegen jedoch alle in einer Tabelle (s .oben) und das lässt sich leider nicht ändern. Gibt es dafür eine Lösung?
 
Etwa so?
Code:
-- 
-- Tabellenstruktur für Tabelle `menue`
-- 
CREATE TABLE `menue` (
  `hauptkategorie_id` int(10) NOT NULL auto_increment,
  `subkategorie_id` int(10) NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `ebene` int(10) NOT NULL default '0',
  `identifikation` varchar(10) NOT NULL default '',
  `style` varchar(10) NOT NULL default '',
  PRIMARY KEY  (`hauptkategorie_id`)
);

-- 
-- Daten für Tabelle `menue`
-- 

INSERT INTO `menue` VALUES (1, 1, 'Deutschland', 0, 'de', 'none');
INSERT INTO `menue` VALUES (2, 2, 'Oesterreich', 0, 'at', 'none');

INSERT INTO `menue` VALUES (3, 1, 'Baden-Wuerttemberg', 1, 'de', 'inline');
INSERT INTO `menue` VALUES (4, 1, 'Bayern', 1, 'de', 'none');
INSERT INTO `menue` VALUES (5, 1, 'Berlin', 1, 'de', 'none');
INSERT INTO `menue` VALUES (6, 1, 'Brandenburg', 1, 'de', 'none');
INSERT INTO `menue` VALUES (7, 1, 'Bremen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (8, 1, 'Hamburg', 1, 'de', 'none');
INSERT INTO `menue` VALUES (9, 1, 'Hessen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (10, 1, 'Mecklenburg-Vorpommern', 1, 'de', 'none');
INSERT INTO `menue` VALUES (11, 1, 'Niedersachen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (12, 1, 'Nordrhein-Westfalen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (13, 1, 'Rheinland-Pfalz', 1, 'de', 'none');
INSERT INTO `menue` VALUES (14, 1, 'Saarland', 1, 'de', 'none');
INSERT INTO `menue` VALUES (15, 1, 'Sachsen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (16, 1, 'Sachsen-Anhalt', 1, 'de', 'none');
INSERT INTO `menue` VALUES (17, 1, 'Schleswig-Holstein', 1, 'de', 'none');
INSERT INTO `menue` VALUES (18, 1, 'Thuerigen', 1, 'de', 'none');
INSERT INTO `menue` VALUES (19, 2, 'Niederoesterreich', 1, 'at', 'none');
INSERT INTO `menue` VALUES (20, 2, 'Salzburg', 1, 'at', 'none');
INSERT INTO `menue` VALUES (21, 2, 'Steiermark', 1, 'at', 'none');
INSERT INTO `menue` VALUES (22, 2, 'Tirol', 1, 'at', 'none');
INSERT INTO `menue` VALUES (23, 2, 'Vorarlberg', 1, 'at', 'none');
INSERT INTO `menue` VALUES (24, 2, 'Wien', 1, 'at', 'none');

PHP:
<html>
  <head>
	<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
	<title>Menü</title>
	<script type="text/javascript"><!--
	  function hideSelect(obj) {
		document.getElementById(obj.options[obj.selectedIndex].value).style.display = 'inline';
		  for (var i=0; i<obj.options.length; i++) {
		  if (i != obj.selectedIndex) {
			  document.getElementById(obj.options[i].value).style.display = 'none';
			}
		  }
		}
	//--></script>
  </head>
  <body>
	<div>
	  <?
		include("connect.php");
		$sql_ebene0 = "SELECT * FROM menue WHERE ebene = '0'";
		$query_ebene0 = mysql_query($sql_ebene0);
		?><select onchange="hideSelect(this)"><?
		  while ($ebene0 = mysql_fetch_object($query_ebene0)){
			?><option value="<?=$ebene0->identifikation?>"><?=$ebene0->name?></option><?
		  }
		?></select><?
		$sql_distinct = "SELECT DISTINCT(name) as name, identifikation, style FROM menue WHERE ebene = '1'";
		$query_distinct = mysql_query($sql_distinct);
		while ($distinct = mysql_fetch_object($query_distinct)){
		  ?><select id="<?=$distinct->identifikation?>" name="<?=$distinct->identifikation?>" style="display:<?=$distinct->style?>"><?
			$sql_ebene1 = "SELECT * FROM menue WHERE ebene = '1' AND identifikation = '$distinct->identifikation'";
			$query_ebene1 = mysql_query($sql_ebene1);
			while ($ebene1 = mysql_fetch_object($query_ebene1)){
			  ?><option><?=$ebene1->name?></option><?
			}
		  ?></select><?
		}
	  ?>
	</div>
  </body>
</html>

mfg
forsterm
 
Vielen Dank für deine bisherige Hilfe. Habe dein Beispiel versucht und es funktioniert. Habe es versucht auf meine Tabellenstruktur zu übernhemen was nicht funktioniert hat. Ich kann "ebene" und "identifikation" nicht übernhemen. Könnte es auch mit folgender Tabellenstruktur funktionieren, oder wird ebene und identifikation unbedingt benötigt:
 

Anhänge

  • Screenshot.jpg
    Screenshot.jpg
    102,7 KB · Aufrufe: 84
Zurück