• ベストアンサー

CGI1からCGI2への変数の受け渡しと表示

他のご質問読んでもわからなくて笑 CGIの知識は、書いてあるとおりに設定を変えたりhtmlとか書き出すところの内容変えたり…いらないところに#を付けて、うごくかなぁってドキドキしている程度です(笑)わかりにく。 今回は、まず、キリ番のCGI-Aがあります。そのCGI-Aはキリ番GETしたら登録formが出てきます。登録があったらメールが管理人宛てにくるんです、その時、変数で、フォームで書いてもらった内容+その人の取ったカウント数・時間・エージェント・HOSTが、一緒に記載されてきます。 CGIではこんな感じ↓ print MAIL "時間 : $adate\n"; print MAIL "ホスト: $ahost\n"; print MAIL "使用PC: $kuag\n"; print MAIL "名前 : $aname\n"; print MAIL "カウント : $acount\n"; print MAIL "メール: $email\n"; ってちゃんと送られてきます。 で、この変数なんですが、同ディレクトリにあるメールフォームのCGI-Bに渡して(CGI-Aで登録したら必ずCGI-Bにくると)、CGI-Bが送るメールにも乗せたいのです。CGI-Bのなかのメールの雛型?の部分に ここです↓ #メール内容 $body.="取得時間 : $adate\n"; $body.="ホスト : $ahost\n"; $body.="使用PC : $auag\n"; $body.="メール : $email\n"; $body.="内容 : $nowdate\n"; 内容ってのはCGI-Bのメールフォームに書いてもらったことを表示します。でその上の4つなんですが、それがCGI-Aの変数で、これをCGI-Bのメールに一緒に送らせたいわけです。 そこで、CGI-Aの変数をCGI-Bに持ってくるにはどうするか、素人なりに考えて #キリ番からの情報取得 require "./CGI-A.cgi"; とか考えて書いてみて、やったんですが、見事に失敗しました。どうすれば変数だけをわたせますか?教えてください。 不適切な表現とかありましたら勘弁してください。 補足など、待ってます。

  • t-d-s
  • お礼率60% (102/170)
  • CGI
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.4

#2です >ごめんなさい・・・わかるようでまったくわかりません(笑) のようですので、ピンとくるところがなかったようですね。 それにプログラムの修正個所を完全に書いた訳ではないでの コピペしても全く動かないです。 で、別の方法です。 質問者さんのしたいことは、  従来のcgi-aの処理のあと(メールを送った後)  cgi-bでやっているメール送信も行いたい。 ですよね。 cgi-bの中で、実際にメールを送っている処理部分はどこか解りますか? その部分をcgi-aに継ぎ足すのはどうでしょう。 当然、送る内容は変数から作っていますから これにcgi-aの変数をコピーするなり、新たに値を設定してください。  すなわち  $body.="取得時間 : $adate\n";  $body.="ホスト : $ahost\n";  $body.="使用PC : $auag\n";  $body.="メール : $email\n";  $body.="内容 : $nowdate\n";  の、$adateや、$ahostなどの変数のこと。 cgi-aに継ぎ足す際に、メールを送る処理以外を含めると 正しく動作しない可能性が高いです。 ですから、「この1行は何をしている?」がある程度 理解できないとやっぱり難しいです。

t-d-s
質問者

お礼

すいませんでした。 ありがとうございました。

その他の回答 (3)

  • feininger
  • ベストアンサー率41% (74/180)
回答No.3

既に回答はでていますが、ちょっと趣向を変えて・・・ メインルーチンとサブルーチンを別ファイルとして分けるPerlの手法。 (その他、設定ルーチンと処理ルーチンという分け方もありかな?) [main.plファイル] require './sub.pl'; $str = 'abc'; &disp; exit; [sub.plファイル] return(1); #1を返す位置がミソ sub disp { print $str; return; }

t-d-s
質問者

補足

ごめんなさい、 100%わかりません笑い

  • bikkuri
  • ベストアンサー率33% (23/68)
回答No.2

#1さんのでかなり正解に近い気がします。 あたかも、cgi-b側のフォームから値が設定されたようにQUERY_STRINGに 設定すれば、cgi-b側の変更は最小限でできます。 しかし、ちょっと考慮すべきことがあって、知らない人では少々難しいです。 (ほんのちょっとしたことですが) で、別の方法です。 requireでcgi-bを実行することを考えると、変数とその値はそのまま使えますから、 cgi-a側は $renraku_flag=1; $auag = $kuag; $nowdate = "内容の文字" #他同じ名前の変数は改めてする必要なし require "./CGI-B.cgi"; とします。 cgi-b側では、フォームのデータを読むところで if($renraku_flag == 0) {  従来のフォームデータを読む処理  (ここに、$adate = xxxといった処理がくるはず) } とすれば、$renraku_flag=1の時はフォームから 読まずに、渡ってきた変数をそのまま処理するようにできるはずです。 ただし、requireで行うと フォーム関係以外でもcgi-aとcgi-bで同じ変数名を使っている場合、 cgi-bにとって、本来初期値と違った値で処理が始まりますので、 結構まずいところがあるかも。

