Carl: onChange in PHP-script

Hi

also ich hab ne seite mit einer einfachen auswahlliste.
Nun möchte ich, anstatt das immer auf den Submit-Button geklickt werden muss, sofort über die onChange-Funktion von JavaScript die Seite aufgerufen wird.
Das ganze sieht so aus:

<form method=post action=produktkat.php>
<table align=center border=0 width="500" BGCOLOR="#09105A">
 <tr>
  <td valign=top align=center>
   <br>
   <font color="#FFFFFF">Bitte wählen sie die von Ihnen gewünschte Produktkategorie aus.</font>
   <br><br>
   <select name="produktkategorie">
   <OPTGROUP LABEL="Schiffe">
   <option value="1">Transporter und Spezialschiffe</option>
   <option value="2">Raumjäger und Bomber</option>
   <option value="3">Geleitschiffe</option>
   <option value="4">Zerstörerklasse</option>
   <option value="5">Leichte und mittlere Kreuzer</option>
   <option value="6">Grosse Kreuzer</option>
   <option value="7">Schlachtschiffe</option>
   <option value="8">Trägerschiffe für Raumjäger und Bomber</option>
   <option value="9">Sonderschiffe</option>
   </select>
   <br><br><input type="SUBMIT" name="anfrage">
   <br><br>
  </td>
 </tr>
</table>
</form>

Jatzt hab ich aber das Problem, dass ich hier mit values arbeite, deren ziele in der produktkat.php aufgelistet sind. Mich würde nun interessieren, ob es besser ist, einfach die produktkat.php wegzulassen und stattdessen direkt als value die url anzugeben, oder, ob ich einfach auch so weitermachen kann und falls ja, wie ich es dann schaffe, dass die produktkat.php auch aufgerufen wird, sobald ich was ändere (klappt nämlich im moment irgendwie nicht).

