dポイントプレゼントキャンペーン実施中!

下記のようなものを作成しました。




if ($FORM{'WORD'} eq 'フォーム'){
&form;
} elsif($FORM{'WORD'} eq '確認'){
&kakunin;
} elsif($FORM{'WORD'} eq '入力'){
&nyuuryoku;
}

sub kakunin{
print "<FORM METHOD=POST ACTION=top_nyuuryoku1.cgi>\n";
print "<TABLE CLASS=TABLE2 CELLSPACING=0 CELLPADDING=2>\n";
print "<TR><TD WIDTH=80 CLASS=TD1>社員番号</TD><TD CLASS=TD2>$FORM{'BANGOU'}<INPUT TYPE=HIDDEN NAME=BANGOU VALUE=$FORM{'BANGOU'}></TD></TR>\n";
print "<TR><TD WIDTH=80 VALIGN=TOP CLASS=TD1>本文</TD><TD CLASS=TD2>$FORM{'NAKAMI'}</TD><INPUT TYPE=HIDDEN NAME=NAKAMI VALUE=$FORM{'NAKAMI'}></TR>\n";
print "</TABLE>\n";

print "<BR>と入力されました。これでよければボタンを押してください。<BR><BR>\n";
print "<INPUT TYPE=HIDDEN NAME=WORD VALUE=入力>\n";
print "  <INPUT TYPE=SUBMIT CLASS=BUTTON VALUE=入力>\n";
print "</FORM>\n";
}

sub nyuuryoku{

print "入力しました。<BR>\n";
print "<A HREF='top.cgi'>戻る</A>\n";

open (FILE,">>top.log");
flock(FILE,2);
@FILES = "$buffer\n";
print FILE @FILES;
flock(FILE,8);
close(FILE);

}

※多少省略あり。
※$bufferはこれの前のページから受け取ったもの。

kakuninのところの$FORM{'NAKAMI'}ではちゃんと半角スペースや改行が認識されていますが、nyuuryokuになるとだめです。
一体何が原因なのでしょうか?

A 回答 (3件)

まず、



><INPUT TYPE=HIDDEN NAME=NAKAMI VALUE=$FORM{'NAKAMI'}><

ですが、ちゃんとダブルクォーテーションで囲んで

<INPUT TYPE=\"HIDDEN\" NAME=\"NAKAMI\" VALUE=\"$FORM{'NAKAMI'}\">

としてください。
どこまでが範囲かわからずに期待通りの動作をしていないようです。
それから、

>$buffer =~ s/\n/<BR>/g;

まとめてやってしまうのは良いですが、これだと入力された内容に改行が入っていた場合、<BR>というタグまで保存されてしまいますよ。

ついでですが、改行の処理は

$buffer =~ s/\r\n/<BR>/g;
$buffer =~ s/\r/<BR>/g;
$buffer =~ s/\n/<BR>/g;

としておいた方が良いと思います。
何も改行は\nだけではありません。
環境によって、\r\n(Windows)だったり\r(Mac)だったりしますから、\nだけでは正常に動作しない場合があります。

この回答への補足

失礼しました。

$buffer =~ s/\n/<BR>/g;



$buffer =~ s/\r\n/<BR>/g;
$buffer =~ s/\r/<BR>/g;
$buffer =~ s/\n/<BR>/g;

に変更したところ、改行が倍になってしまうことや半角の「・」の混入はなくなりました。
ありがとうございました。

補足日時:2003/02/24 09:12
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ダブルクォーテーションで囲ったらなんとか無事動き出しました。

でも改行が多くなってしまうのです。
倍になってしまいます。

それと必ず改行を有効にすると出てくるのですが、
半角の・みたいなのが入ってしまいます。

これはなぜでしょうか?

>まとめてやってしまうのは良いですが、これだと入力された内容に改行が入っていた場合、<BR>というタグまで保存されてしまいますよ。

はどういうことですか?
まとめてやってしまうのは…とかかれていますが、私の知識ではこれがいっぱいっぱいなんです(^^;

お礼日時:2003/02/24 09:04

>>まとめてやってしまうのは良いですが、これだと入力された内容に改行が入っていた場合、<BR>というタグまで保存されてしまいますよ。


>はどういうことですか?
>まとめてやってしまうのは…とかかれていますが、私の知識ではこれがいっぱいっぱいなんです(^^;

$buffer =~ s/\n/<BR>/g;

とすると、送信されたデータを全て改変してしまい、元のデータがなくなってしまいますよね。
もし\nのままのデータが必要になったらどうします?
#例えばKODAMARさんが何かのデータを編集する時も、念のため名前を変えて保存したり、バックアップを取っておいたりしませんか?

foreach(@buffers){
 ($key,$value)=split(/=/,$_);
 $key =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
 $key =~ tr/+/ /;
 $key =~ s/\n/<BR>/g;
 $FORM{$key} = $value;
}

としておけば、$buffer は全く改変されないまま残ります。
また、現状送信されたデータに改行が含まれていた場合<BR>タグも一緒に保存されてしまいますよね?
保存の形は$buffer のままで良いんだけど、改行はなくしてしまいたいなぁ…と思ったときに、保存する直前に

$buffer =~ s/\r\n//g;
$buffer =~ s/\r//g;
$buffer =~ s/\n//g;

とすれば、良いのでは?と思ったんです。
もちろん今のままで

$buffer =~ s/<BR>//g;

とするのでも問題ありませんよ。
    • good
    • 0

これだけでは何とも言えませんが…確認画面で「入力」ボタンが押された後、フォームから送信されたデータ全てに対して(つまり$buffe

角スペースや改行の処理がされていますか?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

上記のコードの1番上に、

read(STDIN,$buffer,$ENV{'content_length'});
$buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$buffer =~ tr/+/ /;
$buffer =~ s/\n/<BR>/g;


@buffers = split(/&/,$buffer);
foreach(@buffers){
($key,$value)=split(/=/,$_);
$FORM{$key} = $value;
}

と入っています。

これではダメなのでしょうか?

kakunin部分では動いているのであっているのだと思ったのですが…。

お礼日時:2003/02/21 17:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!