• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[FRAGE] problem mit aktualisierung filterung von dropdown boxen

jhaustein

New member
Hallo Gemeinschaft,

nachdem ich nun in php foren geschaut habe und mir dort gesagt wurde, dass ich dann wohl besser hier aufgehoben bin, nun mein anliegen

ich habe drei dropboxen
gebiet
reederei
schiff

und eine tabelle
id_gebietid_gebietname_reddereiid_reedereiname_schiffid_schiffname

nun ist es so, dass wenn ich in der dropbox gebiet ein gebiet auswähle, dann soll in der dropbox reederei nur die reedereien angezeigt werden, die in diesem gebiet fahren und in der box schiff, nur die schiffe, die ebenfalls in dem gebiet fahren

aber es soll auch andersrum funzen
wenn ich ein schiff auswähle, dann soll in der dropbox gebiet nur die gebiete angezeigt werden, in denen dasschiff auch fährt

könnt ihr mir dabei bitte helfen
 
könnt ihr mir dabei bitte helfen
erst mal müßte die Datenbank normalisiert werden. Die ganzen Namen haben nix in dieser Tabelle zu suchen (=> 2NF). (Du hast ja auch drei selects, die für die jeweiligen id-name-Paare stehen).

Und dann vereinfacht sich das ganze auf 2 SQL Queries (einer für jede der beiden anderen selects)

- - - Aktualisiert - - -

ein m.M.n. sinnvolles DB Schema wäre z.B.
Code:
reederei
+----+------+
| id | name |
+----+------+
schiff (ein Schiff gehört nur einer Reederei an)
+----+------+-------------+
| id | name | reederei_id |
+----+------+-------------+
gebiet
+----+------+
| id | name |
+----+------+
bewegung
+-----------+-----------+
| schiff_id | gebiet_id |
+-----------+-----------+
 
okay mache es dann so

tab gebiet
id_gebietid_gebietname

tab reederei
id_reedereiid_reedereiname

tab schiff
id_schiffid_schiffname

tabgesamt
id_gebietid_reedereiid_schiffid

kannst du mir bitte erklären, wie dann weiter

ah hatte sich überschnitten - meine antwort und deine änderung

weiss nur nicht, wie ich das in js umsetzen kann
 
Zuletzt bearbeitet:
1) du hast die IDs doppelt (was ist der Unterschied (z.B.) in tab gebiet zwischen id und gebietid?)
2) tabgesamt hat das Problem, daß du ein Schiff beliebig vielen Reedereien gleichzeitig zuordnen kannst

weiss nur nicht, wie ich das in js umsetzen kann
du machst für jedes select ein AJAX-Request an den server, der dir dann die entsprechenden IDs zurückgibt, die du dann im select als markiert setzt.
 
okay

zu 1) id ist raus
zu 2) habs nu so gemacht, wie du beschrieben hattest

kannst du mir aufgrund dieser annahme ein kleines bsp zeigen - auch bzgl. übergabe der gefilterten daten in den dropmenüs
 
Mal anhand von jQuery, weil’s da etwas einfacher ist, über NodeLists zu iterieren.

Code:
// data - die Werte der zu markierenden <option> Elemente
// select - das dropdown-Element das geändert werden soll

$('option', select).each(function () {
    // if your returned data are of type "string", remove the "+"
    this.selected = data.indexOf(+this.value) > -1;
});
 
Um welche Zahlen geht es denn hier? Wieviele Gebiete, Redereien, Schiffe hast du denn in der DB? Wenn das nicht zu viele sind, würde ich alle Daten zum Browser übertragen und dort weiterverarbeiten.

weiß im mom nicht wie ich die beiden Boxen befüllen soll
Ich würde die Boxen nicht jedes mal neu befüllen, sondern die <option>s deaktivieren/ausblenden, die gerade nicht zu den anderen <select>s passen.

Aber um hier zu irgendwas zu kommen: hast du denn schon irgendwas probiert? Irgendein HTML oder JS? Dann können wir darauf aufbauen.
 
