CGIからCGIを呼べる?

[上に] [前に] [次に]
おとぼけん 2000/01/18(火) 17:51:36
HTML画面からCGIを呼んで画面のフォーム内容をチェックします。
チェックして判定した内容を、次の画面に表示したいのですが、次の画面がフレームなのです。

上と下にフレームが分かれていて、
上にチェックした判定結果を表示。
下に別のHTMLを表示したいのです。

値の継承の仕方が想像つかないので、とりあえずまたCGIとか呼べばいいのかなとかそんな程度しか頭が回りません。
何かよい方法がありましたらアドバイス願いたいのですが〜
よろしくお願いします。

andi 2000/01/18(火) 18:20:15
フレームもCGIで作成するとか、
テンポラリファイルを作成する方法はどうでしょうか。

EMI 2000/01/18(火) 18:25:34
CGIで次のようなフレームセットを書き出したらどうでしょうか?
#ちなみに、フレーム使ったことないので適当です。
#必要に応じて属性やNOFRAMES要素を補ってください。

<frameset>
  <frame name="result" href="result.cgi?data1=xxx%26data2=xxx">
  <frame name="html" href="other.html">
</frameset>

だいたい、こんな感じでOKだと思います。
ちなみに、%26はデータを区切るための"&"記号です。
確か、こう表記しなきゃならないはずだと思ったけど、&amp;でもよかったかもしれない。
ちなみに、&と生で記述するのはNGです。

ふじ 2000/01/18(火) 19:19:31
> href="result.cgi?data1=xxx%26data2=xxx"
こうすると、 & がデータの区切りでなくて、データとして渡りますけど。

大抵のCGIは、まず & で split して、各要素を = で split しますから、
data1 の値として xxx&data2 か xxx&data2=xxx が渡ることになります。
# PHP3 で試したら xxx&data2=xxx が data1 の値として出ました。

ついでに、href ではなくて src ですので、
src="result.cgi?data1=xxx&amp;data2=xxx"
こうですね。

EMI 2000/01/18(火) 19:25:58
>ふじさん
おっと、修正どうもです。
hrefはかなり間違ってる気がしたんですが、やっぱり間違ってましたか。(^^;)

おとぼけん 2000/01/18(火) 21:03:06
うわああ皆さん有り難うございます!!
なるほど。なるほど。そうすればいいんですね。
何と無く解ってきました。
申し訳ないのですが、私は初心者なものでどうもCGIに渡す引数の渡し方がいまいち理解しておりません。

src="result.cgi?data1=xxx&amp;data2=xxx"

というのは

<frameset>
  <frame name="result" src="result.cgi?data1=xxx&amp;data2=xxx">
  <frame name="html" href="other.html">
</frameset>

ということでしょうか?

また、

xxx&amp;data2=xxx

の xxxってなんですか?

アホな質問ですいません。。。

よろしくお願いします!

EMI 2000/01/18(火) 21:14:59
>src="result.cgi?data1=xxx&amp;data2=xxx"
>
>というのは

><frameset>
>  <frame name="result" src="result.cgi?data1=xxx&amp;data2=xxx">
>  <frame name="html" href="other.html">
></frameset>
そうです。
いや、もっと言うとこうです。

<frameset>
  <frame name="result" src="result.cgi?data1=xxx&amp;data2=xxx">
  <frame name="html" src="other.html">
</frameset>

上にも書いたとおり、これでは実際の使用には不十分なので、適宜必要な属性とNOFRAMES要素を補ってください。

>xxx&amp;data2=xxx
>
>の xxxってなんですか?

data1・data2というのは、cgiに渡すデータの名前で、xxxはそのデータの内容です。
要するに、最初のcgiから次のcgiに渡したいデータを記述してください。

おとぼけん 2000/01/18(火) 21:21:48
あああ!なるほど!
アホな質問に丁寧にお答えいただきまして本当に有り難うございます。
何とお礼を申したら良いか。。。(涙)

もうひとつよろしいですか?
CGI側では引数はどうやったら取れるのでしょうか?
すいません甘えてばっかりで。。。

よろしくお願いします。

EMI 2000/01/18(火) 21:39:03
Perlならば、$ENV{'QUERY_STRING'}の中に"data1=xxx&data2=xxx"の形式で入ってます。(&amp;じゃないことに注意)
これを、適当にデコードして使ってください。

参考:http://www.tohoho-web.com/wwwcgi3.htm

おとぼけん 2000/01/18(火) 21:49:32
[[解決]]
EMIさん有り難うございました!!
頑張ってやってみます〜
本当に有り難うございます!!
いやほんとうに嬉しいっす〜ううう

