• 締切済み

CGIでフォームデータを取得できません

CGI(perl)の標準入力についてお伺いいたします。 PC上でテストし動作を確認したCGIをプロバイダのCGIサーバに移植しましたが、 正常に実行終了するものの、標準入力によるフォームデータの取得ができません。 フォームデータを受け取る変数が空になってしまいます。 PCとプロバイダのCGIサーバとでは、CGIスクリプトの記述方法が異なるのでしょうか。 書籍、ネットをだいぶ調べましたが、解決策が見当たりませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただきたいです。 (1)PC動作環境 a.OS: Windows 7 b.ブラウザ : Interne Eexplorer 11 c.CGIサーバ: Apache 2.4 d.perl : Activeperl 5.20 (2)CGIスクリプト(標準入力の部分) 尚、フォームでは、method="POST"を指定しております。 # フォームデータの取得 if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; }

  • krik1
  • お礼率100% (3/3)
  • CGI
  • 回答数1
  • ありがとう数1

みんなの回答

  • kichi8000
  • ベストアンサー率41% (658/1580)
回答No.1

せっかくのPERL5だから、組み込み関数を使いませんか。 use utf8; #必要があれば文字コード宣言 use CGI; #htmlオブジェクトの使用宣言 $q= new CGI; #htmlオブジェクト格納 $q->~ で呼び出し $query = $q->param("status"); #記述例 htmlフォーム(submit)のname=statusタグ内データの読み出し

krik1
質問者

お礼

さっそくご回答いただき、お礼申し上げます。 use CGIは一度実行してみたのですが、もう一度試してみたいと思います。 あと環境変数%ENVの中身を調べようと思っていたところです。

