WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:CGIからCGIの呼び出し

0:[投稿] はこ [2003/12/24 10:26 ][環境:WinXP SP1、IE6 WinXP SP1、Apache Ver.2.0.47]

いつもお世話になってます。

HTMLページにCGI(1)を呼び出すリンクをはって、CGI(1)から
HTMLを出力するCGI(2)を呼び出すことは可能でしょうか?
このときCGI(1)はHTMLを出力しません。

単純にCGI(1)からCGI(2)を呼び出してもエラー:500に
なってしまいます。

よい方法をご存知の方がいらっしゃいましたらご教授ください。
よろしくお願いします。


1:[回答] kak [2003/12/24 11:48 ]

ども。

CGI(1)からCGI(2)へlocationさせればどうですかね??

まあ、その際はJavaScriptを使用するのでHTML出力をすることになりますがね。


2:[回答] はこ [2003/12/24 12:18 ]

kakさん

ご回答ありがとうございます。

実はその方法も考えたのですが、そうすると空のHTMLページを
1つ余分に読み込むことになりますよね。
その手間を省きたいなと思いまして、質問させていただきました。

やっぱり1度で済ます方法はないのでしょうか。。。


3:[回答] kak [2003/12/24 15:07 ]

ども。

え〜空HTMLも嫌だとると
CGI(1)で行っている処理を
CGI(2)で行えないのでしょうか??

CGI(1)を関数化するなりして。

locationも使えないとなるとそれくらいじゃないですかね。

ちなみにCGIはPerlですか??


4:[回答] はこ [2003/12/24 15:15 ]

kakさん

何度もありがとうございます。

そうですね。
たぶんきっとCGI(1)とCGI(2)で同じことをする関数を作るのが
一番簡単ですよね。
ただそれだとどちらかを変更した場合、もう一方にも全く同じ
修正を行わなければならないのが難点。。。

こちらの環境はこんな感じです。

OS:WinXP SP1
Webサーバ:Apache Ver.2.0.47
CGI:C言語
ブラウザ:IE6


5:[回答] kak [2003/12/24 15:24 ]

ども。

CでCGIですか〜。
やったことないですね(笑)

えっと、CGI(1)でどんなことやってるか
分からないから想像でしか話せないんですが、

CGI(1)とCGI(2)を二つ作るとかじゃなくて
共通処理は共通処理で関数化できないのですかね?
CGI(1)CGI(2)で似たような処理を
2つともにいれて仕変がおこり2つとも手を入れなければならない
なんてはっきり言ってナンセンスですからね。

はこさんの書いていることを読んだ限りでは特にCGI(1)と
CGI(2)は同じことはしてないですよね?
CGI(1)でやったことの結果みたいなものをCGI(2)で
表示させているものだと思っていますが。
違ったらすみませんが。
そのためCGI(1)をそのまま関数化して
CGI(2)のなかでそのモジュールを呼び出して使えればと
思い回答しました。

こんな感じです。


6:[回答] はこ [2003/12/24 15:38 ]

kakさん

たびたびありがとうございます。
ロクに説明もせずに相談に乗っていただいて申し訳ありません。

これは2分割されたフレームページでして。
その中のあるボタンをクリックすると、そのフレーム内で設定
した内容をテキストファイルに保存したあと、テキスト
ファイルの内容を読み込んでもう一方のフレームを更新させよう
としています。

テキストファイルへの保存部分をCGI(1)で処理し、テキスト
ファイルを読み込んでもう一方のフレームを更新という処理を
CGI(2)でやろうとしていたのですが、CGI(2)の方は最初に
ページが読み込まれた時に実行するCGIを使いまわそうと
しています。

というわけで、CGI(2)でCGI(1)の役割のテキストファイルへの
保存という処理を行う関数を呼び出してしまうと、最初にページ
を表示する時に使いまわせなくなってしまうと思い、新たに
CGI(1)を作成しようとしました。


7:[回答] kak [2003/12/24 16:14 ]

ども。

CGI(2)の方に渡すパラメータで
制御できないですかね?
テキストファイルへの保存を行うときと
行わないときでCGI(2)に渡すパラメータを変えて
制御とか。

そうなると多分現時点のソースからかなりかけ離れて
修正も多くなると思うのですが。

あとは今のところいい案が浮かばないですね。
すみませんです。

他にいい案をお持ちの方がいらっしゃったらよろしくお願いします。


8:[回答] AC [2003/12/25 20:31 ]

ちょっと理解がしにくかったので、整理をします。もしこの理解で正しくなければ、
ご指摘下さい。

このページではフレームA,フレームBという2つのフレームを切っているとします。
初期状態では、フレームAに入力欄があります。また、フレームBには、
CGI(2)が呼び出されています。
このフレームAの内容をsubmitしたとき、フレームBの中身が更新されます。
フレームAは更新されません。
言い換えれば、フレームAのform要素には、フレームBへのtarget属性が
設定されているということです。
フレームAのform要素のaction属性は、CGI(1)のURLになっています。
submitにより、フレームBにCGI(1)が呼び出されることになります。
CGI(1)はテキストファイルへの書き込み処理を行った後、CGI(2)を
出力。

以上の条件であれば、最も簡単なのは、CGI(1)からCGI(2)へリダイレクトすること。
ただし、>>1のやり方とは異なり、HTTPヘッダでLocationを吐く。HTMLは吐かない。
#include <stdio.h>
int main(void) {
..ファイル書き込み処理..
puts("Status: 303 See Other");
puts("Location: <CGI(2)のURL>");
return 0;
}

そういう方法でなく、あくまでCGI(1)からCGI(2)を呼び出すことにこだわるのであれば、
パイプを利用できるのであれば、パイプを利用する。
使っている処理系によっては、popenという関数があるかもしれない。

パイプが無理なら、system関数を使って一時ファイルに書き出して、
fopenで開いて出力する方法を取ることになる(効率が悪いですが)。

>>0は何をしてエラーが出ているのか書いていないが、おそらく
直接system関数を呼んで失敗しているものと予想。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World