Perl今天打败了我,我有一个问题。我正在通过另一个perl脚本的链接访问perl脚本。 agent.pl?agentid=40
在agent.pl脚本中,我使用以两种不同方式显示查询字符串而没有问题:
my $thatagent = $q->param('agentid');
$form{agentid}
我在所有子程序之外的脚本开头设置了词法变量。然后我使用$ thatagent在“默认”子例程中显示代理ID号,该子例程在脚本运行时显示HTML。我这里没有任何问题。
$dbh->{AutoCommit} = 0;
my $q = CGI->new;
my $thatagent = $q->param('agentid');
my %form = $q->Vars;
if (! $q->param("savebtn")) {
&ViewAgent();
exit;
}
&UpdateAgent();
我从viewagent子例程调用两个子例程,并在select语句中使用$ form {agentid}也没有问题。
my $sth = $dbh->prepare("select a.name, a.paidcommission, a.paidreferral, paddy.address1, paddy.address2, paddy.city, paddy.state, paddy.zipcode, maddy.address1, maddy.address2, maddy.city, maddy.state, maddy.zipcode, bc.name, bc.phonenumber, bc.phoneext, bc.phonenumber2, bc.phoneext2, bc.fax, bc.email, sc.name, sc.phonenumber, sc.phoneext, sc.phonenumber2, sc.phoneext2, sc.fax, sc.email from agent a inner join entity e on entityid = agentid inner join address paddy on paddy.addressid = physicaladdressid inner join address maddy on maddy.addressid = mailingaddressid inner join contact bc on bc.contactid = billingcontactid inner join contact sc on sc.contactid = salescontactid where a.agentid = $form{agentid};") or die "prepare statement failed: $DBI::errstr\n";
和
my $sth = $dbh->prepare("select agentid, note, createdt, createuser from agentnote where agentid = $form{agentid};") or die "prepare statement failed: $DBI::errstr\n";
然后出现了问题,我在全局调用另一个子例程(上面列出的& updateagent)并尝试使用$ thatagent但它失败了。如果我对一个数字进行硬编码,那就可以了。
sub UpdateAgent {
my $sth = $dbh->prepare("UPDATE agent SET name=?, paidcommission=?, paidreferral=? WHERE agentid=?;") or die "prepare statement failed: $DBI::errstr\n";
$sth->execute($form{'name'}, $form{'paidcommission'}, $form{'paidreferral'}, $thatagent) or die "prepare statement failed: $DBI::errstr\n";
$sth->finish;
}
我觉得我必须与我的子程序“看到”我的其余部分有一些脱节,但我不确定。请帮忙!
提前致谢:)
答案 0 :(得分:2)
我猜你是在某种系统下运行这个脚本,例如mod_perl,其中.pl文件被编译成一个根据需要调用的子程序。实际代码最终看起来像这样:
sub invoke_agent_pl {
...
my $thatagent = ...;
...
sub updateagent {
...
# do something with $thatagent
...
}
}
这里发生的事情是updateagent使用的$ thatagent变量并不总是与自动创建的包装器invoke_agent_pl设置的$ thatagent变量相同。
最简单的解决方法是说our $thatagent
,而不是my
。更好的是不要在脚本中使用本质上全局变量。
答案 1 :(得分:0)
好的,所以我添加了
my @thatagent = split(/=/,$ENV{'QUERY_STRING'});
my $thatagent = $thatagent[1];
并且它在整个脚本中保留了变量。
我不太了解Perl,但是看起来很奇怪的男人。就像我说的,在初始子程序中显示HTML(以及从HTML子程序调用的两个子程序)我能够使用
$form{agentid}
从那里我将我的cgi参数读入哈希而没有问题。