• 締切済み

[Netscape Communicator 4.7]×[FORMタグ]の組み合わせ続き

先に投稿した質問内容に利用規約違反してしまっている部分があったので、修正・追加したものを再度投稿します。 htmlファイル(特に関係無さそうな部分省略) <form name="form1" method="post" action="送り先CGI"> <input type="password" name="pasu1" size="10"> <input type="password" name="pasu2" size="10"> <input type="password" name="pasu3" size="10"> <input type="submit" name="sabu" value="nn4win"> </form> CGIファイル(特に関係無さそうな部分省略) #!/usr/bin/perl $title = 'フォーム内容表示'; $jcodelib = './jcode.pl'; $kanjicode = 'euc'; require "$jcodelib"; &init_form($kanjicode); $pasu1 = $form{'pasu1'}; $pasu2 = $form{'pasu2'}; $pasu3 = $form{'pasu3'}; $sabu = $form{'sabu'}; &error; exit(); sub init_form { local($query, @assocarray, $assoc, $property, $value, $charcode, $method); $charcode = $_[0]; $method = $ENV{'REQUEST_METHOD'}; $method =~ tr/A-Z/a-z/; if ($method eq 'post') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } @assocarray = split(/&/, $query); foreach $assoc (@assocarray) { ($property, $value) = split(/=/, $assoc); $value =~ tr/+/ /; $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg; &jcode'convert(*value, $charcode); $form{$property} = $value; } } sub error { print <<__END__; content-type:text/html <html> <head> <title>$title</title> $contenttype </head> <body bgcolor="#FFFFFF" text="#000000"> $pasu1<br> $pasu2<br> $pasu3<br> $sabu<br> </body> </html> __END__ exit(); }

みんなの回答

回答No.4

#1です。 別に、POSTからGETにして使ってくださいと 言っているのではなく、GETの場合の引数が ちゃんと出ているかどうかの確認をしてみては? というつもりでした(^^;; 目的としては、引数としてちゃんと渡されているのに 表示がおかしい場合は、PERL側の問題。 引数自体がすでにおかしい場合は、ブラウザ側の 問題という切り分けをして欲しかったのです。 こういうブラウザが変わる事によって起こるバグは ブラウザ自体のバグの場合もあれば、逆に そのブラウザだけが正しい動きをしていて、 他のブラウザが勝手に補足しているだけ という場合もあります。 ですので何が問題なのかというのを完全に切り分ける のが解決の糸口になります。 切り分けた後は、PERLの処理ならば 細かくデバッグ文を入れていったり、 HTMLなら必要最小限のタグだけのページを 作って、そこからちょっとずつ現在の形に近づけて いったり、逆に問題のタグを消してどうなるかなど いろいろ試して行く事が多いです。

TMEspion
質問者

お礼

回答ありがとうございます。 アドバイスの受け取り方を勘違いしていたようで申し訳ないです。 色々試してみたのですが、 一番上の記入欄のデータは、 POSTでも受信はしている事がわかり、 サブルーチンの途中で消えてしまっているようでした。 送信ボタンの方は、 初めから文字列の末尾が欠けた状態で またGETにしてもそうだったのですが、 原因が断定できないためもう少し調べてみようと思います。

TMEspion
質問者

補足

問題を未解決で終わらせたくないので、よろしければ回答、もしくはアドバイスよろしくお願いします。 Perlのプログラムを細かく区切って、各変数にどんな値が代入されているのかを調べていったところ、末尾が欠けたり、VALUE値の消失の二つの問題が read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); の所で発生している事がわかりました。 上記の一文で、$queryの受け取っている「STDIN」の中身が、Netscape Communicator 4.7で受け取った際、行頭に「半角スペース」が入り、行末は「1バイト分」削れた状態で入っていました。 そのため、 $pasu1 = $form{'pasu1'}; では、サブルーチンで代入されているのは「$form{' pasu1'};」で、$pass1に代入しようとしても空っぽなのは当然な事でした。 行末については、 $queryに入れる長さを「$ENV{'CONTENT_LENGTH'}」にしているため、半角スペースが増えた分、行末が削れるという事でした。 ・・・と結果的な原因はわかったのですが、 何故、「半角スペースが行頭に追加される」のかがわかりませんでした。 長さの設定を変更してみたりもしましたが、行末が欠けているのは相変わらずで、STDINの中で既に行末は切れてるようでした。 ・・・ブラウザによるものなんでしょうか? また、解決法はあるんでしょうか?

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.3

$method = $ENV{'REQUEST_METHOD'}; この値は 'POST' 大文字だったような?formタグに書いたものとは別にシステムで設定されるものなので。。

TMEspion
質問者

補足

回答ありがとうございます。 現状のプログラムだと、全て小文字にして If文で照らし合わせていたので、 大文字に直してやってみましたが、 結果は変わらず、同じでした。。。

  • nattouv
  • ベストアンサー率75% (3/4)
回答No.2

私のとこのNSC4.78では以下perlで受けると大丈夫そうに見えますが・・・どうでしょう。 #!/usr/bin/perl print "Content-Type: text/html; charset=EUC-JP\n\n"; read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); print $query; exit();

TMEspion
質問者

お礼

回答ありがとうございます。 こちらでもそのPerlで試してみた所、 NAME=pasu1のVALUEは受信していましたが、 NAME=subuの方は未だに末尾が欠けて VALUE=は「nn4wi」となってしまいます。 SUBMITのVALUEを全角文字にし、 他のブラウザで試した所 「サブミット」=「%A5%B5%A5%D6%A5%DF%A5%C3%A5%C8」 となるのですが、 問題のネスケで試すと、 「%A5%B5%A5%D6%A5%DF%A5%C3%A5%C」となり、 半角1文字分欠けてしまいます。 こちらのブラウザの設定でもおかしいのでしょうか?

回答No.1

回答では無いですが、 METHODをGETにしてみれば 何かがわかるような気がします。 一度GETの引数を確認してみてください。

TMEspion
質問者

お礼

助言、ありがとうございます。 >METHODをGETにしてみれば 試しに、GETにしてみたら 正常に受信する事はできましたが、 「nn4win.cgi?pasu1=aaa&pasu2=bbb&pasu3=ccc&sabu=nn4win」 と、上記のようにURLに入力内容が出てしまうので、 できる事ならPOSTで解決策があるといいです。

関連するQ&A