0

今日は Perl に打ちのめされました。質問があります。別の perl スクリプトからのリンクを介して perl スクリプトにアクセスしています。agent.pl?agentid=40

agent.pl スクリプトでは、次の 2 つの方法でクエリ文字列を問題なく表示しています。

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 サブルーチンから 2 つのサブルーチンを呼び出し、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

.pl ファイルが必要に応じて呼び出されるサブルーチンにコンパイルされる mod_perl などのシステムでこのスクリプトを実行していると思います。実際のコードは次のようになります。

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

OK、追加しました

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

my $thatagent = $thatagent[1]; 

スクリプト全体で変数を保持しました。

私はPerlについて詳しくは知りませんが、奇妙に思える人です。私が言ったように、HTMLを表示する最初のサブルーチン(およびHTMLサブルーチンから呼び出された2つのサブルーチン)で、私は使用することができました

$form{agentid} 

ここから、cgiパラメータを問題なくハッシュに読み込みました。

于 2013-03-07T00:47:59.890 に答える