Christoph Rippich: GET + POST + PERL.....Environment-Variablenübergabe an den Script

Hallo, everybody!

Ich bin ein eingefleischter C(ohne++!)-Windows-Programmierer, der sich (aus ökonomischen Gründen) auch im WEB zurechtfinden muß. Mein Bruder (www.andrip.de) vertreibt eine Software (ich will keine Werbung explizit machen, schaut einfach dort nach!), die auch im Internet angeboten wird. Dazu eine Homepage mit
Bestell-FORM-ular, das mit einem Perl-Script auf dem Server schnackt.

Mein Problem: Es klappt, aber nur so in etwa 80 Prozent der Fälle. Oder doch immer?

Jetzt genau:
Das Script liest alle übermittelten Daten aus und echo't sie in eine E-mail an uns sowie einer HTML an den Kunden. Immer mal, aber immer öfter, bekommen wir eine E-Mail, die vom Script abgeschickt wurde, der offensichtlich NULL Übergabe-Daten gelesen hat. Zeitgleich schaue ich in der ACCESSLOG-Datei des Servers nach und sehe, daß ein GET-Befehl auf "bestell.pl" abgesetzt worden war, ohne übergebene Parameter. Ich verstehe das, wenn die Logdatei als Originator einen Robot zitiert (Slurp, Web-sheep, Guliver, oder wie sie alle heißen). Aber ein Absender wie "Mozilla...compatible... IE5.01" müßte ein Kunde sein, dessen Bestellung ich dann nicht sehe. Oder ist es eine Fehlfunktion des Browsers? oder des HTML? oder des Script? oder des Servers (in diesem Falle die Firma Schlund)?

HTML ist einfach:
<form method=POST action="http://www.andrip.de/cgi-bin/bestell.pl"> usw..usw..</form>

Perl ist komplizierter (Ich bin da am stottern, da ich PERL nicht kenne, nur Prinzip "monkey see, monkey do") (wenn ich C-Windows schreiben dürfte wie beim WIN-NT-Omnicron-Server, wäre ich selig, da klappt alles am Schnürchen, aber ich muß mich mit total kryptischem PERL auf Unix bei Schlund rumschlagen)

#!/usr/bin/perl
....

$eingabe="####";
if ($ENV{REQUEST_METHOD} eq "GET") {$eingabe=$ENV{QUERY_STRING};}
else                       {read(STDIN,$eingabe,$ENV{CONTENT_LENGTH});}

(ich weiss z.b. nicht, ob $ENV{mit tüttelchen} oder ohne tüttelchen, nirgendswo beschrieben, im Internet kursieren beide Versionen als Demo-Skripts)

...

@daten=split(/&/,$eingabe);

while ($element=shift(daten))
  {und hier ist das Problem:
   Es folgen einfach keine Daten in dieser while-Schleife.....total leer
  }

(Ich unterdrücke hier den Kode, der die MAIL verschieckt sowie die HTML-Rückantwort generiert)

Wie gesagt, in 80 prozent belegt ACCESSLOG ganz brav ein abgesetztes POST, was prima mit unseren empfangenen Mails zu korrelieren ist. Aber in 20 Prozent zitiert ACCESSLOG stattdessen ein GET, obwohl die FORM ganz klar "POST" verlangt.

Ist die ein Browser-Problem (Opera??? Ich weiß leider nicht, was so in der Welt alles exisitiert)
Ist dies mal wieder ein Screw-Up von Herrn Gates mit seinen IExplorern?
Oder ist dies vom Schlund-Server generiert, der aus Langeweile einfach mal den bestell.pl-Skript ab und zu mal anklingelt?

????? WIE KANN MAN EIN GET PRODUZIERN, OBWOHL DIE FORM EIN POST VERLANGT?????

Ich bitte ganz bescheiden um HILFE!!!

(Ich will nicht verschweigen, daß ich, meiner Meinung nach, das Archiv erstmal gewissenhaft abgesucht habe, aber nichts zu diesem Thema gefunden habe!)
(Ich selber kann diese Effekte nicht produzieren, habe aber auch nur einen kleinen Teil der Arbeitsmittel zur Verfügung: Win95, IE5.xx,NETSCAPE 4.xx, kein Opera, kein Unix, keine älteren Browser, kein Outlook oder andere Wollmilchsäue von Herrn Gates.....bei mir klappt leider alles!)

