• 締切済み

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文には入ったようなのですが、データが空っぽで何も入っていないようなのです。 何が原因なのでしょうか?助けてほしいです。

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答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% (5238/13705)
回答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