我有两个Perl文件:action.pl
,另一个是test.pl
action.pl
有一个表单:
print $cgi->header, <<html;
<form action="test.pl" method="post">
html
while (my @row = $sth->fetchrow)
{
print $cgi->header, <<html;
ID:<input name="pid" value="@row[0]" readonly="true"/><br/>
Name: <input name="pname" value="@row[1]"/><br/>
Description : <input name="pdescription" value="@row[2]"/><br/>
Unit Price :<input name="punitprice" value="@row[3]"/><br/>
html
}
print $cgi->header, <<html
<input type="submit" value="update Row">
</form>
html
我应该在test.pl
写什么才能访问用户提交的表单值?
换句话说,Perl中的PHP $_POST['pid']
等同于什么?
答案 0 :(得分:5)
使用CGI和param()
use CGI ':standard';
my $id = param('id');
答案 1 :(得分:5)
use CGI;
my $cgi = CGI->new();
for my $p ($cgi->param) { # loop through all form inputs
my $val = $cgi->param($p); # get param's value
# ...
}
要获取'pid'输入的值,请使用:
$cgi->param('pid');
更新: 测试脚本可能如下所示:
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
my $cgi = CGI->new();
printf "%sPid:%s", $cgi->header, $cgi->param('pid');
答案 2 :(得分:2)
首先,您应该开启warnings。如果你这样做了,你会注意到你应该使用$row[1]
,$row[2]
...来访问@row
的各个元素。 @row[0]
创建单个元素数组切片。
其次,通过使用HTML::Template这样的模板模块,您可以从逻辑分离中获益。将while
循环与heredoc混合在一起会产生无法读取的代码。
您可以使用CGI表单处理包访问传递给脚本的参数值。现在,我更倾向于使用CGI::Simple而不是CGI.pm,因为CGI::Simple
具有更加默认的默认值,并且没有CGI.pm
附带的HTML生成行李。
use strict; use warnings;
use CGI::Simple;
my $cgi = CGI::Simple->new;
my $pname = $cgi->param('pname');
最后,请记住,即使在表单中将其指定为readonly
,您仍需要验证“pid”。我还建议使用CGI::Application为各种操作提供处理程序,而不是为每个操作提供不同的脚本。
这是一个简单的例子:
#!perl
use strict; use warnings;
use CGI::Simple;
use HTML::Template;
my $cgi = CGI::Simple->new;
# For demo purposes only. I would use CGI::Application
$cgi->param ? process_form($cgi) : show_form($cgi);
sub process_form {
my ($cgi) = @_;
print $cgi->header('text/plain'),
sprintf("%s : %s\n",
$cgi->param('pid'),
$cgi->param('pname'),
)
;
return;
}
sub show_form {
my ($cgi) = @_;
my $tmpl = HTML::Template->new(scalarref => template() );
$tmpl->param(
PRODUCTS => [
{ PID => '1234', PNAME => 'Widget' },
{ PID => '4321', PNAME => 'Wombat' },
]
);
print $cgi->header, $tmpl->output;
return;
}
sub template {
return \ <<EO_TMPL;
<!DOCTYPE HTML>
<html><head><title>Test</title></head>
<body>
<TMPL_LOOP PRODUCTS>
<form method="POST">
<p><input name="pid" readonly="1" value="<TMPL_VAR PID>">
<input name="pname" value="<TMPL_VAR PNAME>"><input
type="submit" value="Update"></p></form>
</TMPL_LOOP>
</body>
</html>
EO_TMPL
}
答案 3 :(得分:0)
从CGI.pm作为替代。
FETCHING THE PARAMETER LIST AS A HASH:
use CGI;
my $params = $q->Vars;
print $params->{'address'};
my @foo = split("\0",$params->{'foo'});
my %params = $q->Vars;