Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查询字符串中的Perl变量集在子例程中不可用(在某些子例程中可用!)_Mysql_Perl_Subroutine - Fatal编程技术网

Mysql 查询字符串中的Perl变量集在子例程中不可用(在某些子例程中可用!)

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

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

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

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}