関連するQ&A

  • CGI:method="post"でもGETになる

    CGIで標準入力によりフォームデータを取得できないため、環境変数%ENV内の値を 調べましたところ、入力フォーム(html)のformタグでmethod="POST"と明示しているにも 拘らず、REQUEST_METHODの値がGETになっており、POST用のCONTENT_LENGTHも GET用のQUERY_STRINGも共に空になっております。 htmlでmethod="GET"と指定した場合には、REQUEST_METHODの値は正しくGETになり QUERY_STRINGからフォームデータを取得できます。 同じCGIをPC上のApache2.4でテストした結果、REQUEST_METHODはhtmlのmethod=~で 指定した通り正しくPOSTまたはGETとなり、それぞれフォームデータを 取得できることを確認いたしております。 この点についてプロバイダに問合せいたしましたが、サポート対象外ということで、 回答を得ることができませんでした。 このような現象の原因について、お心当たりのある方がおられましたら、 ご教示いただけないでしょうか、お伺いいたします。 (1)ホスト動作環境 a.CGIサーバ:Apache b. perl 5.10系 (2)PC動作環境 a.OS: Windows 7 b.ブラウザ: Internet Eexplorer 11 c.CGIサーバ: Apache 2.4 d. Activeperl 5.20

    • 締切済み
    • CGI
  • CGI間のデータ送信について(perl)

    perlのcgiで詰まってしまったので質問します。 現在困っていることは、cgiからcgiへの変数の値の受け渡しについてです。 色々調べてやってみたのですが、うまくいきません。 送信側で print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<A href =\"sendmail.cgi?$array1[0]&$array1[1]&$array1[2]&$array1[3]\">sendmail.cgi</A>"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>"; として 受信側で # postでもgetでも受信できるようにする if ($ENV{'REQUEST_METHOD'} eq "GET") { $data = '1'; $testmsg = "GETで受信"; $formdata = $ENV{'QUERY_STRING'}; print("$formdata<BR>"); } elsif ($ENV{'REQUEST_METHOD'} eq "POST"){ # こちらを使用している $data = '2'; $testmsg = "POSTで受信"; $length = $ENV{'CONTENT_LENGTH'}; read(STDIN,$formdata,$ENV{'CONTENT_LENGTH'});# $dataに受信する print("$formdata<BR>"); } else { $data = '3'; $testmsg = "受信することができませんでした。<BR>"; } としてpostにて受信しようとしています。 postのif文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

    • 締切済み
    • CGI
  • HTML5からのフォーム入力のデータ取得について

    HTML5からのフォーム入力のデータ取得について HTML5で入力フォームを作成しました。 これをCGI(Perl)で入力データを受け取って処理をしたいと考えているのですが HTML4の時みたいに、 if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $querystring, $ENV{'CONTENT_LENGTH'}); } foreach $line (split(/&/, $querystring)){ my ($name, $value) = split(/=/, $line); } このやり方では入力項目の名前と値を取れないのでしょうか? $querystringの中身をみたら、 Content-Disposition: form-data; name="入力項目の名前" 入力した値 という文字の羅列が、入力項目分ありました。 この文字列から一つずつ項目名を拾って、値を拾って。。。 という作業をしないといけないのでしょうか? ネットで色々と探したのですが、 うまいやり方が見つからず、探し方が悪いのかもしれませんが、 どなたかデータの取得のやり方をご存じの方がいらっしゃいましたら 教えてください。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 携帯用のメールフォームのMethod

    ある、HP作成送付とを使って携帯用のメールフォーム(3機種対応)を作りましたが、既存のCGIがうまく稼動しません。 マニュアルをみると、携帯用ではMethodをPOSTではなく、GETに指定しろ。 と、有りますが、CGIのソースのどの部分を変更したらいいのか分かりません。 一応、予測してPOSTと記載されているソースを全てGET に直したのですが、旨く、稼動しません。 (「このCGIは直接稼動していません・・・」が表示される。if ($buffer eq '') ってどんな条件なんでしょうか?) 携帯用のメールフォームのCGIを配布しているサイト、もしくは下記のソースで修正すべき点をご存知の方、 教えてください!!お願いいたします。 ソース-------------------- . . . #データ入力 if ($ENV{'REQUEST_METHOD'} ne "GET") { &error('エラー','標準入力 METHOD=GET を設定してください.<br>&lt;form method=get action=........&gt;'); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); if ($buffer eq '') { &error('エラー','このCGIは直接起動されません.'); } $ref = $ENV{'HTTP_REFERER'}; $buffer2 = $ENV{'QUERY_STRING'}; if ($buffer2 ne '') { &error('エラー','標準入力 METHOD=GET に設定してください.<br>&lt;form method=get action=........&gt;'); }

    • ベストアンサー
    • CGI
  • フォーム内容が正しく取得できない

    入力画面で入力したデータを、 確認画面でHiddenに設定し、 確認OKでHiddenからの入力データを メールで送信するCGIを作成しました。 確認画面では、入力内容を正しく表示するのですが、 確認OKでメールを送信すると 同じNameの入力項目の情報を重複して表示してしまいます。 こんな感じです・・・ 【入力・確認画面】 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 【メール内容】 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 Add:住所1 Tel:999-999-999 Add:住所2 Tel:111-111-111 フォーム内容を取得するところがまずいのでしょうか・・・ 補足等致しますのでアドバイスお願いいたします。 【フォーム内容を取得】 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; }

    • ベストアンサー
    • CGI
  • 標準入力からデータが読込めない

    現在perlにてcgiを作成しています。 以下のようなcgiを作成したのですが、POSTで受取ったデータが 標準入力より取得できません。 解決策、又は、調査方法等ご存知の方いらっしゃいましたら教えてください。 --------- a.cgi -------- #!/usr/bin/perl print "Content-type: text/html\n\n"; if( $ENV{'REQUEST_METHOD'} eq "POST" ){ read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); }else{ $buffer = $ENV{'QUERY_STRING' }; } print <<"HTML"; <HTML><HEAD><TITLE>テスト</TITLE> <META http-equiv=Content-Type content="text/html;"> </HEAD> <BODY> <FORM id=Form1 name=Form1 action=a.cgi method=post> HTML print <<"HTML"; <INPUT type=hidden value=aaa name=text1> <INPUT onclick="return confirm('送信します。よろしいですか?');" type=submit value=送信 name=Button1> </FORM> </BODY> </HTML> HTML exit; -------------------------------------------------- $ENV{'REQUEST_METHOD'} は POST を取得できていますし、 $ENV{'CONTENT_LENGTH'} も文字数は取得できています。 どうか宜しくお願い致します。

    • ベストアンサー
    • Perl
  • フォームからのデータの引渡し

    <FORM method="post" action="./formmail.php"> <INPUT type="text" name="namae" size="20"> <INPUT type="text" name="tel" size="20"> : : : </FORM> というようなhtmlファイルからformmail.phpでデータを受け取る方法教えていただきたいのです。 上記HTMLファイルのINPUTタグ(入力項目)の数も自由に変更可能でnameも自由に変更した場合でも、formmail.phpは一切変更なしに対応したいのです。 例えばPerlならCGI側に if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $query_string, $ENV{'CONTENT_LENGTH'}); @a = split(/&/, $query_string); foreach $x (@a) { ($name, $value)=split(/=/, $x); $msg .= "$name:$value<BR>\n"; } } とすることにより、受け取れると思います。 PHPではどう書けばよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • htmlで呼び出したCGIの出力が文字化けする

    下記のInput.cgiというスクリプト(改行コードLF, 文字コードUTF-8) ---------------- #! /usr/bin/perl $method = $ENV{'REQUEST_METHOD'}; if ($method eq 'POST') { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } elsif ($method eq 'GET') { $buf = $ENV{'QUERY_STRING'}; } print "content-type: text/html\n\n"; print "メソッドは$methodでした。<br>\n"; print "受け取ったデータは$bufでした。\n"; ---------------- があります。これをブラウザで見ると(入力なしのまま) 「メソッドはPOSTでした。  受け取ったデータはxxxでした」 と正常に表示されます。 次に次の内容のhtml(改行はLF,文字コードはShiftJIS) ------------- <html><head> <title>FORMによるデータ転送</title></head> <body> <form method="POST" action="myInput.cgi"> <input type="text" name="text"><br> <input type=submit value="送信"> <input type=reset value="取消"> </form></body></html> -------------- をブラウザで表示させ、inputボックスに英数字(または日本語)を入力し、「送信」をクリックすると、今度はCGIスクリプト中の日本語を含めて総ての日本語出力が文字化けしてしまいます。 これが起きるのは、htmlとCGIの文字コードが異なるからでしょうか? 文字化けを止めるには何をすればよいのでしょうか? 教えて下さい。お願いいたします。

  • CGIによるアンケートフォーム

    CGIでのアンケートフォームを作るのに次のコードの○○○△△△.cgiというところには何を入れればいいのでしょうか? <FORM action="○○○△△△.cgi" method="POST">

    • ベストアンサー
    • CGI
  • javascriptを使ったフォームをCGIで取得できない

    フォームに名前、フリ仮名、性別(ラジオボタン)、生年月日(選択メニュー)があり、下記は確認ページで、javascriptを使って、表示されます。でもCGI(以下にあります)では名前のみ取得できあとの値は表示されません。どうすればよいでしょうか ---- <html lang="ja"> <head> <script type="text/javascript"><!-- function Cng(){ var st = window.opener.document.user.name.value; window.document.kuser.kname.value = st; var st1 = window.opener.document.user.furigana.value; window.document.kuser.kfurigana.value = st1; var sex=window.opener.document.all.user.sex if(sex[0].checked) {window.document.kuser.ksex.value ="男性"} else if(sex[1].checked) {window.document.kuser.ksex.value ="女性"} var st11 = window.opener.document.all.user.year.value; window.document.kuser.kyear.value = st11; var st12 = window.opener.document.all.user.month.value; window.document.kuser.kmonth.value = st12; var st13 = window.opener.document.all.user.day.value; window.document.kuser.kday.value = st13;}  //--> </script> </head> <body onLoad="Cng();"> <form name="kuser" action="./5-2.cgi" method="post" enctype="text/plain"> 氏名:    <input type="text" name="kname" value="" size="30"><br><br> ふりがな:  <input type="text" name="kfurigana" value="" size="30"><br><br> 性別:    <input type="text" name="ksex" value="" size="7"><br><br> 生年月日:   西暦 <input type="text" name="kyear" value="" size="10"> 年   <input type="text" name="kmonth" value="" size="5"> 月   <input type="text" name="kday" value="" size="5"> 日<br><br> <tr><td colspan="2" align="right">         <input type="submit" value="送信">   <input type="button" value="戻る"> ----- (CGI) #! c:/perl/bin/perl # フォームデータの取得 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; } # サーバー出力 print <<END; Content-type: text/html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head><title>ふぉーむでーた</title></head> <body> <h1>フォームデータ</h1> <table border="1"> <tr><th>フォーム要素</th><th>データ</th></tr> END foreach $key (keys %FORM){ print "<tr><th>$key</th><td>$FORM{$key}</td></tr>\n"; } print <<END; </table> </body> ---