Um welche Zahlen geht es denn hier? Wieviele Gebiete, Redereien, Schiffe hast du denn in der DB? Wenn das nicht zu viele sind, würde ich alle Daten zum Browser übertragen und dort weiterverarbeiten.

es sind ca 180 gebiete 80 reedereien und 360 schiffe
ich weiss nicht, wie ich die zwei boxen befüllen soll, die sich aus der auswahl der ersten ergeben

zumal ja im startstadium alle boxen befüllt sind aus der db
 
PHP:
<form name="form1" method="post" action="abfrage2104a.php">

das hole ich mir aus einer andere seite
$dest='<select name="destination" style="width:200px;"><option value="0">Fahrgebiet auswählen</option>';
/* Original code */
//$result = $selects->SearchFilter[0]->Options->StandardOption;
//foreach ($result as $desti) {
//    $dest.= '<option '.(($desti->OptionValue==$_REQUEST["destination"])?'selected=selected':'').' value="'.$desti->OptionValue.'">'.$desti->OptionText.'</option>';
//}
/* New code */
foreach ($destinationList as $desti) {
    $dest.= '<option '.(($desti['DestinationID']==$_REQUEST["destination"])?'selected=selected':'').' value="'.$desti['DestinationID'].'">'.$desti['DestinationName'].'</option>';
}
$dest.='</select>';	

<li style="margin-bottom:10px;">Zeitraum<br><input name="date_begin" type="text" class="date" id="date_begin" style="width:70px;" value="<?php echo $_POST["date_begin"]; ?>"> - <input name="date_end" type="text" class="date" id="date_end" style="width:70px;" value="<?php echo $_POST["date_end"]; ?>"></li>
<?php
echo "Gebiet<br>";
echo $dest; 
echo "<br>Dauer<br>";
echo $dauer;

echo "<br>Reederei<br>"
?>
<select name="reederei" class="reederei" id="reederei">
<option selected="selected" value="0">Reederei auswählen</option>
<?php


	$stmt = $DB_con->prepare("SELECT   * FROM reederei group by ReedereiName");
	$stmt->execute();
	while($row=$stmt->fetch(PDO::FETCH_ASSOC))
	{$selected = ($row['ReedereiID'] == $_POST['reederei']) ? ' selected="selected" ' : '';
		?>
        <option '<?php echo $selected; ?>' value="<?php echo $row['ReedereiID']; ?>"><?php echo $row['ReedereiName'] ?></option>
        <?php
	} 
?>
</select></li>
<br />Schiff <br />
 <select name="schiff" class="schiff" id="schiff">
<option selected="selected">Schiff aussuchen</option>
<?php
$reed = $_POST['reederei'];

if ($_POST['reederei']==''or $_POST['reederei']=='0'){


	$sql = "SELECT reederei_id,ship_id,name FROM schiffe";
	$result = mysql_query($sql) OR die(mysql_error());}
else

{
	$sql = "SELECT reederei_id,ship_id,name FROM schiffe where reederei_id ='".$reed."'";
	$result = mysql_query($sql) OR die(mysql_error());}

	
	?><?php
	while($row = mysql_fetch_assoc($result))
	{
		$selected = ($row['ship_id'] == $_POST['schiff']) ? ' selected="selected" ' : '';
		?>
        <option value="<?php echo $row['ship_id']; ?>"<?php echo $selected ?>><?php echo $row['name']; ?></option>
        <?php
	}?>
</select>
 
was soll denn geschaut werden? du hast die rückfragen noch immer nicht beantwortet oder hab ich was übersehen?
 
Dein Problem ist komplexer als ich zuerst dachte. Das Thema hat mich ein bisschen interessiert:
Code:
<!DOCTYPE html>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Fenstertitel</title>
<style type="text/css"></style>
</head>
<body>
<script type="text/javascript">
var gebiete = ["Geb a", "Geb b", "Geb c"];
var reedereien = ["Red a", "Red b", "Red c"];
var schiffe = [
	{name: "Schiff a", reederei: 0, gebiete: [2]},
	{name: "Schiff b", reederei: 1, gebiete: [0, 2]},
	{name: "Schiff c", reederei: 2, gebiete: [1]}
];