Christoph R.

  1. hi!

    $eingabe="####"

    Was soll das? Rausschmeißen.

    if ($ENV{REQUEST_METHOD} eq "GET") {$eingabe=$ENV{QUERY_STRING};}
    else {read(STDIN,$eingabe,$ENV{CONTENT_LENGTH});}

    Sehr unschön, das so zu machen. Besser ist, du verwendest das Modul
    CGI, das normalerweise auch bei Schlund verfügbar sein müsste. Bsp.:
      use CGI;
      $wert1 = CGI::param('wert1');
      $wert2 = CGI::param('wert2');

    Das funktioniert sowohl mit POST als auch mit GET. Verwendungsweise
    sollte klar sein.

    Weiterhin solltest du überprüfen, ob die wichtigen Variablen gefüllt
    sind oder nicht, und evtl. eine Fehlerseite auswerfen, die erneut
    ein Forumular zum Eingeben der Daten enthält.

    (ich weiss z.b. nicht, ob $ENV{mit tüttelchen} oder ohne
    tüttelchen, nirgendswo beschrieben, im Internet kursieren beide
    Versionen als Demo-Skripts)

    Beides ist möglich. Ohne Anführungszeichen, mit ' oder mit ". Die
    Anführungszeichen wegzulassen, ist erlaubt, wenn es sich um einen
    gültigen Perl-Bezeichner handelt und sich nicht mit einer der Perl-
    Funktionen überschneidet. '-Zeichen verwendet man normalerweise, um
    sicherzugehen. "-Zeichen braucht man an der Stelle nur, um Variablen
    interpolieren zu können.

    while ($element=shift(daten)) { ... }

    Nicht gerade, der gebräuchlichste Weg, eine Schleife durchzugehen,
    außerdem fehlt vor "daten" ein @-Zeichen. Richtiger wäre:
      foreach $element (@daten)
      {
        # verarbeite $element
      }

    Oder kürzer:
      for (@daten)
      {
        # aktuelles Element steht nun in $_
      }

    ????? WIE KANN MAN EIN GET PRODUZIERN, OBWOHL DIE FORM EIN POST
    VERLANGT?????

    Direkt aufrufen zum Beispiel. Oder nach dem POST die Seite bookmarken
    und später zurückkommen. etc.

    (Ich will nicht verschweigen, daß ich, meiner Meinung nach, das
    Archiv erstmal gewissenhaft abgesucht habe, aber nichts zu diesem
    Thema gefunden habe!)

    Suche zb. nach "use CGI".

    bye, Frank!

    1. Danke, Frank, für die PROMPTE Antwort!

      hi!

      $eingabe="####"

      Was soll das? Rausschmeißen.

      -----> War Übrigbleibsel von langem Debuggen.

      if ($ENV{REQUEST_METHOD} eq "GET") {$eingabe=$ENV{QUERY_STRING};}
      else {read(STDIN,$eingabe,$ENV{CONTENT_LENGTH});}

      Sehr unschön, das so zu machen. Besser ist, du verwendest das Modul
      CGI, das normalerweise auch bei Schlund verfügbar sein müsste. Bsp.:
        use CGI;
        $wert1 = CGI::param('wert1');
        $wert2 = CGI::param('wert2');

      -------------> Gebongt, aber ich kenne halt PERL nicht, habe nie von Modulen wie "use CGI" gehört
                     (ist das sowas wie PASCAL-Use Unit?)
                     Die Hotline von Schlund ist da wenig hilfreich und hat Info über installierte Versionen,
                    Modulen usw. abgelehnt. Die Methode mit "if...else..." habe ich aus einer Demo abgekupfert.
                  Da stand nix von einem CGI-Modul

      Das funktioniert sowohl mit POST als auch mit GET. Verwendungsweise
      sollte klar sein.

      Weiterhin solltest du überprüfen, ob die wichtigen Variablen gefüllt
      sind oder nicht, und evtl. eine Fehlerseite auswerfen, die erneut
      ein Forumular zum Eingeben der Daten enthält.

      (ich weiss z.b. nicht, ob $ENV{mit tüttelchen} oder ohne
      tüttelchen, nirgendswo beschrieben, im Internet kursieren beide
      Versionen als Demo-Skripts)

      Beides ist möglich. Ohne Anführungszeichen, mit ' oder mit ". Die
      Anführungszeichen wegzulassen, ist erlaubt, wenn es sich um einen
      gültigen Perl-Bezeichner handelt und sich nicht mit einer der Perl-
      Funktionen überschneidet. '-Zeichen verwendet man normalerweise, um
      sicherzugehen. "-Zeichen braucht man an der Stelle nur, um Variablen
      interpolieren zu können.

      -------------------> Danke! Genausowas brauche ich.....habe in keinen Demo's und
                in keinem Zeitschriften-Heftl zu Perl und keinem Buch-Anhang eine
               saubere Definition der Syntax gesehen, nur immer die lakonische Anweisung
               "Perl schreibt man, wie einem der Schnabel gewachsen ist"

      while ($element=shift(daten)) { ... }

      Nicht gerade, der gebräuchlichste Weg, eine Schleife durchzugehen,
      außerdem fehlt vor "daten" ein @-Zeichen. Richtiger wäre:

      -----------> In meinem Script steht das "@".... war in der Mail irgendwie verschüttgegangen...sorry.
                  Zu "while(...)": ebenfalls abgekupfert. Ich weiß genausowenig was "shift(daten)" bedeutet
                 wie was "@daten" bedeutet.

      foreach $element (@daten)
        {
          # verarbeite $element
        }

      Oder kürzer:
        for (@daten)
        {
          # aktuelles Element steht nun in $_

      -----------------> Für mich als C-Programmierer ist "$_" so mit das kryptischste in Perl überhaupt.

      }

      ????? WIE KANN MAN EIN GET PRODUZIERN, OBWOHL DIE FORM EIN POST
      VERLANGT?????

      Direkt aufrufen zum Beispiel.

      -------------> Das wußte ich bereits....Aber welcher Kunde tippt schon brav die URL auf eine
               ".pl-Datei" hin  ins Adressfeld  ein, statt den ABSCHICK-Knopf zu drücken?.....
              Diese Fehlerquelle haben wir als zu  exotisch verworfen.

      Oder nach dem POST die Seite bookmarken
      und später zurückkommen. etc.

      ------------------->
      ----------------->
      -------------> Das hier ist der Knüller.....auf die Idee, eine Rückantwort des Servers zu bookmarken
                 muß man erstmal kommen, und die Regelung, daß die Rückantwort die gleiche URL
               bekommt wie der Perlscript (anstelle von "http://www...../temp/vorläufig/irgendeinenummer.html")
              selber, ist auch nicht ganz so offensichtlich.
             Ich habs sofort ausprobiert....Du hast Recht....Jetzt kann ich endlich Gegenmaßnahmen treffen!

      (Ich will nicht verschweigen, daß ich, meiner Meinung nach, das
      Archiv erstmal gewissenhaft abgesucht habe, aber nichts zu diesem
      Thema gefunden habe!)

      Suche zb. nach "use CGI".

      bye, Frank!

      Nochmal besten Dank!

      1. Hallo !

        -------------> Gebongt, aber ich kenne halt PERL nicht, habe nie von Modulen wie "use CGI" gehört
                       (ist das sowas wie PASCAL-Use Unit?)
                       Die Hotline von Schlund ist da wenig hilfreich und hat Info über installierte Versionen,
                      Modulen usw. abgelehnt.

        Aus der Schlund-Dokumenation: Skripte: Perl und CGI (FAQ) :
        ------------------------------------------------------
        Welche Perl-Module sind auf Ihren Servern installiert?
        Um eine Aufstellung der installierten Module
        anzusehen, können Sie diese Seite aufrufen:
        http://fettetools.de/perlmodule/perldiver.cgi
        ------------------------------------------------------

        CGI.pm ist "natürlich" auch dabei. u.a.

        Vielleicht nervt es die Leute bei Schlund ja auch, dass die Fragesteller anrufen, ohne die Dokumentation gelesen zu haben?

        Käme mir irgendwie bekannt vor. ;-)

        Gruß,
        kerki