- ベストアンサー
フォームから2つのCGIへ送信する場合
申込フォームに記入してもらい、それをCGIフォームに送る場合に、2つの別々のCGIフォームに送ることはできるのですか。 例えば以下のように書けますか <form name="kuser" action="A.cgi" & B.cgi" method="post">
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
$FORM{'hidden'}は出来るかもしれませんが止めましょう。 フォームのタグ名は用途がSUBJECTのようですのでそれに習って$FORM{'ksubject'}とでもすべきです。 また出力用のHTMLから、CGIそのものがShift-JISで書かれているようですが、フォーム受信データの処理で正規表現を利用しているため、正常に機能しない恐れが多分に有ります。環境にもよりますが、できれば元のフォームから含めてEUCで処理をするのが無難です。 ヒアドキュメント処理の部分で$T1の使いどころが変です。 メール用にJISに変換済みなので思いっきり化けるでしょう。 ヒアドキュメント処理の部分で$T1のところを、 使う使わないは別として元のフォームの内容をすべて渡すとして ------------------------------------------------ <form type="POST" name="f2" action="CGI-B.cgi"> <input type="hidden" name="kname" value="$FORM{'kname'}"> <input type="hidden" name="kmail" value="$FORM{'kmail'}"> <input type="hidden" name="ksubject" value="$FORM{'ksubject'}"> <input type="hidden" name="T1" value="$FORM{'T1'}"> <input type="hidden" name="T2" value="$FORM{'T2'}"> </form> <a href="javascript:document.f2.submit()">$FORM{'T1'}</a> ------------------------------------------------ こんな感じで書けば良いのではないでしょうか。 いらないパラメータは削るとよいでしょう。
その他の回答 (5)
- ralf124c
- ベストアンサー率52% (232/446)
この質問の本質がHTML側に重きを置いたCGIに多少関連する程度のことなので良いのですが > ヒアドキュメントの部分は以下でよいでしょうか > <form> > <input type="text" name="T2" value="$FORM{'T2'}"> > </form> >再度質問ですが、CGI-B.cgiにボタンが2つあって1つ(例えば”OK”)を押すとCGI-A.cgiにおいてT1の文字全体を別の文字に変化させるにはどうするのでしょうか こちらは明らかにHTML(DHTML)およびJavaScriptに関するまったく異なる質問です。 ずるずるとこちらでやってゆくより、別のカテゴリで質問するべきでしょう。 そうしないと同じような悩みや疑問を持っている方へのケーススタディ履歴や対応処置データベースとしての機能をはたさなくなります。 それと、できるだけトライアンドエラーで試行錯誤した状況というのをもう少し質問に反映した方が良いと思います。 ご健闘を祈ります。
お礼
いろいろ教えていただきありがとうございました。トライアンドエラーでがんばっていきます。またの質問のときはお願いします。
- ralf124c
- ベストアンサー率52% (232/446)
> 詳細に書くと > フォーム→確認(javascript)→送信(CGI) というパターンです。確認ページはjavascriptで作りました。フォームにおいて、 > 例えば、2つの項目があって1つの項目の内容だけをCGI-Aで受け取ります。もう1つの項目の内容を別のCGI-Bに送ります。 > CGI-Aを表示してから某リンク先をクリックするとCGI-Bが表示されるようにしたいのです。お分かりになりましたか。 上記の処理手順には矛盾点があります。 CGI-Aが表示された後、「某リンク」がクリックされなかった場合、CGI-Bは表示されない状態にあるわけですが、 ・項目を事前に送信する意味はあるのでしょうか? ・またそれに対する「結果」は必要ないのでしょうか?(場合によっては処理が内部で終了して結果が表示以外の方法で残された後に破棄されるプログラムもありますが、その場合はCGI-Aからのクリックで表示されるのがCGI-Bである必要性は無くまったく別のCGI-Cでもかまわないわけですよね。もっといえばCGI-Bそのものの存在意義も無くCGI-Aの内部にその処理を組み込む発想の方が普通先に来ますが・・・) 仮にCGI-Aの結果表示中はCGI-Bは待機しているということをイメージしているのならサーバ処理としては最悪の結果を招くでしょう。 CGI-Aがエンドユーザに開きまくられながらも「某リンク」がクリックされない状態が続いたらサーバはCGI-Bの待機処理であっという間にリソースがいっぱいになって処理が立ち行かなくなるでしょう。 仕組み上CGI-AとCGI-Bは別プロセスで発生し、さらにCGI-Aからのリンクで発生するCGI-Bは元のCGI-Bではなく新しいCGI-B'としてプロセスが生成処理されますのでCGI-B'は処理されて終了にこぎつけたとしても、元のCGI-Bは永遠に待機処理のままゾンビプロセスになってしまいます。 要するにこのシナリオには 「最初に呼ばれるCGI-A」 「事前に呼ばれるCGI-B」 「CGI-Aのリンクから呼ばれるCGI-B'」 と3種のCGIが登場するわけですが ・CGI-BがCGI-B'になるまでにCGI-Bはいったいどこでなにをしなければならないのかという点(「CGI-B = CGI-B'」というロジックが破綻しています→別イベントで発生する処理なので関連性を持たせられない) ・表示がCGI-B'のみで処理されるならばCGI-BはCGI-B'と同じものである必要性はまったく無いのでは ・CGI-B'が表示を行わずに処理のみで終了するならCGI-AとCGI-Bを分ける必要性がまったく無いのでは 事前にCGI-Bに関わる処理を行いたいケースは有り得ると思いますが、CGI-B'と関連付けなければいけない具体的な事例などいただけないと平行線のままだと思います。 現状の処理 FORM →+→ CGI-A +→押有 CGI-B | DATA-A | | +→押無 ??? +→ CGI-B → ??? DATA-B 普通の処理 FORM →+→ CGI-A +→押有 CGI-B DATA-A DATA-B + DATA-B > blank, targetはどういう意味ですか > document.f1.target = '_blank'; > document.f1.target = '_target'; HTML内で<form>でフォーム名「f1」に所属するフォームのターゲットをJavaScriptで指定しているだけです。 HTMLの基本ですので、<form>タグのパラメータ「target=」を参照してください。 あげあし取るようで申し訳ありませんが > document.f1.target = '_target'; ではなく document.f1.target = '_self'; です。 '_blank'は無名の窓で'_self'は自身の窓を指します。
お礼
いちぶ修正します。 >T1の中の一部の文字をクリックしたら、T2が表示されることが とありますが、 >T1の文字全体をクリックしたら、T2が表示されることが が正解です。よろしく
補足
丁寧に教えていただき感謝しております。 確かに、「CGI-Bの待機処理であっという間にリソースがいっぱいになって」の通りだと思います。 FORM →+→ CGI-A +→押有 CGI-B DATA-A DATA-B + DATA-B この方が正しいと思います。この場合、CGI の書き方ですが、 ----------------------------------- #! /usr/bin/perl require "jcode.pl"; require "mimew.pl"; $SENDMAIL = '/usr/sbin/sendmail'; # sendmailのパス $MAILTO = 'ジャストビュー<*********@ybb.ne.jp>'; # メールの宛先 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } # フォームデータの復元 foreach $pair (split(/&/, $query)) { ($key, $value) = split(/=/, $pair); # 文字のデコード $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $FORM{$key} = $value; } # MIMEエンコード $mail_to = mimeencode($MAILTO); $mail_from = mimeencode($FORM{'kname'}); $mail_subject = mimeencode($FORM{'hidden'}); # 文字コードの変換 $T1 = jcode::jis($FORM{'T1'}); $T2 = jcode::jis($FORM{'T2'}); # メールヘッダーの生成 $header = <<END; To: $mail_to From: $mail_from<$FORM{'kmail'}> Subject: $mail_subject Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP END # メールの送信 open(MAIL, "| $SENDMAIL -i -t -f $FORM{'kmail'}") or die("エラー:sendmailへのパイプが開けません"); print MAIL $header, "\n", $T1, $T2; # サーバー出力 print <<END; Content-type: text/html; charset=Shift_JIS <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>めーるふぉーむ</title></head> <body><br><br><br><br><br> <p>$T1<p> <p><center>ありがとうございました。<br> 後ほどメールを差し上げますのでお待ちください。</center> <br><br><br> <form><center><INPUT TYPE="BUTTON" VALUE="閉じる" onClick="window.close()"> </center></form> </body> </html> END ------- この中で「T1」「T2」とあるのは以前の回答の中にありましたnameです。<html>の中の書き方が分からないのですが、T1の中の一部の文字をクリックしたら、T2が表示されることが必要です。よろしくお願いいたします。
- ralf124c
- ベストアンサー率52% (232/446)
あ、今考えていてなんとなくわかりました。 普通のフォーム処理CGIの動作だったんですね。 フォーム→確認(CGI-A)→送信(CGI-B) といったパターンでしょうか? 動作としては CGI-Aの動作結果に元のフォームから受信した内容をINPUTタグのHIDDEN属性として吐き出します。 CGI-Aの結果から何らかの動作(たとえば送信ボタンなど)でCGI-Bに送信(SUBMIT)してやればよいのです。 要するにCGI-Aで隠しフォームを生成表示してやって、そのフォームからCGI-Bに送信してやるのです。 もし違ってたらごめんなさい。
補足
ralf124cさん 前のお答えで以下のようにありましたが blank, targetはどういう意味ですか document.f1.target = '_blank'; document.f1.target = '_target';
- ralf124c
- ベストアンサー率52% (232/446)
> 別窓とは「別ウインドウに表示」という意味ですか。 その通り「窓=ウインドウ」です。 > この場合、すぐ表示する必要はなく、あとでリンクしたらそのページが表示できればよいようにしたいと思っています。 どのようにしたいのかがよくわかりません。 言葉どおりに受け取ると質問とはまったく別のお話になってしまいます(質問では同時・ここでは前後別々?)。 CGIを二つ同時にリクエストするということは二つのブラウザが必要です。 もしもひとつの窓でそれを行いたいのならCGIはひとつしか呼び出せません。 後でリンクさせて表示させるなら、そのときにもう一方のCGIを実行してやればいいと思いますが・・・。 CGIにこだわらないのであれば、CGI用に製作された二つのプログラムの一方がもう一方をシステムイベントとして実行処理してやる方法も考えられますが、それならはじめから二つを組み合わせてひとつのプログラムにしとけば良いわけで・・・。 やっぱり、後付のお言葉が、質問と矛盾しているように受け取れますので、順序良く詳細をお願いします。
補足
教えていただきありがとうございます。 詳細に書くと フォーム→確認(javascript)→送信(CGI) というパターンです。確認ページはjavascriptで作りました。フォームにおいて、例えば、2つの項目があって1つの項目の内容だけをCGI-Aで受け取ります。もう1つの項目の内容を別のCGI-Bに送ります。CGI-Aを表示してから某リンク先をクリックするとCGI-Bが表示されるようにしたいのです。お分かりになりましたか。
- ralf124c
- ベストアンサー率52% (232/446)
そのような書き方は試みたことはありませんがJavaScriptを使えば簡単です。ちなみにどちらか一方は必ず別窓にしなければなりません。 サンプル------------------------------------------------ <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=euc-jp"> <title>TEST HTML 4.01 - FORM</title> </head> <script language="javascript"> <!-- function fSubmitBoth(){ document.f1.action = './test01.cgi'; document.f1.target = '_blank'; document.f1.submit(); document.f1.action = './test02.cgi'; document.f1.target = '_self'; document.f1.submit(); } //--> </script> <body> <form method="POST" name="f1"> <p><input type="text" name="T1" size="20"></p> <p><input type="text" name="T2" size="20"></p> </form> <p><input type="button" value="送信" name="B1" onclick="fSubmitBoth();"></p> </body> </html>
補足
ありがとうございました。ところでまだ初心者なので教えてください。別窓とは「別ウインドウに表示」という意味ですか。この場合、すぐ表示する必要はなく、あとでリンクしたらそのページが表示できればよいようにしたいと思っています。その場合はどうなるのですか
お礼
ご返事ありがとうございました。それで問題はCGI-B.cgiについてですが。CGI-B.cgiはCGI-A.cgiとヒアドキュメント以外はすべて同じとしてヒアドキュメントの部分をどのようにすればよいでしょうか。以下は中途半端な感じがしますが。inputとして出力したいのですが <form> <SCRIPT language="JavaScript"> <!-- document.write(javascript:window.opener.document.f2.T2.value); // --> </SCRIPT> </form>
補足
ヒアドキュメントの部分は以下でよいでしょうか <form> <input type="text" name="T2" value="$FORM{'T2'}"> </form> 再度質問ですが、CGI-B.cgiにボタンが2つあって1つ(例えば”OK”)を押すとCGI-A.cgiにおいてT1の文字全体を別の文字に変化させるにはどうするのでしょうか