0

Perl 今天打败了我,我有一个问题。我正在通过来自另一个 perl 脚本的链接访问一个 perl 脚本。agent.pl?agentid=40

在 agent.pl 脚本中,我以两种不同的方式使用显示查询字符串而没有问题:

my $thatagent = $q->param('agentid');
$form{agentid}

我在所有子程序之外的脚本的开头设置了词法变量。然后,我使用 $thatagent 在脚本运行时显示 HTML 的“默认”子例程中显示代理 ID 号。我这里没有任何问题。

$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;

}

我觉得我必须与我的子程序“看到”我的脚本的其余部分有某种脱节,但我不确定。请帮忙!

提前致谢 :)

4

2 回答 2

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。最好不要在脚本中使用本质上是全局变量的东西。

于 2013-03-06T23:40:28.807 回答
0

好的,所以我添加了

my @thatagent = split(/=/,$ENV{'QUERY_STRING'});

my $thatagent = $thatagent[1]; 

它在整个脚本中保留了变量。

我对 Perl 了解不多,但看起来很奇怪。就像我说的,在显示 HTML 的初始子程序(以及从 HTML 子程序调用的两个子程序)中,我可以使用

$form{agentid} 

从那里我没有问题地将我的 cgi 参数读入哈希。

于 2013-03-07T00:47:59.890 回答