当方法为POST时,如何使用嵌入的HTML表单数据?
我有一个学校作业。我们需要使用POST方法将数据从嵌入式HTML表单传递到Perl脚本。然后,Perl将遍历数据并将其显示回用户 我使用了一个单独的文件和GET方法,但我的导师说我必须嵌入HTML并使用POST。但是信息不再存储在环境变量中 是否有一个内置变量可用于访问此信息当方法为POST时,如何使用嵌入的HTML表单数据?,html,forms,perl,post,get,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{'REQU
#!/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)
#/usr/bin/perl-w
打印“内容类型:text/html\n\n”;
$qstring=$ENV{'QUERY_STRING'};
$rmethod=$ENV{'REQUEST_METHOD'};
如果($rmethod eq“GET”){
&displayform();
}
elsif($rmethod eq“POST”){
@pairs=拆分(/&/,$qstring);
foreach(@pairs){
($key,$value)=拆分(/=/);
$value=~tr/+/;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,十六进制($1))/eg;
$form{$key}=$value;
}
打印“学生调查”\n;
打印“\n”;
&displayInfo();
打印“\n”;
}
打印“\n”;
}
子显示信息{
打印“全名:”,$form{“person”},
”;
打印“收藏夹:”,$form{“sport”},“
”;
打印“最喜爱的课程:”,$form{“Course”},
”;
打印“GPA:”,$form{“GPA”},“
”;
}
子显示窗体{
打印qq(表格在这里)
有人在教你非常糟糕的做法。我不知道你的示例代码是否遵循了学校提供的示例,或者你是否是从互联网上的糟糕示例拼凑而成的-但无论如何,此代码使用的技术已经过时了二十年
2017年关于教授CGI编程的智慧有一场完整的辩论(关于一些更好的方法的简要讨论,请参见),但我们忽略这一点,假设CGI是一个好主意
如果您正在编写一个CGI程序,那么您应该使用这个库,它是标准Perl发行版的一部分已经有二十多年了(它最近被删除了,但是您的学校使用这种最新版本的可能性很小)
使用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是一个糟糕的想法
其他几点:
- 始终
和使用严格的
使用警告
- shebang上的
于2000年被-w
淘汰使用警告
- 自从1994年Perl5发布以来,在子例程调用上使用
是没有必要的&
更新:只需将答案添加到原始问题中。没错,在POST请求中,
QUERY\u STRING
环境变量中不再提供参数数据-您需要从STDIN
读取它。这是CGI.pm的许多优点之一-您使用相同的方法(param()
子例程)访问GET和POST参数。考虑到这是学校作业,您需要付出大量的努力。请更新您的问题,以显示新方法,显示您在a中面临的具体问题。我认为我的问题存在于测试后的环境变量中ing我一直无法找到一种方法来提取表单元素。到目前为止,我的脚本都是经过编辑显示的。使用20世纪最后十年的货运文化代码来代替。此外,如果这是他们教给你的,请要求退款。我假设你应该使用严格的和使用警告,并缩进你的代码正确吗?我已经整理了你展示的Perl,这样我就可以阅读它了,很明显它甚至不会编译。我们不是来整理你的垃圾代码的。如果你写的东西不好,我当然不会帮你修改。@Borodin:我只是看看。谢谢,我已经完成了作业是的,这门课程是基于一位教授,他在15年前写的,从未改变过任何东西。