3 dynamische Dropdownlisten

klausjaede

Gesperrt
Als Newbie suche ich einen (möglichst kompletten) Code der folgende Aufgabe löst:

Ich habe eine MySQL-Datenbank mit drei Tabellen:

1. Laender (felder: L_ID, L_Name,)
2. Region (felder: R_ID, R_Laender_ID,R_Name)
3. Orte (felder: O_ID, O_Region_ID, O_Name)

"R_Laender_ID" ist die Verknüpfung zu "L_ID"
"O_Region_ID" ist die Verknüpfung zu "R_ID"

Nun möchte ich per PHP drei mit den MySQL-Daten gefüllte Dropdown-Listen platzieren.

Im ersten Dropdown stehen alle Länder.
Nach der Auswahl eines Landes sollen in der 2. Dropdown-Liste alle Regionen dieses Landes stehen.
Nach der Auswahl der Region sollen in der 3. Dropdownliste alle Orte der vorher ausgewählten Region stehen.

Danach möchte ich den so ausgewählten Ort auf eine neue Seite posten.

Wer kann mir mit einem Stück PHP-Code bzw. Javascript helfen ?


;-) Klaus
 
Grundsatzfrage: Hast du vor, das mit JavaScript zu realisieren, so dass man nach Klick auf ein Land sofort die dortigen Regionen sieht oder gedenkst du, die Seite nach der Auswahl eines Landes zu refreshen und dann mit PHP die entsprechenden Regionen auszugeben?
 
Hallo,

vorab... viel Ahnung vom Programmieren habe ich nicht. Vor einiger Zeit hatte ich einmal etwas gefunden, wie das via Javascript zu realisieren wäre. Nur bekomme ich das leider auch noch nicht mit mehr als zwei Auswahllisten hin. - Die Länder würde ich da ebenfalls ganz gerne noch mit einbeziehen, aber wie?

Vielleicht weiß auch jemand wie man in nachfolgendem Skript die Funktion ReFill ausserhalb eines Event-Handlers aufrufen kann. Beim Laden der Seite sollen bereits nur die Werte in der 2. Auswahlliste angezeigt werden, die sich auf einen zuvor abgespeicherten Wert in einer SQL-Datenbank aus der 1. Auswahlliste beziehen.

Vielleicht geht das Ganze aber auch noch wesentlich einfacher?

Code:
<?
echo "
<script language=\"JavaScript\">
<!--

var i
var omFirstDrop
var omSecondDrop
var omSourceDrop
var imSelectedItem
var imFirstDropCount
var imSecondDropCount
var imSourceDropCount
var amDropItems

function GetItems()
        {
        var imItemCount
        var omDropItem

        //Trägt die Items in ein Array ein
        imItemCount = 0

        for (i=0; i<imSourceDropCount; i++)
                {
                omDropItem = omSourceDrop.options[i];

                //Wenn SourceItem zu Eintrag gehört oder wenn Alle ausgewählt wurden
                if (imSelectedItem == 0 || omDropItem.name == imSelectedItem)
                        {
                        amDropItems[imSelectedItem][imItemCount]=new Option(omDropItem.text, omDropItem.value)
                        imItemCount = imItemCount + 1
                        }
                }
        }

function ReFill(smFirstDrop, smSecondDrop, smSourceDrop)
        {
        omFirstDrop = document.getElementById(smFirstDrop);
        omSecondDrop = document.getElementById(smSecondDrop);
        omSourceDrop = document.getElementById(smSourceDrop);
        imSelectedItem = omFirstDrop.options[omFirstDrop.selectedIndex].value;
        imFirstDropCount = omFirstDrop.options.length;
        imSecondDropCount = omSecondDrop.options.length;
        imSourceDropCount = omSourceDrop.options.length;
        amDropItems = new Array();
        amDropItems[imSelectedItem] = new Array();

        GetItems();

        for (i=imSecondDropCount; i>0; i--)
                {
                omSecondDrop.options[i]=null;
                }

        for (i=0; i<amDropItems[imSelectedItem].length; i++)
                {
                omSecondDrop.options[i]=new Option(amDropItems[imSelectedItem][i].text, amDropItems[imSelectedItem][i].value);
                }

        omSecondDrop.options[0].selected=true
        }
