CGIでPOSTで送受信するプログラムの作り方

このQ&Aのポイント
  • C言語でCGIを作成する際に、POSTメソッドで送受信するプログラムを統合できるか疑問に思いました。
  • 以下の2つのプログラムを1つに統合して、送受信を1つのプログラムで行うことはできないのでしょうか?
  • 回答よろしくお願いします。
回答を見る
  • ベストアンサー

CGIでPOSTで送受信するプログラムの作り方

こんにちは、C言語でCGIを作成していて疑問に思ったのですが、 POSTメソッドで送られてきたデータを解析する際には、POSTで送信するプログラムと、 POSTを受信するプログラムとに必ず分けてある様に感じられました。 これらを1つにまとめて送受信する事は出来ないのでしょうか? 例えば、以下の様なプログラムを組んだとします。 /* form.c */ #include <stdio.h> int main(void) { printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); } /*以下、受信プログラム*/ /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data; clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ printf("no contents.\n"); exit(1); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } 上記2つのプログラムを1つに統合して、 送受信を1つのプログラムで行うという事は出来ないのでしょうか? よろしくお願いします。

  • CGI
  • 回答数2
  • ありがとう数2

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

普通のCGI(Perlとかphp)では、入力フォームを返すのとフォームからのPOST(やGET)を受け取って処理するスクリプトが同一というのはよくあります。httpリクエストがどうなっているか(content bodyの有無やQueryString)で処理を分けます。 提示されたソースでも >clen = getenv("CONTENT_LENGTH"); >if(clen == NULL){ >printf("no contents.\n"); no contentsを返す代わりに、最初のソースにある「入力フォームを返す」ようにすればいいだけです。

arupaka753
質問者

お礼

ご回答ありがとうございました。 無事、解決致しました。

arupaka753
質問者

補足

ありがとうございます。無事に 動作致しました。 気が向いたらご回答頂きたいのですが、、 入力フォームにGETでの送信を追加し、 GETとPOSTを判断するする機能も追加しようと、 以下のプログラムを組みました。 /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data,*method,*qs; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); method = getenv("REQUEST_METHOD"); printf("%s\n", method); if(method == NULL){ printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("<form method=\"get\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); exit(0); } //POST else if(!strcmp(method, "POST")){ clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ exit(0); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } //GET else if(!strcmp(method, "GET")){ qs = getenv("QUERY_STRING"); printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", qs); printf("</body></html>\n"); } printf("</body></html>\n"); } こちらを動作させようとしたのですが、 上手く動作せず、(白紙のページが表示されるだけでした。) getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは? こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。 何も送信していないのに、GETと判断されているのは何故でしょうか? 重ねてのご質問で申し訳ありません。 ご迷惑でしたらお答え頂かなくても大丈夫です。

その他の回答 (1)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

POSTで送信すれば、URLのケツについてるデータも送られます(要するにGETメソッド)。 環境変数「QUERY_STRING」に入っているのでそれも取り出せばいいのです。 ただし、処理の仕方によってキーコードでデータ管理するとキー名がダブる可能性がゼロでないことに留意してください。 例:  POSTで「A=200」と送信  GETでも「A=125」と送信  となった場合キーコードAをどのように扱うかという点です。 まあ、Cには連想配列が無いのでいらぬ心配かと思いますが念のため また、メジャーブラウザでは検証済みですが、必ずこれが保証されるものではないことにもご注意ください。

arupaka753
質問者

お礼

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