t-d-s
質問者

補足

ごめんなさい・・・わかるようでまったくわかりません(笑) $nowdateってのはCGI-Bのアンケートフォームの内容を表示する変数で、それをCGI-Aに書くのは何ででしょうか? ついでに、CGI-AのフォームとCGI-Bのフォームは全く別物で、Aの場合はそのフォームはCGIで出力?されるのに対してCGI-Bのフォームは別にb-foam.htmlというのを作っときます。です。はい。requireでAにBを読み込んで、あってるのでしょうか、というか、俺の説明へたくそ… Aの変数をBに渡して、BはAの変数の結果と一緒にB-foam.htmlのデータをメールでおくってくれる・・・う~ん、説明が難しい(笑)すいません、劇初心者で・・・(ノ_・。) とりあえず、それ、コピペして書いて動かしてみます。 で、 $nowdate = "内容の文字" #他同じ名前の変数は改めてする必要なし って、なんすか?"内容の文字"とは・・・

  • yanagya
  • ベストアンサー率37% (31/83)
回答No.1

ちょっとご質問の意味がよく分かりませんが、cgi_aで一定の条件を満たした場合、その情報をつかってcgi_bを呼び出せば良いのですよね? #cgi_a $ENV{'QUERY_STRING'} = " $adate = $adate_a ・・・ require "./CGI-B.cgi"; って感じで、環境変数にセットして渡せは良いのではないですか? 私もあまり詳しくないのですが・・・

t-d-s
質問者

補足

>cgi_aで一定の条件を満たした場合、その情報をつかってcgi_bを呼び出せば良いのですよね? 呼び出すって言うか・・・cgi-Bのメールフォームに書いてもらって送信するときにCGI-Aのその情報を一緒にCGI-Bから送ってほしいという。Aに行ったら必ずBにくるようにしてあるんで。変数は確実にわたるかなって・・・ むりなんですかね・・・

