当方法是POST时,如何使用嵌入的HTML表单数据?

时间:2017-06-13 00:09:37

标签: html forms perl post get

我有一份上学的任务。我们需要使用POST方法将数据从嵌入的HTML表单传递到Perl脚本。然后,Perl将遍历数据并将其显示回用户。

我使用的是单独的文件和GET方法,但我的导师说我必须嵌入HTML并使用POST。但是信息不再存储在环境变量中。

是否有可用于访问此信息的内置变量?

#!/usr/bin/perl -w

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

$qstring = $ENV{'QUERY_STRING'};
$rmethod = $ENV{'REQUEST_METHOD'};

if ( $rmethod eq "GET" ) {
    &displayform();
}
elsif ( $rmethod eq "POST" ) {

    @pairs = split(/&/, $qstring);

    foreach (@pairs) {
        ($key, $value) = split(/=/);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $form{$key} = $value;
    }

    print "<html><head><title>Student Survey</title></head>\n";
    print "<body>\n";

    &displayInfo();

    print "</body></html>\n";
}

print "</body></html>\n";
}

sub displayInfo {
    print "Full Name:",        $form{"person"}, "<br>";
    print "Favourite:",        $form{"sport"},  "<br>";
    print "Favourite Course:", $form{"course"}, "<br>";
    print "GPA:",              $form{"gpa"},    "<br>";
}

sub displayform {
    print qq~ (FORM GOES HERE)

1 个答案:

答案 0 :(得分:3)

有人教你非常糟糕的做法。我不知道您的示例代码是否遵循您学校提供的示例,或者您是否从互联网上的不良示例中将它拼凑在一起 - 但不管怎样,此代码使用的技术已经过时了20年。

关于2017年CGI编程教学的智慧,有一个充分的争论(参见CGI::Alternatives对一些更好的方法的简要讨论)但是让我们忽略它并假设CGI在这里是一个好主意。 / p>

如果您正在编写CGI程序,那么您应该使用已成为标准Perl发行版一部分的CGI.pm库超过二十年(最近已将其删除,但您的学校使用的可能性很高)这个最新的版本很小。)

使用CGI.pm的标准CGI程序如下所示:

#!/user/bin/env perl

use strict;
use warnings;
use CGI qw[header param]; # Load the two functions we're going to use

# Display the content-type header
print header;

# See if we have been passed parameters.
if (param) {
  # Display the parameters
  # Note: I've ignored HTML here. You shouldn't
  print 'Name: ', param('person');
  print 'Sport: ', param('sport');
  # etc... 
} else {
  # Display the form
  ...
}

我在示例中忽略了HTML,因为在Perl代码中嵌入HTML是一个糟糕的主意。使用模板系统更好(我推荐Template Toolkit)。

其他几点:

  • 始终use strictuse warnings
  • Shebang上的
  • -w于2000年被use warnings淘汰。
  • 自1994年Perl 5发布以来,在子程序调用中使用&是不必要的。

我知道你不知道更好,你只是按照老师的要求去做。但是,在学校里教授这种过时的做法真是令人沮丧。

更新:只是为原始问题添加答案。您是正确的,在POST请求中,QUERY_STRING环境变量中的参数数据不再可用 - 您需要从STDIN读取它。这是CGI.pm的众多优点之一 - 您使用相同的方法(param()子例程)来访问GET和POST参数。