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

このQ&Aのポイント
  • CGIで送受信するプログラムの作り方について説明します。
  • フォームの入力とPOST、GETの受け取り方を解説します。
  • C言語で作成する際の注意点や問題の解決方法を紹介します。
回答を見る
  • ベストアンサー

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
  • 回答数2
  • ありがとう数2

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

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

たびたびすいません。 URLが空でないかぎりと書きましたがCGIを呼び出すからには空というのはありえないので、要するにURL情報にドメインやらパスやらCGIファイル名なんか入れてCGIを呼び出すと、リクエストメソッドはGETまたはPOSTのいずれかの値をとり、デフォルトではGETとなるのでした。 フォームタグで通常、「method="????"」でメソッドタイプを指定するのですが、省略されてsubmitされたり、直でCGI呼び出しがあったりすると、Webサーバ側では自動的にGETメソッドと判断されます。 正しい動作の例って //GET else if(!strcmp(method, "GET")){  qs = getenv("QUERY_STRING");  printf("Content-type: text/html\n\n");  if(strlen(qs) > 0){   printf("<html><head></head><body>\n");   printf("%s<br>\n", qs);   printf("</body></html>\n");  }else{   printf("<html><head></head><body>\n");   printf("%s<br>\n", "パラメータが無いよ。");   printf("</body></html>\n");  } } こんな感じ?

arupaka753
質問者

お礼

ご丁寧なご回答ありがとうございました。 解決しました。

その他の回答 (1)

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

POSTでなく、URLが空でないかぎり、REQUEST_METHODはGETになってしまいます。 REQUEST_METHODがGETで、なおかつQUERY_STRINGが空のとき、なにもないと判定するといいと思います。

arupaka753
質問者

お礼

ありがとうございます!

関連するQ&A

  • 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
  • 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
  • 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
  • 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> ただ送信するだけでなく受け取り手の人がゴミ箱と受信ボックスとで選択できるようにしたいです またその日の日日も表示できるようにしたいです どなたかご教授ください

  • Perlがサーバー上でうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n; print "まずい$in{'form2'}\n; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。

    • ベストアンサー
    • Perl
  • 1つのsubmitボタンで2つのCGIを呼び出すことは可能ですか?

    今は、htmlで <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> </head> <body> <form action="abc.cgi" method="get"> 以下省略 <input type="submit" value="送信"> </form> <form action="xyz.cgi" method="get"> 以下省略 <input type="submit" value="受信"> </form> </body> </html> という感じで書き、2つのボタンで個々に2つのCGIを呼び出していますが、 これをメールの送受信のように、1つのボタンで2つのCGIを呼び出すことは可能なのでしょうか。 教えてください。お願いいたします。

    • ベストアンサー
    • CGI
  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • 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
  • パスワードはどこですか?

    自分でパスワードを決めると思うのですが、さっぱりです。どこに書けばいいのか教えてください 知識がある方にとっては簡単だと思いますがどうぞよろしくお願いします。 #▼入室フォーム###### sub FM{ print "Content-type: text/html\n\n"; print "<html><head><title>$TITLE</title></head><body><form method=post action=$ADMIN_CGI><input type=hidden name=M value=C>管理室<hr>\n"; print " 管理者ID<BR><input name=ID'' size=8><BR> パスワード<BR><input name=PASS'' size=8><BR> <input type=submit value=入室>\n"; print "</form></body></html>\n"; exit; }

    • ベストアンサー
    • CGI
  • サニタイジング

    <html&> <head> <meta http-equiv="content-type" content="text/html;CHARSET=UTF-8" /> <form action="radio.php" method="get"> <br><br>好きな動物は?<br> <input type="radio" name="animal" value="犬">犬 <input type="radio" name="animal" value="猫">猫 <br><br><input type="submit"> </form> これおサニタイジングするとなるとどういった文でできるでしょうか?

    • ベストアンサー
    • PHP