You are not logged in.

  • Login

1

Thursday, December 14th 2006, 11:00am

Zweite Select-Feld in Abhängigkeit vom ersten?

Guten Morgen,
mich treibt ein programmiertechnisches Problem um, was mir keine Ruhe lassen will.

Ich möchte zwei Select-Felder realisieren, bei denen sich der Inhalt des zweiten an der Auswahl des ersten orientiert.

Beispiel
Im ersten Select-Feld kann man das Land auswählen. Ich wähle Deutschland. Nun soll ein zweites Select-Feld erscheinen, dass alle Bundesländer in Deutschland auflistet. Würde im ersten Feld Österreich gewählt, sollten entsprechend die dortigen Bundesländer im zweiten Select-Feld zur Auswahl stehen.

Wie kann ich soetwas realisieren? HTML, Java Script?

Bin für jeden sachdienlichen Hinweis dankbar.

Der Grashalm...

2

Thursday, December 14th 2006, 11:19am

Hi,

das funktioniert mit AJAX.
Schau dir dieses Tutorial an: Ajax Inhalte mit PHP und Select nachladen

Für deine Konstellation musst du nur die Ausgabe der func.php ändern

PHP Quellcode

1
2
3
4
5
6
7
8
<?php
echo '<select name="bundesland">';
$result = mysql_query("SELECT title,text FROM `inhalte` WHERE `gruppe` = '$_GET[s]'; ");
while($row = mysql_fetch_object($result)) {
    echo '<option value="'.$row->title.'">'.$row->title.'</option>';
}
echo '</select>';
?>

3

Thursday, December 14th 2006, 11:22am

Nur mit HTML ist das recht umständlich. Ich gehe davon aus, daß du zumindest eine serverseitiges Script einsetzt um die Optionen der Selects zu erstellen. Dann würde ich dir empfehlen das Nachladen der Optionen im zweiten Select mittels Ajax zu realisieren. Prototype (http://prototype.conio.net/) kennt die Klasse Updater, die für diesen Zweck ideal ist.

EDITH sagt:
Da war d0nUt mal wieder schneller! ;)

4

Thursday, December 21st 2006, 3:54pm

Hallo,

vielen Dank für Deine vorhergehenden Postings. Die habe ich gut verwenden können. Ich habe nur noch folgendes Problem: Ich möchte, dass sich die Values eines zweiten Select-Feldes je nach Angabe des ersten verändern.
Im Mozilla funktioniert das auch, aber leider nicht im IE6.

Hier mal mein JS Quellcode (von Dir ;-)):

JavaScript Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<script type="text/Javascript">
 
<!--
function sendRequest() {
 
        try 
		{
                req = window.XMLHttpRequest?new XMLHttpRequest():
                new ActiveXObject("Microsoft.XMLHTTP");
        } 
 
		catch (e) 
		{
                //Kein AJAX Support
        }
 
		req.onreadystatechange = handleResponse;
        id = document.getElementById('berufsgruppe').value;
        req.open('get', 'func.php?s='+ id);
        req.send(null);
}
 
function handleResponse() {
        if ((req.readyState == 4) && (req.status == 200)) 
		{
                document.getElementById('inhalt').innerHTML = req.responseText;
        }
}
 
//-->
 
</script>


und meine func.php:

PHP Quellcode

1
2
3
4
5
6
7
8
9
10
11
<?php
      include "action/verb.php";
      //Inhalte laden
      $result = mysql_query("SELECT * FROM berufe WHERE gruppe = '$_GET[s]'") or die(mysql_error());
      while($row = mysql_fetch_object($result))
      {
              $beruf = $row->bezeichnung;
	      echo "<option value=\"".$beruf."\">".$beruf."</option>";
 
      }
?>


Meine select-Feld sieht wie folgt aus:

HTML Code

1
2
3
<select id="inhalt" class="form" name="beruf">
 
</select>