関連するQ&A

  • CGIで送受信するプログラムの作り方

    入力フォームを返すのとフォームからのPOSTとGETを受け取って処理する、 同一のスクリプトを、CGI、C言語で作成致しましたが、 上手く動作していません。(白紙のページが表示されるだけでした。) getenv("REQUEST_METHOD");がNULLだった場合に本来表示されるハズのページが表示されるはずで、これが出ないという事は、getenv("REQUEST_METHOD");がNULLでなく、うまく動作していないのでは? こう考え、getenv("REQUEST_METHOD");の中身を表示させた所、GET と表示されました。 何も送信していないのに、GETと判断されているのは何故でしょうか? また、正しい動作をするプログラムをご提示頂けますと助かります。 /* form2.c */ #include <stdio.h> #include <stdlib.h> int main(void) { int len; char *clen; char *data,*method,*qs; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); method = getenv("REQUEST_METHOD"); printf("%s\n", method); if(method == NULL){ printf("Content-type: text/html\n\n"); printf("<html>\n"); printf("<head>\n"); printf("<title>form test page</title>\n"); printf("</head>\n"); printf("<body>\n"); printf("<form method=\"post\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("<form method=\"get\" action=\"form2.cgi\">\n"); printf("<input type=\"text\" name=\"fieldname\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname2\" size=\"40\"><br>\n"); printf("<input type=\"text\" name=\"fieldname3\" size=\"50\"><br>\n"); printf("<input type=\"submit\" value=\"書き込み\">\n"); printf("</form>\n"); printf("</body>\n"); printf("</html>\n"); exit(0); } //POST else if(!strcmp(method, "POST")){ clen = getenv("CONTENT_LENGTH"); if(clen == NULL){ exit(0); } len = atol(clen); data = malloc(len+1); scanf("%s",data); data[len] = '\0'; printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", data); printf("</body></html>\n"); } //GET else if(!strcmp(method, "GET")){ qs = getenv("QUERY_STRING"); printf("Content-type: text/html\n\n"); printf("<html><head></head><body>\n"); printf("%s<br>\n", qs); printf("</body></html>\n"); } printf("</body></html>\n"); } 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • C言語でCGI

    初めてC言語でCGIをやるわけではないのですが、わからないことがあるので質問させていただきます。 http://www2k.biglobe.ne.jp/~motoi/cdecgi.html このサイトを参考に話を進めさせていただきます。 まず、htmlで <HTML> <HEAD> <TITLE>テストページ</TITLE> </HEAD> <BODY BGCOLOR=#a0d0ff> <FORM METHOD="get" ACTION="test2.cgi"> <INPUT TYPE="text" NAME="fieldname" SIZE="50"><BR> <INPUT TYPE="text" NAME="fieldname2" SIZE="50"><BR> <INPUT TYPE="text" NAME="fieldname3" SIZE="50"><BR> <INPUT TYPE="submit" VALUE="書き込み"> </FORM> </BODY> </HTML> と書き、C言語で #include <stdio.h> #include <stdlib.h> #define getenv1(a) ((pdata=getenv(a)) ? pdata : "(NULL)") main() { int len; printf("Content-type: text/html\n\n"); printf("<HTML><HEAD></HEAD><BODY>\n"); printf("%s<BR>\n",getenv("QUERY_STRING")); printf("</BODY></HTML>\n"); } と書きます。 それからコンパイルを実行し、パーミッションも変更して実行を WEBサーバを作らずに実行するとファイルのダウンロードが始まります。(ファイル名はtest2.cgi) WEBサーバが無ければ文字をCGIに表示することは無理なのでしょうか? 教えてください。お願いします。

    • ベストアンサー
    • CGI
  • C言語CGIについての質問

    C言語 #include <stdio.h> main() { int chr; int flag; printf("Content-type: text/html\n\n"); printf("<HTML><BODY>\n"); printf("name.cgi<BR>\n"); flag = 0; while( flag == 0 ) { /* 渡されたデータを標準入力より取得する */ chr = getchar(); /* 渡されたデータをそのまま表示する */ putchar(chr); /* データ終了のチェック */ if( (chr == EOF) || (chr == 0x00) || (chr == '\n') ) { flag = 1; } } printf("</BODY></HTML>\n"); HTML <HTML> <BODY> <FORM METHOD="POST" ACTION="./name.cgi"> <INPUT TYPE="TEXT" NAME="Name" value="HogeHoge"> <INPUT TYPR="TEXT" NAME="ADDRESS" value="BarBar"> <INPUT TYPE="submit" VALUE="送信"> </BODY> </HTML> ただ送信するだけでなく受け取り手の人がゴミ箱と受信ボックスとで選択できるようにしたいです またその日の日日も表示できるようにしたいです どなたかご教授ください

  • サブウィンドウに値を渡して、CGIにPOSTしたい

    お世話になります。 javascript初心者です。 題名のようにPOSTした値をポップアップで確認して、CGIに渡そうとしています。 親ウィンドウのoya.htmは、 <html> <head><title>submitの確認をポップアップで確認</title> <script type="text/javascript"> <!-- function fnWinOpen() { window.open("pop_post.htm", "win", "width=150,height=20"); } //--> </script> </head> <body> <form name="Form_name"> <input type="text" name="Data" /> <input type="button" value="送信" onClick="fnWinOpen()"> </form> </body> </html> でして、 サブウィンドウのpop_post.htmは、 <html> <head><title>submitの確認をポップアップで確認</title> <script type="text/javascript"> <!-- function fnStart() { document.getElementById("SubData").value = window.opener.Form_name.Data.value; } function job( url ) { 後はこの関数を完成さればと考えている } //--> </script> </head> <body onload="fnStart()"> <form method="post" > <input type="text" id="SubData" /> <input type="button" name="sub" value="送信job" onClick="job('thanks.cgi')"> </form> </body> </html> とやっています。 サブウィンドウに値を表示させることはできました。 後は、サブウィンドウの方の job関数で、submitするにはどうすればようのでしょう? 最後に値が渡されるCGI、thanks.cgiでは、そのデータを登録させ、「ありがとうございました」を表示させるものです。 また、そもそもこの方向でうまくできますか? よろしくお願いします。

  • POSTできない

    いま、phpを勉強中です。 そこで簡単なコードを書いてテスト&トライしてますがいきなりつまずいてます… <HTML> <HEAD> <TITLE>post request</TITLE> </HEAD> <BODY> <FORM ACTION="sample.php" METHOD="POST"> 名前:<input type="text" name="myname" value=""> <input type="submit" name="cmd" value="送信"> </FORM> <?php print "入力された文字は?".$myname . "<BR>"; ?> </BODY> </HTML> これを実行し、フォームに文字を入れて送信しても画面にでてきません。"入力された文字は?"だけが表示されたままです。(送信を押すと砂時計がでるのでプログラム自体は走っていると思います) postを使う場合どこか設定をしないといけないのですか??よろしくお願いします。

    • ベストアンサー
    • PHP
  • $_POSTが、上手くできません。。

    PHP勉強中の初心者です。 簡単な教材で勉強しているのですが、何度やっても上手く行かない部分があり、質問させて頂ければと思います。 やりたい事としては、「form.html」で入力した内容を、$_POSTで「view.php」に表示をするということです。 上手くいっていない処理としては、「form.html」のフォームから文字を入力し、「view.php」で、『○○さん、こんにちは』と表示がしたいのですが、実際には、「form.html」に文字を入れて送信すると、「view.php」の全ソースがブラウザ上で、表示されてしまいます。 こちらは、どのようにすれば、『○○さん、こんにちは』という風に表示することが出来ますでしょうか?php自体の設定に問題があるのでしょうか? もしお分かりになる方がいらっしゃれば、ご教授いただけると幸いです。宜しくお願い致します。 ■form.html <HTML> <HEAD> <TITLE>テキスト送信のテスト</TITLE> <META http-equiv="Content-Type" content="text/html; charset=Shift-JIS"> </HEAD> <BODY bgcolor="#FFFFFF" text="#0000000"> <FONT size="4">テキスト送信のテスト</FONT> <FORM name="form1" method="post" action="view.php"> 名前:<BR> <INPUT type="text" name="onamae"> <BR> <INPUT type="submit" value="送信"> </FORM> </BODY> </HTML> ■view.php <html> <head> <title>PHPのテスト</title> </head> <body> <?php print $_POST["onamae"]. "さん、こんにちは"; ?> </body> </html>

    • ベストアンサー
    • PHP
  • HTMLのpost送信について

    HTMLのpost送信について 送り側で入力した文字がphpのプログラムへ送られ、 ブラウザが開いて送られた文字列が表示されるはず なのですが、HTMLファイルの送信ボタンを押しても 無反応です。どこがまちがっているいのでしょうか? 送り側プログラム ファイル名:okuri1.html <html> <head> <hitle>送り側プログラム</title><br> </head> <body> <from method="post" action="uke1.php"> <input type="text" name="a"size="20"> <br> <input type="submit" value="送信" size="20"> </form> </body> </html> 受け側プログラム ファイル名:uke1.php <?php print POST["a"]; ?>

    • ベストアンサー
    • PHP
  • PHPをはじめて1日目なので・・・

    参考書を見ながらPHPの勉強を始めていますが、本のサンプルと全く同様にコーディングしているはずなのに、良い結果が得られずバグとなります。 formとpostを使って内容を渡すという項目なのですが。 form.htmlの内容。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <form method="post" action="form1.php"> 好きな食べ物は?<input type="text" name="food1"><br> 好きな飲み物は?<input type="text" name="food2"> <input type="submit" value="送信"> </form> </body> </html> form1.phpの内容 <?php header('Content-type: text/html; charset=UTF-8'); ?> <html> <body> <?php $f1 = $_POST['food1']; $f2 = $_POST['food2']; $f1 = htmlentities( $f1, ENT_QUOTES, 'UTF-8' ); $f2 = htmlentities( $f2, ENT_QUOTES, 'UTF-8' ); echo 'あなたは「', $f1, "」が好きなんですね。<br>\n"; echo '「', $f2, "」も好きなんですね。<br>\n"; ?> </body> </html> おそらくちょっとしたことが原因でエラーが出ているのだと思いますが、まだ始めて1日目なので、どこがいけないのかさっぱりわかりません。 一体どこがおかしいのか、教えていただけますか?

    • ベストアンサー
    • PHP
  • cgiのプログラム

    前自分が質問したアカウントの管理についてなんですが、今度はそれをcgiプログラムに書き換えたいと思っています。そこで、ログインのページはできたのですが、認証できたかどうかのページがうまくいきませんでした。そこでなんですが、どう書き換えたらよいのでしょうか?? お願いします! ログインのページと認証のページのプログラムを両方書いておきます。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>ログインページ</title> </head> <body> ログインしてください。<br> 自分のアカウント名とパスワードを入力してください。<br> <form method="GET" action="http://verify.cgi"> アカウント名: <input type="text" name="an"> <br> パスワード:<input type="password" name="pw" size="15"> <input type="submit" value="ログイン"> </form> </body> </html> #!/usr/local/bin/ruby print "Content-type: text/html; charset=euc-jp\n\n" $KCODE = "e" require "CGI" cgi = CGI.new account = cgi["an"] password = cgi["pw"] hash_account = {} fo = open("accountData.txt", "r") i = 0 while(line = fo.gets) ary = line.split hash_account[ary[0]] = ary[1] i = i + 1 end fo.close account = gets.chop password = gets.chop print <<EOS <HTML> <head> <meta http-equiv="content-type" content="text/html; charset=EUC-JP"> <title>アカウント認証</title> </head> <body bgcolor="skyblue"> EOS if (hash_account[account] == password) print "ようこそ、" #{account}"さん。それではゲームを始めましょう。" elsif hash_account.has_key? account print "パスワードが間違っているようです。" else print #{account}"というアカウントはありません。" end print <<EOS </body> </html> EOS 動作環境はruby 1.8.7 (2010-01-10 patchlevel 249) [i686-linux]になります。 よろしく、お願いします。

    • ベストアンサー
    • CGI
  • 複数のフォームから送信

    複数のフォームからtextの値を送信したいのですができますか?〒番号を入力して検索ボタンをおすと住所がでてきて最後に登録をしたいです。検索だけのプログラムはできてますがフォームを二つにすると両方のsubmitが登録になります・・・ 一応自分でいろいろためしましたがだめでした。。。 html,php,javascriptです。 二つともだめでした。。。。 rei1.php ------------------------- <html> <body <form method="POST" action="1.php"> お名前:<input type="text" name="name"> <br> <br> <form method="POST" action="yubin.php"> 〒:<input type="text" name="yubin"> <input type="submit" value="検索"> <br> 住所:<input type="text" name="zyu"> <br> </form> メールアドレス:<input type="text" name="email"> <br> <input type="submit" value="登録する"> </form> </body> </html> -------------------------------------- rei2.php -------------------------------------- <html> <head> <script language="javascript"><!-- function send() { document.nform.submit(); document.nform2.submit(); document.nform3.submit(); } //--></script> </head> <body> <form name="nform" method="POST" action="1.php"> お名前:<input type="text" name="name"> <br> </form> <form name="nform2" method="POST" action="yubin.php"> 〒:<input type="text" name="yubin"> <input type="submit" value="検索"> <br> 住所:<input type="text" name="zyu"> <br> </form> <form name="nform3" method="POST" action="1.php"> メールアドレス:<input type="text" name="email"> <br> <input type="submit" value="登録する"> </form> </body> </html> ------------------------------------