Gruss
Carl

  1. Hallo, Carl,

    ich glaube, dass die Wenigsten dein Problem verstanden haben, weshalb bisher niemand geantwortet hat; ich bin mir auch nicht sicher über den Kern deiner Frage.

    also ich hab ne seite mit einer einfachen auswahlliste.
    Nun möchte ich, anstatt das immer auf den Submit-Button geklickt werden muss, sofort über die onChange-Funktion von JavaScript die Seite aufgerufen wird.

    Für den Fall, dass du verschiedene Seiten als Linkziele definieren willst:

    Das lässt sich im Grunde genommen wie in http://selfhtml.teamone.de/javascript/beispiele/verweisliste.htm beschrieben lösen, natürlich mit dem Nachteil, dass es ohne JavaScript nicht funktioniert und dadurch viele Besucher sowieso Suchmaschinen den Links nicht folgen können.

    Jatzt hab ich aber das Problem, dass ich hier mit values arbeite, deren ziele in der produktkat.php aufgelistet sind.

    Das verstehe ich nicht. Was ist in produktkat.php aufgelistet, die URLs der Kategorien, zu welchen produktkat.php weiterleiten soll (falls es das soll)?

    Mich würde nun interessieren, ob es besser ist, einfach die produktkat.php wegzulassen und stattdessen direkt als value die url anzugeben, oder, ob ich einfach auch so weitermachen kann und falls ja, wie ich es dann schaffe, dass die produktkat.php auch aufgerufen wird, sobald ich was ändere (klappt nämlich im moment irgendwie nicht).

    »Häh?« ;) Ich verstehe nichts. Nacheinander:

    Mich würde nun interessieren, ob es besser ist, einfach die produktkat.php wegzulassen und stattdessen direkt als value die url anzugeben,

    Wenn du mit der zuverlässigen Methode ohne JavaScript arbeitest, stellt sich diese Frage nicht, denn dann ist ein Weiterleitungsskript notwendig. Wenn du die URL direkt im jeweiligen value-Attribut angibst, kannst du eine JavaScript-Lösung verwenden, für eine serverseitige Lösung wäre das aber irrelevant beziehungsweise würde sich danach richten, wo du die Kategorie-URLs am liebsten unterbringen willst.

    oder, ob ich einfach auch so weitermachen kann

    Ja, mit dem von dir geposteten Formular kannst du zweifellos arbeiten, jedoch nur beim Einsatz einer serverseitigen Lösung, zu der ich dir raten würde.

    und falls ja, wie ich es dann schaffe, dass die produktkat.php auch aufgerufen wird, sobald ich was ändere (klappt nämlich im moment irgendwie nicht).

    Im Grunde genommen bei einer serverseitigen Lösung:
      onchange="document.meinformular.submit()"
    für das select-Element. Wobei »meinformular« der name-Attributwert des form-Elements ist. Detaillierte Erklärungen unter http://selfhtml.teamone.de/javascript/objekte/forms.htm.

    Ich würde dir jedoch davon abraten, da der Benutzer durchaus das Formular mit gedrückter Maustaste oder der Tastatur durchlaufen kann, wodurch der Event früher eintreten könnte, als der Benutzer es möchte, somit wird zu einer falschen Seite weitergeleitet.
    In jedem Fall darf dieser JavaScript-Zusatz nicht die grunsätziche Funktionalität des Formulars beeinträchtigen, deshalb ist auch der Submitbutton obligat, auch wenn das JavaScript das Absenden des Formulars automatisiert.

    Für eine clientseitige Lösung siehe die obige URL... dort ist es ähnlich, nur wird nicht das Formular abgesendet, sondern die URL aus dem value-Attribut des ausgewählten option-Elements gelesen und über location.href dahin weitergeleitet.

    Zusammengefasst:
    Falls du über das Auswahlformular den Benutzer je nach Eingabe zu verschiedenen URLs weiterleiten willst, kannst du die obige JavaScript-Lösung verwenden, welche aber, wie gesagt, nicht zuverlässig ist. Zuverlässiger ist, dass du das Formular wie gewohnt an eine URL sendest (action-Attributwert), welche die übergebenen Formulardaten auswertet und dann den Benutzer weiterleitet.

    Wenn du beispielsweise in den value-Attribute Zahlen vorgibst (das bestehende Formular verwendest), könnte das Weiterleitungsskript in PHP vereinfacht folgendermaßen aussehen:

    <?php
    /* Array mit den Zuordnungen Zahlwert -> URL */
    $adressen=array(
     1 => 'transporter_spezialschiffe.html',
     'raumjaeger_bomber.html',
     'geleitschiffe.html',
     ...
    );

    if (!empty($_POST['produktkategorie'])) {
     /* Fall ein POST-Parameter namens »produktkategorie« übermittelt wurde: */
     /* Leite über den HTTP-Code 302 und den HTTP-Header Location zur Seite weiter, welche unter dem Parameterwert im Array verzeichnet ist */
     header('Location: '.$adressen[$_POST['produktkategorie']]);
    } else {
     /* Fehlerhafter Aufruf, gehe zurück zur vorigen Seite */
     header('Location: seite_mit_formular.html');
    }
    ?>

    Natürlich ist das nur ein Beispiel, du solltest natürlich zusätzlich prüfen, ob der übergebene Wert eine Zahl ist, um Fehler im Formular abzufangen etc.
    Ob du nun die URLs im Script oder im Formular definierst ist eigentlich gleich, sofern das Übermitteln der URL nicht dazu führt, dass sie maskiert wird oder ähnliches... Prinzipiell kannst du diese Entscheidung nach deiner Vorliebe treffen, vielleicht willst du die Liste sowieso dynamisch generieren lassen, dann wäre es einfacher, das Formular mit den URLs zu füllen, sofern du keinen dritten Datenablageplatz hast, auf welchen beide Scripte zugreifen können... wie auch immer, nur Mutmaßungen meinerseits.

    Bitte frage nach, wenn etwas unklar ist, vorerst muss ich mich jedoch regenerieren, deshalb vorerst soweit; Hauptsache der Thread landet nicht unbeantwortet im Archiv, wenn ich wieder aufwache...

    Mathias