Thomas: Formularausw. mit POST innerh. desselben CGI's unmöglich?

Kann es sein, dass ich bei der Formularauswertung mittels POST an ein anderes eigenständiges CGI-Skript verweisen muss.
Bitte probiert es im unteneingefügten Code mal aus, mit get gehts, bei post nicht!!!Warum?
Hintergrund:
Möchte innerhalb des gleichen Scripts über Subroutinen die Formulare auswerten lassen.
Beispielcode:

#!/usr/bin/perl

Folgende Zeile nicht löschen, ansonsten keine Ausgabe in HTML!!!

print "Content-type: text/html\n\n";

use CGI qw(param);

$modus=param("modus");

print "Modus: $modus<br>";

if($modus eq "out")
{
 if ($ENV{'REQUEST_METHOD'} eq "GET") {
    $buffer = $ENV{'QUERY_STRING'};
} else {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}

Nehme Daten entgegen und kopiere sie in die

Variable $buffer

@nvpairs = split(/&/,$buffer);

Ich teile den Datenstring in einzelne Teile.

foreach $pair (@nvpairs) {
    # Ich decodiere jedes der Teil
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    $in{$name} = $value;

print %in;
    print $ENV{'REQUEST_METHOD'};
}

print "<HTML><HEAD>\n";
print "<TITLE>Umfrageauswertung</TITLE> \n";
print "</HEAD> \n";
print "<h2>Vielen Dank für Ihre Informationen.</h2>\n";
print "Sie gaben ein:<hr><dl>\n";
print "<dd>Ihr Lernerfolg war $in{'Lernerfolg'}\n";
print "<dd>Das Tempo der Vorlesung war $in{'Tempo'}\n";
print "<dd>Ihre Vorkenntnisse waren $in{'Vorkenntnisse'}\n";
print "<dd>Ihr Kommentar:<br> $in{'Kommentar'}\n";
print "<p>";
if (($in{'Tempo'} eq 'zu langsam')
&& ($in{'Lernerfolg'} eq 'nichts')) {
    print "<br>Du fauler Sack!<br>\n";
}

No comment here :))

sub Fehlermeldung {
    my $text= shift;
    print "<P><center>Es ist ein Fehler aufgetreten:<br>";
    print "$text\n";
    print "</center>";
    print "<p>Programm wird abgebrochen.\n";
    print "</HTML>\n";
    exit(1);
}
}

