• 締切済み

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

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.3

formタグの位置の問題では無く、渡したい値をaタグで記述しているからPOSTで空が渡ります。 なぜ、aタグで書かれているのでしょう? HTMLのformタグの使い方をちゃんと理解しましょう。 送信側は以下のようなプログラムにするとPOSTで送信されます。 print "<form action = \"sendmail.cgi\" method=\"post\">"; print "<input type=\"hidden\" name=\"key0\" value=\"$array1[0]\">"; print "<input type=\"hidden\" name=\"key1\" value=\"$array1[1]\">"; print "<input type=\"hidden\" name=\"key2\" value=\"$array1[2]\">"; print "<input type=\"hidden\" name=\"key3\" value=\"$array1[3]\">"; print "<input type=\"submit\" value=\" ボタンです。 \">"; print "</form>";

kmwrod
質問者

補足

返信ありがとうございます。 こちらのコードを試してみましたが、ダメでした。 受信側にも問題があるのでしょうか?

  • okmotokun
  • ベストアンサー率59% (92/155)
回答No.2

> としてpostにて受信しようとしています。 質問どおりのコードなら、$formdata に次のデータが入るはずですけど・・・ %20%83%7B%83%5E%83%93%82%C5%82%B7%81B%81%40 (Shift_JISの場合)

kmwrod
質問者

補足

返信ありがとうございます。 受信側のコードも書いておきます。 表示しようとしたのですが、空白でした。 #------------------------------------------------------------------------ # time関数で現在年月日を取得 #------------------------------------------------------------------------ # time関数で得られた数値をlocaltime関数で整形し、各変数に入れる ($sec,$min,$hour,$mday,$mon,$year,$wno) = localtime(time); # 曜日は 0~6の値が返されるので配列で扱う @wdays = ('SUN','MON','TUE','WED','THU','FRI','SAT'); # 返された値をさらにsprintf関数で整形し、書式を読みやすいようにする。 $year = $year + 1900; $mon = $mon + 1; $nitizi = sprintf("%04d/%02d/%02d(%s) %02d:%02d",$year,$mon,$mday,$wdays[$wno],$hour,$min); $array1[0] = 'あいうえお';# 変数の内容を表示するコードは成功、つまり、変数の中身が空 $array1[1] = 'かきくけこ';# 変数の内容を表示するコードは成功、つまり、変数の中身が空 $array1[2] = 'さしすせそ';# 変数の内容を表示するコードは成功、つまり、変数の中身が空 $array1[3] = 'たちつてと';# 変数の内容を表示するコードは成功、つまり、変数の中身が空 $array1[4] = $formdata;# 受信データを入れてみる、入らなかったら0になるはず。。←何も入らない #------------------------------------------------------------------------ # ※メールは2通送らないといけない。 #------------------------------------------------------------------------ $sendmail = '/usr/sbin/sendmail'; # sendmailコマンドパス $from = ''; # 送信元メールアドレス $to = ''; # 宛先メールアドレス $cc = ''; # CCの宛先メールアドレス $subject = 'jjj'; # メールの件名 &jcode::convert(\$subject,'jis'); # タイトル文字をJISコード変換する $msg = <<"_TEXT_"; # メールの本文(ヒアドキュメントで変数に代入)ここからヒアドキュメント↓ テスト:$data $testmsg データの長さ:$length :○○(要データ受信)$array1[0]@ :XXXXXX(要データ受信)$array1[1]@@ :XXXXXXXXXX(要データ受信)$array1[2]@@@ :XXXXXXXXX(要データ受信)$array1[3]@@@@ $formdata $array1[4]@@@@@ _TEXT_ # sendmailコマンド起動(一時封印) open(SDML, "| $sendmail -t -i") || die 'sendmail error'; # メールヘッダ出力 print SDML "From:$from\n"; print SDML "To:$to\n"; print SDML "cc:$cc\n"; print SDML "Subject:$subject\n"; print SDML "Content-Transfer-Encoding:7bit\n"; print SDML "Content-Type:text/plain\n\n"; # メール本文出力 print SDML "$msg"; # sendmail コマンド閉じる close(SDML); # 次のページへ移動する処理追加 print "<meta http-equiv=\"refresh\" content=\"0;">"; &footer;#footer呼び出し #------------------------------------------------------------------------ sub header{ #my $title = $_[0]; $title = "メール送信画面"; print "Content-type: text/html\n\n"; print <<"_EOM_"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang="ja"> <head> <META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=Shift_JIS"> <META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css"> <title>$title</title> </head> <body> _EOM_ } #------------------------------------------------------------------------ sub footer{ print <<"_EOM_"; </body> </html> _EOM_ }

  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.1

送信側のHTMLで<form>から</form>の間にPOSTするパラメータが何も書かれていないので受け取れないのだと思います。 <input type="text" name="hoge" value="hoge"> とか <input type="hidden" name="hoge" value="hoge"> といった形で、送信したい値をセットしましょう。

kmwrod
質問者

お礼

