Mysql 查询字符串中的Perl变量集在子例程中不可用(在某些子例程中可用!)
Perl今天击败了我,我有一个问题。我通过另一个perl脚本的链接访问perl脚本。agent.pl?agentid=40 在agent.pl脚本中,我使用以下两种不同的方式显示没有问题的查询字符串:Mysql 查询字符串中的Perl变量集在子例程中不可用(在某些子例程中可用!),mysql,perl,subroutine,Mysql,Perl,Subroutine,Perl今天击败了我,我有一个问题。我通过另一个perl脚本的链接访问perl脚本。agent.pl?agentid=40 在agent.pl脚本中,我使用以下两种不同的方式显示没有问题的查询字符串: my $thatagent = $q->param('agentid'); $form{agentid} 我在所有子例程之外的脚本的开头设置了词法变量。然后,我使用$thatagent在“default”子例程中显示代理id号,该子例程在脚本运行时显示HTML。我这里没有任何问题 $dbh
my $thatagent = $q->param('agentid');
$form{agentid}
我在所有子例程之外的脚本的开头设置了词法变量。然后,我使用$thatagent在“default”子例程中显示代理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";
及
然后问题来了,我全局调用另一个子例程(上面列出的&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;
}
我觉得我必须与我的子程序“看到”我脚本的其余部分有某种断开,但我不确定。请帮忙
提前感谢:)我猜您是在某种系统(如mod_perl)下运行此脚本的,在这种系统中,.pl文件被编译成一个根据需要调用的子例程。实际代码最终如下所示:
sub invoke_agent_pl {
...
my $thatagent = ...;
...
sub updateagent {
...
# do something with $thatagent
...
}
}
这里发生的事情是,updateagent使用的$thatagent变量并不总是与自动创建的包装器invoke\u agent\u pl设置的$thatagent变量相同
最简单的解决方法是说我们的$that代理
,而不是我的
。最好不要在脚本中使用本质上是全局变量的内容。好的,所以我添加了
my @thatagent = split(/=/,$ENV{'QUERY_STRING'});
my $thatagent = $thatagent[1];
它在整个脚本中保留了变量
我对Perl知之甚少,但这似乎很奇怪。正如我所说,在显示HTML的初始子例程(以及从HTML子例程调用的两个子例程)中,我能够使用
$form{agentid}
从这里,我将我的cgi参数读入一个没有问题的散列 声明变量后是否定义了子例程?是否涉及mod_perl?请将代码减少到再现错误所需的最小值,并发布该.PS-您的代码存在SQL注入漏洞。不是没有。我甚至不确定mod_perl是什么hehe。我只是用apache、perl和mysql在本地运行它。我尝试使用我们的ready:-(然后:显示您的apache配置,告诉它如何运行.pl文件;显示一个简化的可运行示例,演示这个问题。
$form{agentid}