Wäre nett, wenn Ihr mir helfen könnt, dass die Funktion auch im IE läuft.
Schonmal danke.
[/coderwiki]

5

Thursday, December 21st 2006, 4:21pm

Quoted from ""Maverick1611""

Im Mozilla funktioniert das auch, aber leider nicht im IE6.


Inwiefern finktioniert das im IE nicht? werden die veränderten Options einfach nicht angezeigt? Wenn ja, dann kann es sich um ein Problem mit dem Cache handeln, daß du durch einen zusätzlichen Parameter bei deinem Ajax-Query lösen kannst, der sich von Aufruf zu Aufruf ändert.

JavaScript Code

1
req.open('get', 'func.php?s='+ id + '&anti_cache=' + Math.random());

6

Thursday, December 21st 2006, 4:25pm

Hi

dazu musst du diesen WorkAround machen:
http://support.microsoft.com/kb/276228/de

Das <select> ist eben nicht als html container konzipiert. Da ist der IE ausnahmsweise mal restriktiver als der Firefox.

//EDIT: Oder man sagt sich natürlich, dass jedes XML Tag weitere XML Tags aufnehmen kann (klingt ja auch logisch), dann ist der Firefox im Recht

7

Thursday, December 21st 2006, 5:43pm

Einfach klasse das Forum.

Vielen Dank das hat geklappt. :D

8

Monday, August 11th 2008, 2:19pm

Hallo,

gibt es auch eine Möglichkeit mit der Ausgabe weiter zu arbeiten und gegebenenfalls ein 3. feld in abhängigkeit zum 2. zu stellen bzw. dann auch ein 4. zum 3.?

10

Monday, September 22nd 2008, 3:54pm

Hallo,

wie müsste man den Code aus dem Wiki abändern, damit erst die 2. Datenabfrage zu einer Ausgabe führt? Ich muss nämlich erst noch ein Array aus einer anderen Tabelle einlesen und danach erst die entscheidende Abfrage starten.

Mfg Cr@@gle

11

Monday, September 22nd 2008, 7:32pm

du willst also auch keine 2 AJAX Abfragen machen, sondern nur 2 Daten für eine Abfrage nutzen?

12

Tuesday, September 23rd 2008, 2:22pm

Genau,

erst muss ich bestimmte Werte aus einer anderen Tabelle auslesen, die ich dann für die entscheidene Abfrage benötige.

Dabei sollte die erste Abfrage noch keine Ajax-Ausgabe machen.

Mfg Cr@@gle

13

Tuesday, September 23rd 2008, 5:16pm

keine ausgabe oder kein ajax request?
Wie du mehrere Formularfelder per AJAX verschickst erfährst du auch im WIki: Ajax Formulardaten per AJAX verschicken

14

Tuesday, September 23rd 2008, 8:54pm

Nene, da kommen wir jetzt auf die falsche Fährte:

  1. Der User wählt aus einem Selectfeld "Gruppe A" aus
  2. Dies wird jetzt mit ID=11 an die func.php gesendet
  3. Dort wird als erstes aus Tabelle A der Zeile 11 Spalte 4 (Abhängigkeiten) der Wert ausgelesen
  4. Zurück kommt "1,3,4,7"
  5. Diesen Wert trenne ich in ein Array auf
  6. Jetzt wird aus Tabelle B die Zeilen (=ID) 1, 3, 4 und 7 ausgelesen
  7. Für jede diese Zeile wird dann in der While-Schleife ein echo "<option...." ausgegeben, die dann im Endeffekt zurückzuliefern sind und in das vorgegebene Selectfeld 2 eingetragen werden sollen.
Mein Problem bisher:

Sobald ich die erste Datenbankabfrage ausführe, möchte er alles, was in der folgenden While-Schleife vorkommt, schon zurückliefern. Alles danach (2. Datenbankabfrage, usw.) interessiert ihn nicht mehr.

Ich hoffe das war jetzt verständlicher :)

Mfg Cr@@gle

