Dropdown Menü mit onchange

ronaldo84

Erfahrenes Mitglied
Hallo.
Ich habe zwei Dropdown Menüs. Dieser werden über eine SQL-Abfrage gefüllt. Nun möchte ich das wenn in dem einem Menü ein Wert ausgewählt wird, in dem anderen Menü nur die Einträge angezeigt werden die mit der Auswahl aus dem ersten Menü zusammenhängen. Z.B. ich habe in dem ersten Menü die einträge "Farbe" und "Form". Wenn ich nun "Farbe" auswähle möchte ich das in dem anderem Menü Rot, Gelb, Blau usw. steht. Wenn ich aber im esrten Menü "Form" auswähle solll im zweiten Kreis, Dreieck usw. stehen. Dacht mir ich könnte das mit onchange mahen. Leider Funktioniert das nicht und es werden immer alle Einträge gezeigt. Habe es auch schon mit onafterupdate versucht.
Hier mein Code:
Hier die SQL-Statements:
Code:
my $hsql="Select hersteller FROM $tabelle GROUP BY hersteller WHERE warengruppe LIKE warengruppe";				
my $psql="Select warengruppe FROM $tabelle GROUP BY warengruppe WHERE hersteller LIKE hesrteller";
Dann eins der beiden Menüs.
Code:
 print "<select size='1' onchange='abfrage($hsql);$firma->execute or die $dbh->errstr();' name='gruppe'><option value='produktgruppe'>Keine Auswahl</option>";
while (my ($warengruppe) = $produkt->fetchrow_array()){ 
print "<option value='$warengruppe' >$warengruppe</option>";
Besonder wichtig die onchange-Anweisung
Code:
onchange='abfrage($hsql);$firma->execute or die $dbh->errstr();onchange='abfrage($hsql);$firma->execute or die $dbh->errstr();
Und dann meine Subroutine "Abfrage"
Code:
sub abfrage{
my $sql = shift;
$dbh->prepare($sql)or die $dbh->errstr();
Das Skript funktioniert. Halt nur das mit dem Onchange nicht.Weiß jemand woran das liegen kann? Oder geht das nicht wie ich es mir gedacht habe? Kann mir jemand einen anderen Vorschlag machen wie ich das machen kann? Hoffe ihr könnt mir helfen. Vielen Dank.

//Edit: Falls ich es vergessen habe ich möchte es in Perl machen.
 
Zuletzt bearbeitet:
Okay. Ich glaube ich bin jetzt schon etwas weiter. Und zwar habe ich die Menüzeichnung nun in eine subroutine gepackt.
Code:
sub menu {
my $name = shift;
my $wert = shift;
my $was = shift;
my $var = shift;
my $sql = shift;
print "<select size='1' onchange=";my $versuch =abfrage($sql, $was);print" name='$name'><option value='$wert'>Keine Auswahl</option>";
while (my ($var) = $was->fetchrow_array()){ 
print "<option value='$var' >$var</option>";
}
print "</select>";
}
Die onChange-Anweisung habe ich auch verändert. Also bei onChagne rufe ich dann folgende Subroutine auf:
Code:
sub abfrage{
my $sql = shift;
my $was = shift;
$was = $dbh->prepare($sql)or die $dbh->errstr();
$was->execute or die $dbh->errstr();
return($was)
}
Wenn also der Eintrag geändert wird soll $was ein neuer Wert zugeteilt werden und dadurch die Einträge in der Liste aktualisiert werden. Leider kommt jetzt der Fehler, das wenn ich die Seite öffne nur noch ein Dropdown Menü erstellet wird und dieses hat keinen Inhalt. Mit dem Routinenaufruf bei onchange bin ich mir nicht ganz sicher. Habe es so getestet das ich dort eine sub routine aufgerufen habe die einfach einen Alert macht. Das hat geklappt und das Alert kam auch nur sobald ich den Eintrag verändert habe.
 
Ein onchange="abfrage()" in einem Java-Script ruft die Funktion abfrage() des JavaScripts auf, nicht von einem Perl-Skript!
 
Das ist mir schon klar. Deswegen nehme ich den Subroutinenaufruf ja auch aus dem Print raus.

Code:
print "<select size='1' onchange='";
#abfrage($sql ,$was);
test();
print "' name='$name'><option value='$wert'>Keine Auswahl</option>";

Die Routine test sieht so aus:
Code:
sub test{
print "alert(this.value)";
}
und da funktioniert es auch. Sobald ich einen Eintrag ändere kommt eine Fenster mit dem Wert. Das klappt alles. Nur sobald ich es dann wieder auf die andere Routine änder kommt der oben genannt Fehler. Und die Routine ist richtig, weil das die gleich Routine ist mit der ich die Menüs fülle. Nur ein anders SQL-Statement.

//Edit hatte einen Denkfehler drin. Hat sich erledigt
 
Zuletzt bearbeitet:
Ich hatte vor längerer Zeit gleiches Problem und habe es per JavaScript gelöst.
Weiß nicht, obs noch aktuell ist. Habe das Thema erst jetzt entdeckt, aber hier meine Lösung:

Ich habe einfach die Werte aus einer Datenbank in eine JavaScript-Funktion auslesen lassen. Dazu habe ich sozusagen eine JavaScript Datenbank mit 2 Arrays erstellt. Also werden die Werte mit PHP an JavaScript übergeben und direkt in Arrays geschrieben. Sobald sich etwas im dropdown-Menü ändert, wird eine Funktion per onchange aufgerufen. Diese löscht alle Werte aus dem 2ten Feld und fügt dort entsprechende Werte aus dem Array ein.

Den Quelltext möchte ich nicht unbedingt veröffentlichen, aber mit ein wenig Denkarbeit ist es garnicht so schwer. Ansonsten könnt ihr mich gerne fragen.

gruß
gocyla
 

Neue Beiträge

Zurück