Valentin Wirth: Informationen via Link an ein Perlscript übergeben

Hallo fleißige Poster,

Ich baue seit eingen Tagen an einem Forum (eigentlich ein Board wenn mans genau nimmt) und bin bis jetzt mit meinen Problemen auch super zurande gekommen. Jetzt ärgert mich aber es das so einfach scheint aber einfach nicht will wie ich. Also zur Frage:

Ich habe einen supernormalen Link auf ein Perlscript und übergebe dem Script irgendeine ID.

<a href="../cgi-bin/Formular.pl?Key=Webdesign">Neues Thema</a>

Nun soll mein Script das ganze auslesen, was es bis jetzt auch immer fein gemacht hat (zumindest wenn ich was über Formulare übergeben hab). Sagen wir Mal im einfachsten Fall, würde es das Übergebene einfach wieder ausgeben. In diesem Fall, gibt mein Script jedoch nichts aus.

sub InputEinlesen {
  read(STDIN, my $strData, $ENV{'CONTENT_LENGTH'});
  print "Content-type:text/html\n\n";
  print $strData;
  ### ... aufsplitten wie sonst immer (&=+...)
}

Also irgendwie muss dann wohl die Übergabe via Link anders ablaufen oder ich habe einen blöden Denkfehler nicht bedacht. Also, ich währe super Glücklich wenn eine(r) von Euch mir weiterhelfen könnte.

Es dankt euch Valentin Wirth

  1. Halihallo

    Ich habe einen supernormalen Link auf ein Perlscript und übergebe dem Script irgendeine ID.

    <a href="../cgi-bin/Formular.pl?Key=Webdesign">Neues Thema</a>

    Achtung: Das ist ein GET-Request und kein POST! - Details follow

    Nun soll mein Script das ganze auslesen, was es bis jetzt auch immer fein gemacht hat (zumindest wenn ich was über Formulare übergeben hab). Sagen wir Mal im einfachsten Fall, würde es das Übergebene einfach wieder ausgeben. In diesem Fall, gibt mein Script jedoch nichts aus.

    sub InputEinlesen {
      read(STDIN, my $strData, $ENV{'CONTENT_LENGTH'});
      print "Content-type:text/html\n\n";
      print $strData;
      ### ... aufsplitten wie sonst immer (&=+...)
    }

    Hier liest du ein POST-Request aus! - STDIN gibt's nur bei POST, $ENV{QUERY_STRING} ist das Äquivalent für GET...
    Also müsstest du hier einfach STDIN durch $ENV{QUERY_STRING} ersetzen, oder einfach beide concaten:

    my $params = $ENV{QUERY_STRING}.'&'.join('', <STDIN>);

    Aber ich würde dir zu keinem Raten:

    benutze CGI.pm!

    use CGI;

    my $cgi = new CGI;
    print 'Key ist : ' . $cgi->param('Key');

    ist tausendmal sicherer

    Viele Grüsse

    Philipp

    1. Hallo Philipp Hasenfratz,

      Herzlichen Danke ersteinmal. Dachte ich mir doch schon das es so was in der Art war. Dann zum Vorschlag mit dem CGI Modul. Ich habe gehört das die Nutzung des CGI Moduls ein Scritp erheblich verlangsamen kann. Ich weiß nicht was dran ist und in wie weit Leute das Standartmodul für solche Aufgaben verwenden. Vielleicht kann mich ja jemand aufklären (weil einfach ist es ja schon auf fertige Module zurückzugreifen)

      Valentin

      1. Halihallo

        Hallo Philipp Hasenfratz,

        Philipp würde genügen *g*

        Herzlichen Danke ersteinmal. Dachte ich mir doch schon das es so was in der Art war. Dann zum Vorschlag mit dem CGI Modul. Ich habe gehört das die Nutzung des CGI Moduls ein Scritp erheblich ver

        langsamen kann.

        so, sind 10ms "erheblich"??? - Glaub mir: es gibt schlimmeres! - Wenn's nicht um ms gehen soll, ist CGI auf jeden Fall besser...

        Ich weiß nicht was dran ist und in wie weit Leute das Standartmodul für solche Aufgaben verwenden.

        Leider zu wenige... Ich hab keine Ahnung, woran das liegt... Scheint so ne "Pseudo-Anti-CGI.pm-Kultur" zu sein, welche ich nicht unterstütze... Bestimmt hat wieder dieser Matt Wright (oder wie der heisst) damit angefangen *g*...

        Vielleicht kann mich ja jemand aufklären (weil einfach ist es ja schon auf fertige Module zurückzugreifen)

        Wenn's irgendwie geht: Auf CPAN Module zurückgreifen. Die sind nämlich (im gegensatz zu den meisten selbstgebastelten programmen) von tausenden getestet und von vielen programmiert worden...

        Viele Grüsse

        Philipp

      2. Gude Valentin,

        Herzlichen Danke ersteinmal. Dachte ich mir doch schon das es so was in der Art war. Dann zum Vorschlag mit dem CGI Modul. Ich habe gehört das die Nutzung des CGI Moduls ein Scritp erheblich verlangsamen kann.

        An der Diskussion ob es ein Skript spürbar langsamer macht, mag ich mich nicht beteiligen; auf jeden Fall macht es meine Skripte besser lesbar und sicherer.

        Ich weiß nicht was dran ist und in wie weit Leute das Standartmodul für solche Aufgaben verwenden.

        Ich kenne eigentlich niemand der ernsthaft (Perl-)CGI-Skripte ohne die Hilfe von CGI.pm entwickelt.

        Vielleicht kann mich ja jemand aufklären (weil einfach ist es ja schon auf fertige Module zurückzugreifen)

        use CGI or die;
        http://www.perlmonks.com/index.pl?node_id=51012

        ad,
        kd.

  2. &get_data;

    sub get_data {
    $data=$ENV{'QUERY_STRING'};
    @fields = split(/&/,$data);
    foreach $fields(@fields){
      ($field_name,$field_val)=split(/=/,$fields);
     $field_val=~ tr/+/ /;
     $field_val=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
     $DATA{$field_name}=$field_val;
    }
    }
    ##############################################################

    <a href="../cgi-bin/Formular.pl?Key=Webdesign">Neues Thema</a>

    Daraus folgt:

    $DATA{$Key}=Webdesign

    Gruß aus Berlin
                         Ralf

    1. &get_data;
      sub get_data {
      $data=$ENV{'QUERY_STRING'};
      @fields = split(/&/,$data);
      foreach $fields(@fields){
        ($field_name,$field_val)=split(/=/,$fields);
      $field_val=~ tr/+/ /;
      $field_val=~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
      $DATA{$field_name}=$field_val;
      }
      }
      ##############################################################

      Hm. Ich kann das in drei Zeilen:

      use CGI;
      my $cgi= new CGI;
      %DATA = $cgi->Vars;

      hehe *g*

      Was habt ihr eigentlich gegen CGI.pm?

      Viele Grüsse

      Philipp