15

Tuesday, September 23rd 2008, 10:04pm

Dann ist es das selbe wie im Thread nur mit mehr Logik und ohne Ausgabe ;)
Wo hakt es denn?

16

Wednesday, September 24th 2008, 10:47am

Dann ist es das selbe wie im Thread nur mit mehr Logik und ohne Ausgabe ;)
Wo hakt es denn?
Mein Problem bisher:

Sobald ich die erste Datenbankabfrage ausführe, möchte er alles, was in der folgenden While-Schleife vorkommt, schon zurückliefern. Alles danach (2. Datenbankabfrage, usw.) interessiert ihn nicht mehr.
Also im Grunde brauche ich: Nicht die erste Datenbankabfrage sollte eine Ausgabe bringen, sondern erst die 2.

Mfg Cr@@gle

17

Thursday, September 25th 2008, 10:53am

Hallo,

habe mir nochmal Gedanken gemacht und bin auf folgende Idee gekommen:

1. Ich schicke als ID gleich die Objektarten mit (also <option value="3,4">....)
2. jetzt muss ich nur noch die übermittelte ID in ein Array teilen und so sieht es aus:

Source code

1
2
3
4
5
6
7
8
$allObjectArts = explode (',',$_POST['objectType']);
$result = mysql_query("SELECT * FROM isz1_1_object_arts");
while($row = mysql_fetch_object($result)) 
{
	if(in_array($row['itemID'], $allObjectArts)) {
		echo '<option value="0">test</option>';
	}
}


Nur sobald ich in der While-Schleife überprüfe, ob die itemID in dem Array vorkommt, geht es schon wieder nicht mehr. ;(

Also $allObjectArts[0] wäre in meinem Beispiel '3', $allObjectArts[1] wäre '4'

Diese ID's sind mit 100% Sicherheit auch verfügbar.

Aber warum schmeckt ihm das nicht? Oder wie müsste ich das ganze formen, dass in der While-Schleife nur mehr die Echo's vorkommen und trotzdem der Sinn noch erhalten bleibt?

Danke für Hilfe,
Cr@@gle

18

Thursday, September 25th 2008, 10:00pm

nur so zwei tipps:
1. PHP MySQL Injection
2.

SQL Code

1
SELECT * FROM TABLE WHERE COLUMN IN (1,2,3)

19

Thursday, September 25th 2008, 10:31pm

Hallo,

zu 1. Danke für den Wiki-Eintrag, nur beachte ich diese Regeln schon lange. Dies war jetzt nur ein schneller Test local, so kommt es bestimmt nicht in Einsatz :D
zu 2. Danke, das hat mich jetzt schon um einiges weitergebracht. Die Ausgabe funktioniert jetzt wie gewollt.

Ein einziges Problem habe ich noch:

Source code

1
echo '<option value="'.$row->itemID.'">'.$row->itemName.'</option>';


So würde jetzt mein Echo aussehen, alles wunderbar. Nur wird immer die Sprachvariable gespeichert. Also $row->itemName gibt zum Beispiel "isz.test.objectart1" aus.

Wie müsste ich das jetzt umstricken, damit er die Sprachvariable richtig umwandelt?

Hätte es so probiert:

Source code

1
echo '<option value="'.$row->itemID.'">{lang}'.$row->itemName.'{/lang}</option>';


Nur wird dies dann auch so ausgegeben, anstatt das es wie im Template durch die passende Sprachvariable ausgetauscht wird. Also Ergebnis: "{lang}isz.test.objectart1{/lang}"

Wie könnte ich das noch bewerkstelligen? Danach lasse ich dich wieder zufrieden, versprochen! :D ;)

Mfg Cr@@gle

20

Friday, September 26th 2008, 8:04pm

wenn es die Sprachvariable isz.test.objectart1 gibt, dann funktioniert es genau so.
Notfalls musst du den Sprachtext serverseitig generieren.

Social bookmarks