//-->
</script>

<FORM METHOD=\"POST\" ACTION=\"$PHP_SELF\">

<SELECT name=\"omTemp\" style=\"display:none\">
  <option value=\"1\" name=\"1\">München</option>
  <option value=\"2\" name=\"1\">Nürnberg</option>
  <option value=\"3\" name=\"2\">Düsseldorf</option>
  <option value=\"4\" name=\"2\">Köln</option>
</SELECT>

Bundesland:&nbsp;";
$ay_laender = array('1' => 'Bayern', '2' => 'NRW');
?>
<SELECT name=bundesland onChange="javascript:ReFill('bundesland', 'ort', 'omTemp');">
<?
  foreach($ay_laender as $id => $title) {
    echo "<option value=\"{$id}\"" .(($useredit[land] == $id) ? " selected=\"selected\"" : ""). ">{$title}</option>";
  }
echo "
</SELECT>

Ort:&nbsp;
<SELECT name=ort></SELECT>
<INPUT class=send TYPE=\"submit\" VALUE=\"Bearbeiten\">
</form>";
echo "Bundesland ($bundesland), Ort ($ort)";
?>

Danke im Voraus
 
das geht einfacher

das Problem hatte ich auch einmal und habe folgendes gemacht
<tr><td>
<select name="L_Name" size="1" onchange="window.location=('deinedatei.php?L_Name='+this.options[this.selectedIndex].value)">>
<option></option>
<?
$sql=safe_query("SELECT * FROM laender ORDER BY L_ID");
while($row=mysql_fetch_array($sql))
{
echo "<option value=\"$row[2]\"";
if($L_Name=="$row[2]") {echo " selected";}
echo ">$row[2]</option>\n";
}
?>
</select>
</td></tr>
<!--Region -->
<tr><td>
<select name="R_Name" size="1" onchange="window.location=('deinedatei.php?L_Name=<?=$L_Name;?>&R_Name='+this.options[this.selectedIndex].value)">>
<option></option>
<?
$sql=safe_query("SELECT * FROM region WHERE R_Laender='$L_Name' ORDER BY R_ID");
while($row=mysql_fetch_array($sql))
{
echo "<option value=\"$row[2]\"";
if($R_Name=="$row[2]") {echo " selected";}
echo ">$row[2]</option>\n";
}
?>
</select>
</td></tr>
<!--Orte -->
<tr><td>
<select name="O_Name" size="1" onchange="window.location=('deinedatei.php?L_Name=<?=$L_Name;?>&R_Name=<?=$R_Name;?>&O_Name='+this.options[this.selectedIndex].value)">>
<option></option>
<?
$sql=safe_query("SELECT * FROM region WHERE O_Name='$R_Name' ORDER BY R_ID");
while($row=mysql_fetch_array($sql))
{
echo "<option value=\"$row[2]\">$row[2]</option>\n";
}
?>
</select>
</td></tr>
 
Hallo snackx,

danke für Deinen Lösungsvorschlag.
Das Ganze über die Datenbank zu machen finde ich auf jeden Fall besser. Nur suche ich doch nach einer Möglichkeit es über Javascript, am Besten wäre Javascript und SQL, zu machen, damit die Seite nicht nach jeder Änderung neu aufgerufen werden muß.

Vielleicht kennt dazu noch jemand eine Möglichkeit? Finde auch in den Suchmaschinen nicht wirklich einen vernünftigen Ansatz dazu und wenn überhaupt dann immer nur mit zwei Auswahllisten, sollen aber halt drei sein. Länder -> Regionen -> Orte
 
Zurück