回答ありがとうございます。やってみます。

kmwrod
質問者

補足

すみません、うまくいかなかったです。 試しに<forrm>の位置をプログラムの上部に移動させてみたのですが・・・・

関連するQ&A

  • perl cgiの変数の受け渡しができません。3

    http://okwave.jp/qa/q7451675.html すみません、3回目の質問です。 相変わらず変数の値がうまく渡りません。 3つのページ(ファイル)に分かれていまして a 入力ページ b 入力確認ページ c メール送信ページ の構成になっています。 a,入力ページが print $q->start_html(-title=>"*****", -BGCOLOR=>'#ffffff'), #$q->p('Content-type: text/html\n\n'), #$q->header(-charset=>"Shift_JIS"), $q->p('<body bgcollor="#ffffff" text="#000000" link="#0000ff" vlink="#ff00ff">'), $q->p('<FONT color="blue">****FONT>'), $q->hr, $q->p('<form method="post" action="***.cgi">'),# 送信ボタンで送信するデータここから $q->p('<FONT color="blue">【***】</FONT>'), $q->p('<INPUT TYPE="text" NAME="name" VALUE="" SIZE="25" MAXLENGTH="25">'), $q->p('<FONT color="blue">【***】</FONT>'), $q->p('<INPUT TYPE="text" NAME="menberno" VALUE="" SIZE="25" MAXLENGTH="25">'), $q->p('<FONT color="blue">【***】</FONT>'), $q->p('<select name="question" size="1" multiple="multiple">'), $q->p('<option selected="selected" value="aaa">aaa?</option>'), $q->p('<option selected="selected" value="bbb">bbb?</option>'), $q->p('<option selected="selected" value="ccc">ccc?</option>'), $q->p('</select>'), $q->br, $q->p('<FONT color="blue">【****】</FONT>'), $q->p('<INPUT TYPE="text" NAME="ans" VALUE="" SIZE="25" MAXLENGTH="25">'), $q->p('<input type=submit value="送信">'), $q->p('</form>'),# 送信データここまで $q->hr, $q->end_html; となっています。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー b.入力確認ページが $formdata = "最初は空っぽ"; print "$formdata<BR>"; if ($ENV{'REQUEST_METHOD'} eq "GET") {# GETでの受信 $formdata = $ENV{'QUERY_STRING'}; print "Get=$formdata"; } else {# POSTでの受信 read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'}); print "POST=$formdata"; } print "$formdata<BR>";#ここも空っぽ・・・・ #################################################################################### # 表示部 #################################################################################### #print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"******", -BGCOLOR=>'#ffffff'), $q->p('<meta http-equiv="content-type" content=text/hetm; charset=Shift_JIS>'), $q->p('<form method="post" action="mail.cgi" value=$formdata>'),# 送信ボタンで送信するデータここから $q->p('<FONT color="red">'), $q->p('***'), $q->p('***'), $q->p('</FONT>'), $q->p('***********'), $q->hr, $q->p('<input type=submit value="****">'), $q->p('</form>'),# 送信データここまで ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー となっていますが、受信したはずのデータが空っぽのようなのです。 何も表示されません。 色々調べてみたのですが、よくわかりませんでした。 教えて頂きたいです。

    • ベストアンサー
    • CGI
  • 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でのデータ受信

    すみません、これで最後にします・・・ http://okwave.jp/qa/q7445617.html 結局getによるデータ受信の方もできませんでした。 やはりPOSTに戻ってやってみると、$ENV{'CONTENT_LENGTH'}の値は入っています。 文字の長さが入っているということは、文字列が入っているだろうということなので、 後は文字を読み込むだけのはずです。 となると read(STDIN, $alldata, $ENV{'CONTENT_LENGTH'}); このコードが間違っているのでしょうか?

    • ベストアンサー
    • CGI
  • $.postとPerlのデータ受け渡しについて

    現在、 $.postを使ってPerlにリクエストを送り、帰ってきた値を表示するという事をしたいのですが、Internal Serverエラーとなりますが、どこにエラーがあるのかがわからない状態です。 実行権限などは与えています。 以下に書いたプログラムを貼りますので、間違いがありましたら是非教えていただきたいです。 HTML index.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Test Page</title> <script type="text/javascript" src="../lib/jquery/jquery-1.3.2.js"></script> <script type="text/javascript" src="./JS/test.js"></script> </head> <body> <form id="form01"> <input type="text" name="title" id="title01" value="post"><br> <input type="button" value="post" onClick="getValue()"> </form> <div id="res_title"></div> </body> </html> JavaScript test.js function getValue(){ //フォームのデータ取得 var pos_title = $('#title01').attr('value'); //var comment = $('#comment').attr('value'); //フォームデータのPOST送信+コールバック $.post("./cgi-bin/post.pl", {"title" : pos_title}, disp); } function disp(data){ $('div#res_title').html(data); } Perl post.pl #!/usr/bin/perl -w use strict; use warnings; my $formdata; if ($ENV{'REQUEST_METHOD'} eq "GET") { $formdata = $ENV{'QUERY_STRING'}; } else { read(STDIN, $formdata, $ENV{'CONTENT_LENGTH'}); } return $formdata;

  • 標準入力からデータが読込めない

    現在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
  • perlでpostが受け取れない

    perlでCGI を作ってみましたが、POSTでデータが受け取れません。GETは問題ないのですが。read stdin が NULL になります。 ローカルのapache2でテストしています。$ENV{'CONTENT_LENGTH'}がゼロのためだと 思いますが対応が分かりません。 OS:CENTOS6 (VirtualBox) APACHE2.2 Perl 5.10 /var/www/cgi-bin で実行。 呼び出しは <form action='localhost/cgi-bin/uptag.cgi' method='post'"> です。

    • 締切済み
    • CGI
  • PerlでCGIを制作している初学者です。

    PerlでCGIを制作している初学者です。 画像付きのアンケートを作ろうとしているのですが、 その際のページの切り替えがうまくいきません。 普通に1ページに、ボタンやフォームを配置したアンケートは作れるのですが、 自身が作りたいのは、紙芝居のごとく、 1ページ目に画像とアンケートの選択肢であるチェックボックスがあり、 チェックボックス入力後に回答を押すと同時に、配列へチェックボックスの答えを格納し、 2ページ目のアンケートへ移るというものです。 1ページ目や2ページ目のhtmlファイルならびにcgiファイルは用意できているのですが、 1ページ目の返答ボタンをおした際の処理の記述がわかりません。 例えば、 1ページ目 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <META http-equiv="Content-Style-Type" content="text/css"> <TITLE></TITLE> </HEAD> <BODY> <CENTER> <img src="sample.jpg" alt="01" width=800px height=600px> <FORM method="POST" action="post.cgi"><BR> <INPUT type="radio" name="answer" value="010" checked>complete mismatch  <INPUT type="radio" name="answer" value="011">mismatch  <INPUT type="radio" name="answer" value="012">neutral  <INPUT type="radio" name="answer" value="013">match  <INPUT type="radio" name="answer" value="014">complete match  <BR> <BR> <INPUT type="submit" name="submit" value=" SEND "> <BR> </FORM> </CENTER> </BODY> </HTML> と記述し、 post.cgi #!/perl/bin/perl print "Content-type: text/html\n"; print "\n"; read(STDIN, $data, $ENV{'CONTENT_LENGTH'}); print "REQUEST_METHOD : $ENV{'REQUEST_METHOD'}<br>\n"; print "CONTENT_LENGTH : $ENV{'CONTENT_LENGTH'}<br>\n"; print "DATA : $data<br>\n"; としたとき、 1ページ目でsample.jpgについての意見をラジオボタンで選択し、それをpost.cgiにて表示させるというサンプル(ここを後で変数の格納に変えます)ですが、この時、1ページに似た構成の2ページ目のアンケートへのリンクの仕方がわかりません。 イメージ的には、 1ページ目表示→回答を配列[0]に格納→2ページ目表示→回答を配列[1]に格納→・・・ 最終的には、各ページの回答を記録した配列を出力します。 以上のようなことを実現したいのです。 WEBなどを探してみたのですが、1ページにボタンやフォームがたくさん埋め込まれたものは発見したのですが、この紙芝居的なアンケートのヒントになりそうなものが見つかりませんでした。 アドバイスや、忠告などで結構ですので、回答を頂けると幸いです。

    • 締切済み
    • CGI
  • perlがうごきません

    <html> <head> <title>form3</title> </head> <body> <form action="form3.cgi" method="post" name="form3"> <input type="text"name="form3"> <input type="submit"value="送信"> </form> </body> </html> ::::::::::::::::::::::::::::::: #! /usr/bin/perl if($ENV{"REQUEST_METHOD"} eq "GET"){ $str=$ENV{QUERY_STRING"}; }else{ read(STDIN, $str, $ENV{"CONTENT_LENGTH"}); } $str=~ tr/+/ /; $str=~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("c", hex($1))/eg; foreach(split(/&/, $str)){ my ($key, $value)=split(/=/, $_); $data{$key}=$value; } print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head><title>form3</title></head>\n"; print "<body>$data{'form3'}</body>\n"; print "</html>\n"; exit; :::::::::::::::::::::::::::::::: どうしてもうごきません。 どこかスクリプトがまちがっているのでしょうか。 パールのパスはあっています。

    • ベストアンサー
    • 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
  • 意味を教えてください(CGI)

    CGIの勉強をしています。 以下の意味を教えてください。 ・&error("2222");←"2222"の意味 ・&error("サーバーエラー。#101");←#101の意味 ----------------------------------- &decode; if($orden eq 'enviar' || $preview == '0'){ &enviar; } &previsto; &error("2222"); sub decode{ if ($ENV{'REQUEST_METHOD'} eq "POST"){ read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); }else{ &error("サーバーエラー。#101"); }

    • ベストアンサー
    • CGI

専門家に質問してみよう