おとぼけん 2000/01/21(金) 18:25:18
解決済みの所に再投稿してしまいました。ううう
CGI(perl)から引数を渡したのですが、なぜか受け取れません。。。
多分私のやり方が悪いのだと思うのですがあああ

$value="nph_test.cgi?d1=$aaa&amp;d2=$bbb&amp;d3=$ccc&amp;d4=$ddd";

print "Content-type: text/html\n\n";
print "<HTML>\n";
print "<FRAMESET rows=\"20%,80%\">\n";
print " <FRAME src=\"$value\" target=\"_self\" name=\"frame1\">\n";
print " <FRAME src=\"../hoge.html\" name=\"frame2\">\n";
print "</FRAMESET>\n";
print "<BODY>\n";
print "</BODY>\n";
print "</HTML>\n";

とかいて、受け取り側で

#!/usr/local/bin/perl
#print "HTTP/1.0 200 OK\n\n";
print "Content-type: text/html\n\n";

#パラメタデータ読み込み
read(STDIN,$buffer,$ENV{'QUERY_STRING'});
#パラメタを配列に格納
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($Data1,$Data2) = split(/=/,$pair);
#受信したデータをデコードする。
$Data1 =~ tr/+/ /;
$Data1 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
$Data2 =~ tr/+/ /;
$Data2 =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C",hex($1))/eg;
if($Data1 eq "d1"){
$aa=$Data2;
}
if($Data1 eq "d2"){
$bb=$Data2;
}
if($Data1 eq "d3"){
$cc=$Data2;
}
if($Data1 eq "d4"){
$dd=$Data2;
}

}

としているのですが、
何が悪いのかずっと考えてるのですがわからないんです。。。

すいません。
申し訳ないのですが、ご指導願いたいのですが。

よろしくお願いします。

ふじ 2000/01/21(金) 18:52:38
> nph_test.cgi?d1=$aaa&amp;d2=$bbb&amp;d3=$ccc&amp;d4=$ddd

こんな風にURLにデータを含めてCGIを起動した場合、
CGIでデータを受け取るには、標準入力から読むのではなくて
環境変数 QUERY_STRING を参照します。

>read(STDIN,$buffer,$ENV{'QUERY_STRING'});
これを、
$buffer = $ENV{'QUERY_STRING'};

に変えればデータが受け取れると思いますが。

EMI 2000/01/21(金) 18:55:59
まず、
>print "Content-type: text/html\n\n";
>print "<HTML>\n";
>print "<FRAMESET rows=\"20%,80%\">\n";
>print " <FRAME src=\"$value\" target=\"_self\"
>name=\"frame1\">\n";
>print " <FRAME src=\"../hoge.html\" name=\"frame2\">\n";
>print "</FRAMESET>\n";
>print "<BODY>\n";
>print "</BODY>\n";
>print "</HTML>\n";
というのは間違ってます。次のようにしてください。
print "Content-type: text/html\n\n";
print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">";
print "<HTML>\n";
print "<TITLE>出力結果</TITLE>";
print "<FRAMESET rows=\"20%,80%\">\n";
print " <FRAME src=\"$value\" target=\"_self\" name=\"frame1\">\n";
print " <FRAME src=\"../hoge.html\" name=\"frame2\">\n";
print " <NOFRAMES>";
print "  <BODY>";
print "   フレーム対応のとか何とか。";
print "  </BODY>";
print " </NOFRAMES>";
print "</FRAMESET>\n";
print "</HTML>\n";

後、出力側のCGIはそれで終わりですか?
printがありませんが‥‥‥

おとぼけん 2000/01/21(金) 19:33:17
うわあああできました!なんと一気に解決。。。
なるほどお。私は標準出力で呼んでいたのですね!

ふじさんEMIさんのご親切に心から感謝いたします。

EMIさん。

>後、出力側のCGIはそれで終わりですか?
>printがありませんが‥‥‥

はい。ただでさえ長いコードを書いてしまったのでprintの所は、はぶかせていただきました。お気遣い有り難うございます。

またまたアホな質問してもよろしいでしょうか?

print "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\">";

ってなんでしょう?

ううう無知ですいません〜

EMI [E-Mail] 2000/01/21(金) 19:48:19
これは、HTMLのDOCTYPE宣言というやつです。
あまり、細かく書くとまた叩かれそうなので、解説は避けますが、
フレーム定義のHTML文書は、必ずこれではじめなければならないことになっています。

EMI 2000/01/21(金) 19:53:09
なんか、細かい解説を避けたおかげで、よけいに混乱を招きそうな文になったなぁ。
フレーム内文書との整合性的に心配だ。

とりあえず、俺的にはとほほさん他の意見には賛成できないので、
詳しく知りたかったらメールでお願いします。

[上に] [前に] [次に]