関連するQ&A

  • a.cgi → b.cgiへデータの受渡し方法

    a.cgi → b.cgiへデータの受渡しを行いたいのですが i-modeのHPで,画面入力させた内容を a.cgi → b.cgiに受け渡す方法を教えて下さい。 例?:a.cgiに下記のコーディングでは無理ですよね・・・ $aa=$FORM{'aa'}; print "Location: http:・・・・・i/b.cgi?a=$aa\n\n";

    • ベストアンサー
    • Perl
  • JavaScriptの変数にCGIの出力を入れたい。

    呼ばれると文字"a"を出力するhttp://xxx/ret_a.cgiがあるとします。 JavaScriptの中で変数hogeに、このhttp://xxx/ret_a.cgiの出力を格納するにはどうしたらよいですか? http://xxx/ret_a.cgiの内容は以下のようなかんじです。 ------------------- ここから ------------------- #!/usr/local/bin/ruby puts "Content-Type:text/html\n\n" puts "<html>\n" puts "<head><title>test1</title></head>\n" puts "<body>\n" puts "a" puts "</body></html>\n" ------------------- ここまで ------------------- puts "a"だけだと、500 Internal Server Errorになってしまうので、 上記のようにしました。

  • perl で環境変数を表示できない

    perlの初心者です。下記のCGIを実行しましたが、全く表示しません。 最初の「環境変数」と言う文字も表示しません。 どこか初歩的なエラーがあると思いますが、わかりませんので質問させていただきます。 --- #!/usr/local/bin/perl print "Content-type: text/html", "\n\n"; print "<HTML><BODY>", "\n"; print "<H1>環境変数</H1><HR>", "\n"; foreach my $key( keys %ENV ){ print "$key: $ENV{$key}<BR>", "\n"; } print "<HR>", "\n"; print "</BODY></HTML>", "\n";

    • ベストアンサー
    • Perl
  • 変数が表示されない。

    HTMLフォームからgetで、phpに変数を渡し、それを表示させるだけなのですが、なぜか変数部分だけが表示できません。どなたかご教授お願いいたします。 XAMPP2.5.8をXP上で使用しています。 <送信側HTMLフォーム> <html> <body> <form action=/cgi-bin/sample.php method="get"> 今は西暦<input type=text name=yyyy>年 <input type=submit value="送信"> </form> </body> </html> <受信側PHPファイル> <?php print "今年は西暦" . $_GET['yyyy'] . "年\n"; ?> $_GET[$yyyy]な風にもしてみましたがダメでした。 php.iniのregister_globalはonにし、$_GET[]を利用しない方法で print "今年は西暦" . $yyyy . "年\n"; と試してみても結果は同じでした。 あまりに基本的なこと過ぎて恥ずかしい話ですが、よろしくお願いします。

    • ベストアンサー
    • PHP
  • CGIのメールフォームの送信完了部分に変数を

    CGIのメールフォームを使用しているのですが、 アフィリエイトのようなシステム?を導入するため、 送信した人を判別する為に、 送信完了ページにフォームの内容(メールアドレス)を変数として 設定させるにはどのようにしたらよいでしょうか? 現在メールフォームで使用しているのは、CGI RESCUEさんのフォームメール(WebFORM)です。 やりたいことは、具体的には、送信完了ページに <img src="https://sample.com/contract.php? num=1&order=××× &aid=0000&corp=sampleID" width="1" height="1"> ※order=×××に、フォームで送信した内容のメールアドレス等が 入るようにしたい のような、IMGタグとして解析を設定するように、といわれたのですが サービスを提供している企業が全くサポートしていないので… メールフォームのCGI自体の、送信完了ページに設定してテストしてみたのですが、うまくいきません。 試したことは例をあげますと、 open (IMG, "$https://sample.com/contract.php? num=1&order=××× &aid=0000&corp=sampleID"); print "Content-type: image/gif\n\n"; print <IMG>; close(IMG); 等です。 CGIに全く詳しくないため、問題外なのはわかっているのですが、 どなたかご教授いただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • CGI
  • 変数の受け渡し

    アップローダのスクリプトにダウンロードパスをつけようと日々頑張っているのですが、なかなかうまく出来ません。 例.No1をダウンロードしたい場合 一覧ページからNo.1の記事を選択       ↓ No.1をダウンロードするためのパス入力画面       ↓ No.1ダウンロードページ 上記のようにしたいのですが、 記事表示CGIからパスワードCGIへ変数を渡そうとしていますがなかなかうまくいきません。 ***記事表示CGIのパスワード入力画面*** <form action="パスワードCGIのパス" method="POST"> <input type=hidden name=No value="$no"> <input type=password name=pass size=10> <input type=submit value="認証"> ***パスワードCGIでの条件分岐*** if ($in{'pass'} ne $loginpass) { print "認証画面に戻って再度パスワードを入力して下さい\n"; } print "Location: 記事表示CGIのダウンロードページ&kno=$no\n\n"; exit; としているのですが、変数$noをパスワードCGIの方で取得できません。 CGIは最近弄り始めたばかりなのでぜんぜん分からなくて…。 そもそも <input type=hidden name=No value="$no"> でパスワードCGIの方に$noが送られているのでしょうか? 送られているのでしたら$noの取得方法を教えていただけないでしょうか。 よろしくお願いします。 P.S.拙い文章の為、分かりにくいところなどがありましたら質問してください。 分かる限りはお答えしたいと思います。

    • ベストアンサー
    • CGI
  • CGIスクリプトの結果が表示しない

    windows2000 proffesinal sp.4でActivePerl5.8.8..819・・・・、Apache2.054の環境で"10日で覚えるPerlCGI"を使用。IEバージョンは5でページを「表示できません」のエラーがときたまでる。 上記環境でApacheは正常に動作。TeraPad使用。CGIスクリプト1-2.cgiとして作成。 #! C:/perl/bin/perl # CGIヘッダーの出力 print "Content-type: text/html\n\n"; print "<DOCTYPE HTML PUBLIC \n-//W3C//DTD HTML4.01//EN\">\n"; print "<html>\n"; print "<head><title>Hello HTML</title></head>\n";# htmlの出力 print "<body><p>こんにちわ。これはHTML文書の例です。</p></body>\n"; print "</html>\n"; 上記スクリプトを1-2.cgiとしてApaghe2-htdocs-tendaysに保存 IEのURLに:: http://127.0.0.1/tendays/1-2.cgiと入力・・・そして下記の表示が出ました。 #! C:/perl/bin/perl# CGIヘッダーの出力print "Content-type: text/html\n\n";# htmlの出力print "\n"print こんにちわ。これはHTML文書の例です。 \n";print" "; 原因を教えてください。windows7 64bit でもこのようにスクリプトだけが表示されたことがあり(perl,Apacheのバージョンも最近のものを使用)その時は、相談室にお世話になりながら自分の 未熟さにあきれお尋ねしなかったのですが、最後HTML5を習えばのお答えで、今。参考書を買って人通り見たのですが、フォームメールや掲示板はやはり裏でCGIが動作しているので。また古いパソコンで始めたのでしたが最初からつまずきました。doreamweaber もあるのですが、能力がないのに 人様の作成したフりーソフトをスクリプトの意味が分からず貼り付けるのはいささか情けないかなと 考えています。最終的にはそうなると思っていますが、できればsendmailを使用したCGIスクリプトとかんがえています,が。とりあえず一歩一歩づつと思っています。10年以上前に作成したホームページをアップしっぱなしです。メールが送信できません。当時のプロバイダーがocnでその時提供されたもので裏でCGIが動いているなんて知りませんでした。今biglobeです。 自分の作りかけのホームページのURLは http://www7b.biglobe.ne.jo/~asunarohei/indexhei.htmlです。メールのスクリプトを貼り付けたいのです。それと掲示板をリンクさせたいです。 わからないことだらけで、ご迷惑かけますがよろしくお願いします。

  • CGIでテキストボックスの内容によって条件分岐

    CGI超初心者です。 htmlファイルに設置したテキストボックスの値によって CGIで表示させる内容を変えたいです。 ネットで検索してコードを作成してみたのですが うまくいきません。 どのように修正すればいいのでしょうか? test.html---------------------------------------- <FORM action="test.cgi" method="POST"> 変数を入力 <INPUT type="text" name="hen"> <INPUT TYPE="submit" VALUE="送り"> </FORM> ------------------------------------------------- test.cgi----------------------------------------- #!/usr/local/bin/perl $h = $FORM{'hen'}; print "Content-Type: text/html; charset=Shift_JIS\n\n"; print "<html>\n"; print "<head><title>サンプル</title></head>\n"; print "<body>\n"; if ($h > 50) { print "<p>変数hの内容は50より大きいです。</p>\n"; } else { print "<p>変数hの内容は50より小さいです。</p>\n"; } print "</body>\n"; print "</html>\n"; exit; ------------------------------------------------- テキストボックスに、50以上の数字を入力しても、50以下の数字を入力しても どちらも 「変数hの内容は50より小さいです。」 と表示されてしまいます。 よろしくお願いいたします! ※ 前回の質問(http://okwave.jp/qa/q8179935.html) より、CGIは使わない方向で検討中ですが CGIに途中まで足をつっこんでしまい、 気になったので質問させていただきました。

    • ベストアンサー
    • CGI
  • CGIのカスタマイズについて

    ネットレスキューさんの簡易データベースについて search.cgiの表示部分でテーブルを一つずつ生成させようと思ったのですがエラーが出ます。 どこが悪いのでしょうか? ----------ここから------- foreach $data (@NEW) { ($d,$DATE,$PREF,$NAME,$EMAIL,$HURL,$AGE,$HANDLE,$REM) = split(/\,/,$data); print "<table width="450" border="0" cellspacing="0" cellpadding="0" class="p12_16">\n"; print "<tr>\n"; print "<td colspan="2" bgcolor="#CC0033" height="14"><font color="#FFFFFF">● $NAME</font></td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td width="70">地域</td>\n"; print "<td width="380">$PREF</td>\n"; print "</tr>\n"; print "<tr>\n"; print "<td height="14">Eメール</td>\n"; print "<td><a href=\"mailto:$EMAIL\">$EMAIL</a></td>\n"; print "</tr>\n"; ---中略---- print "<td height="14">内容</td>\n"; print "<td>$REM</td>\n"; print "</tr>\n"; print "</table>\n"; if ($next_num ne '') { while (($key,$val) = each %FORM2) { if ($key ne 'FF') { $buf = "$buf&$key=$val"; } } print "<h3>↓<a href=\"search.cgi?$buf&FF=$next_num\">次の$page件</a></h3>\n"; } } print "</body></html>\n\n"; exit; --------------ここまで----- splitの扱い方が良く分っていません。 御存知の方御指導下さいませ。

    • ベストアンサー
    • CGI
  • cgiの変数をhdmlに渡すことはできますか?

    hdmlコンテンツを作成しているのですが、hdmlのファイル#1からgosubでcgiのファイル*1に行き、printをつかってhdmlのファイル#2を表示しています。そのファイル#2にcgiのファイル*1で処理した変数を渡し、再びcgiのファイル*1に行きたいのですが、うまく行きません。 このような処理は不可能でしょうか? 下記のソースの$s1,$s2の部分が処理した変数になります。 print "Content-type:text/x-hdml;charset=Shift_JIS\n\n"; print <<"EOT"; <HDML VERSION="3.0" PUBLIC="TRUE"> <display name="test"> 進む <action type=accept task=gosub dest=*1.cgi label=進む method=post postdata=s1=$s1&s2=$s2> </display> </HDML> EOT

    • 締切済み
    • CGI

専門家に質問してみよう