function update(){
	updateGeb();
	updateRed();
	updateSchiff();
}
function updateGeb(){
	var schiff = selSchiff.options[selSchiff.selectedIndex].objectIndex;
	var geb;
	if (schiff){
		geb = schiff.gebiete;
	}
	else {
		var reederei = selRed.options[selRed.selectedIndex].objectIndex;
		if (typeof reederei !== "undefined"){
			var cschiffe = schiffe.filter(function(schiff){
				return schiff.reederei === reederei;
			});
			geb = cschiffe.reduce(function(geb, schiff){
				return geb.concat(schiff.gebiete);
			}, []);
		}
	}
	updateSel(selGeb, geb);
}
function updateRed(){
	var schiff = selSchiff.options[selSchiff.selectedIndex].objectIndex;
	var red;
	if (schiff){
		red = [schiff.reederei];
	}
	else {
		var gebiet = selGeb.options[selGeb.selectedIndex].objectIndex;
		if (typeof gebiet !== "undefined"){
			var cschiffe = schiffe.filter(function(schiff){
				return schiff.gebiete.indexOf(gebiet) !== -1;
			});
			red = cschiffe.map(function(schiff){
				return schiff.reederei;
			});
		}
	}
	updateSel(selRed, red);
}
function updateSchiff(){
	var reederei = selRed.options[selRed.selectedIndex].objectIndex;console.log(reederei);
	var gebiet = selGeb.options[selGeb.selectedIndex].objectIndex;
	var cschiffe = schiffe.filter(function(schiff){
		return (typeof reederei === "undefined" || schiff.reederei === reederei) && (typeof gebiet === "undefined" || schiff.gebiete.indexOf(gebiet) !== -1);
	});
	updateSel(selSchiff, cschiffe);
}
function updateSel(sel, available){
	Array.from(sel.options).forEach(function(option){
		if (typeof option.objectIndex !== "undefined"){
			option.disabled = available && available.length && available.indexOf(option.objectIndex) === -1;
			option.style.display = option.disabled? "none": "";
		}
	});
}

var selGeb = document.createElement("select");
selGeb.appendChild(new Option());
gebiete.forEach(function(geb, i){
	var option = new Option(geb, geb);
	option.objectIndex = i;
	selGeb.appendChild(option);
});
selGeb.addEventListener("change", update);
document.body.appendChild(selGeb);

var selRed = document.createElement("select");
selRed.appendChild(new Option());
reedereien.forEach(function(red, i){
	var option = new Option(red, red);
	option.objectIndex = i;
	selRed.appendChild(option);
});
selRed.addEventListener("change", update);
document.body.appendChild(selRed);

var selSchiff = document.createElement("select");
selSchiff.appendChild(new Option());
schiffe.forEach(function(schiff, i){
	var option = new Option(schiff.name, schiff.name);
	option.objectIndex = schiff;
	selSchiff.appendChild(option);
});
selSchiff.addEventListener("change", update);
document.body.appendChild(selSchiff);

</script>
</body>
</html>
- deine Aufgabe ist es jetzt, deine Daten aus der DB in das JS zu bekommen.
 
ober cool - ich hab noch eine frage - bzw. kannst du mir dabei helfen, wenn ich noch zwei felder datum mit dabei haben möchte - also von--bis
mit rein haben möchte

- - - Aktualisiert - - -

also ich habe in der db die möglichkeit die reisezeiträume einem gebiet einer reederei und einem schiff zuzuordnen
 
ich weiss überhaupt nicht, wie ich das angehen kann

die tab sieht dann so aus, dass ich in der tabelle zeitraum

folgende spalten habe
id____id_route______von_____bis

tab route
id_route____routenbeschreibung_____ausflug___....
 
Zuletzt bearbeitet:
ich finde du solltest mehr einsatz zeigen. aber vielleicht macht korbinian dir das auch noch fertig. ich würde es nicht tun.
 
Ich verstehe deine Gedanken- komme leider nicht weiter mit dem Ansatz - würde es hinbekommen mit einem weiteren Kriterium aber nicht mit dem datumbereich
 
Zurück
Oben