else
{
   print '
    <HTML>
    <HEAD><TITLE>Fragebogen</TITLE></HEAD>
    <BODY LINK="#182650" VLINK="#501826">

<form action="test.pl" method=post>
    <ol>
    <li><b>Ihr persönlicher Lernerfolg:</b><p>
     <ul>
     <li>Wieviel haben Sie in diesem Kurs gelernt?
      <dl><dd>
       <input type="radio" name="Lernerfolg"  value=0>sehr viel
       <input type="radio" name="Lernerfolg"  value=1>viel
       <input type="radio" name="Lernerfolg"  value=2 selected>ausreichend
       <input type="radio" name="Lernerfolg"  value=3>wenig
       <input type="radio" name="Lernerfolg"  value=4>nichts
      </dl>
     <li>Das Tempo war
     <select name=Tempo>
      <option value="zu schnell">zu schnell
      <option value="schnell">schnell
      <option value="genau richtig" selected>genau richtig
      <option value="etwas langatmig">etwas langsam
      <option value="zu langsam">zu langsam
     </select>

<li>Die Vorkenntnisse, die vorausgesetzt wurden, waren für mich
      <dl><dd>
       <input type="radio" name="Vorkenntnisse" value="viel zuviel">entschieden zuviel
       <input type="radio" name="Vorkenntnisse" value="etwas zuviel">etwas zuviel
       <input type="radio" name="Vorkenntnisse" value="genau richtig">genau richtig
       <input type="radio" name="Vorkenntnisse" value="etwas wenig">etwas wenig
       <input type="radio" name="Vorkenntnisse" value="viel zuwenig">entschieden zuwenig
      </dl>
     </ul>
    <p><li><b>Verbesserungsvorschläge:</b><p>
     <ul>
      <li>Weitere Kommentare oder Anregungen:
      <br>
      <dl><dd><textarea name="Kommentar" wrap="virtual" rows=3 cols=60>
       </textarea><P>
      </dl>
     </ul>
    </ol>
    <input type=submit value=" Fragebogen absenden ">
    <input type=reset value=" Alle Werte zurücksetzen ">
    <input type="hidden" name="modus" value="out">
    </form>
    </BODY></HTML>';
}

  1. Hi,

    Kann es sein, dass ich bei der Formularauswertung mittels POST an ein anderes eigenständiges CGI-Skript verweisen muss.

    Wenn das Script sowohl POST- als auch GET-Parameter auswertet: nein.
    Ansonsten: ändere das Script entsprechend ab.

    #!/usr/bin/perl

    Folgende Zeile nicht löschen, ansonsten keine Ausgabe in HTML!!!

    print "Content-type: text/html\n\n";
    use CGI qw(param);

    Ok, CGI-Modul mit Params ist also verfügbar.

    $modus=param("modus");
    print "Modus: $modus<br>";
    if($modus eq "out")
    {
    if ($ENV{'REQUEST_METHOD'} eq "GET") {
        $buffer = $ENV{'QUERY_STRING'};
    } else {
        read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    }

    Arrgh, erst einen Parameter über das CGI-Modul zu lesen und den Rest selbst handinterpretieren? Was ist der Sinn?
    Warum nicht alle Parameter über das CGI-Modul holen?

    cu,
    Andreas

    --
    Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
    http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
    1. Muss an ein paar Dingen nochmal nachhaken.
      Der Grundgedanke von mir ist, eine Subroutine zu verwenden, die, egal ob die Daten mit POST oder GET ankommen aufzurufen, um dann die Daten über return in meinem Haupt-Perl-Script weiterverwenden zu können., quasi:

      <form action="das_gleiche_script.pl" method=post>
             <input type="radio" name="Lernerfolg"  value=0>sehr viel
             <input type="radio" name="Lernerfolg"  value=1>viel
             <input type="radio" name="Lernerfolg"  value=2 selected>ausreichend
          <input type=submit value="submit">
          <input type=reset value="reset">
      </form>

      %hash_result=&parse_form;

      sub parse_form()
      {
        if ($ENV{'REQUEST_METHOD'} eq "GET")
       {
         $buffer = $ENV{'QUERY_STRING'};
       }
       else
       {
         read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
       }

      @nvpairs = split(/&/,$buffer);
       # Ich teile den Datenstring in einzelne Teile.
       foreach $pair (@nvpairs)
       {
         # Ich decodiere jedes der Teil
         ($name, $value) = split(/=/, $pair);
          $value =~ tr/+/ /;
          $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
          $in{$name} = $value;
       }
       return %in;
      }

      1. Hi,

        Muss an ein paar Dingen nochmal nachhaken.

        Unterlasse es zukünftig, dies per email zu tun - das führt bei mir nur dazu, daß ich nichts mehr dazu sage.

        cu,
        Andreas

        --
        Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
        http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
        1. ...natürlich werde ich das unterlassen...hoffentlich hält die Sprachstörung nicht zu lange an ;-))))

          Hi,

          Muss an ein paar Dingen nochmal nachhaken.

          Unterlasse es zukünftig, dies per email zu tun - das führt bei mir nur dazu, daß ich nichts mehr dazu sage.

          cu,
          Andreas

      2. Hallo,

        Der Grundgedanke von mir ist, eine Subroutine zu verwenden, die, egal ob die Daten mit POST oder GET ankommen aufzurufen, um dann die Daten über return in meinem Haupt-Perl-Script weiterverwenden zu können., quasi:

        Das haben sich andere auch schon gedacht, und es in CGI.pm umgesetzt. die Funktion heißt param() und liefert je nach Context entweder eine Liste der Parameternamen oder aber die einzelnen Parameter selbst.

        Der großte Vorteil dieser Lösung ist der, daß es schon zig-tausendmal eingesetzt wird, und daher schon wirklich als krisensicher angesehen werden kann. Jede von Dir entwickelte lösung muß erst diesen Reifungsprozeß durchlaufen, was schon so seine Zeit brauchen wird;-)

        BTW: CGI.pm 'frisst' sozusagen  spätestens beoim ersten Aufruf von param() alles was von STDIN geliefert wird, so daß für Dich und Deiner selbstgestrickten Lösung nichts mehr zu holen gibt.
        Also entweder alles mit CGI.pm (was zu empfehlen ist) oder vollkommen ohne und selbst gemacht (was natürlich einen höheren sportlichen Wert aufweist).

        So, lieber Thomas, num mußt Du Dich entscheiden .... *g*

        Grüße
          Klaus