プロが教える店舗&オフィスのセキュリティ対策術

現在CGIの勉強を行っているのですが、
以下の点がうまくいかなくて困っています。
-----------HTML(例)------------------
投稿名 :[ SAMPLE ]
TITLE :[ SAMPLE1 ]
TEXTAREA :[ aaaaaaaa
_____________bbbbbbb]
[投稿][リセット]
-----------サブフレーム(bbs.cgi)-----
投稿名:[ SAMPLE ]
TITLE :[ SAMPLE1 ]
TEXTAREA :[ aaaaaaaa
_____________bbbbbbb]
-------------------------------------

1.HTMLの方で投稿(サブフレーム形式)
2.BBS.CGIで処理を行う
3.TEXTAREAで改行を行って投稿した際の処理
(ここで投稿した際に別投稿として掲載されてしまいます。)

*ソース
#!/usr/local/bin/perl

use CGI;

#外部データの取得
$q = new CGI;

#外部データの受取処理
$Name1 = $q->param('name');
$Name2 = $q->param('title');
$Name3 = $q->param('url');
$Name4 = $q->param('txt');

@FILE_FOR;
$count=0;

print "Content-type: text/html; charset=Shift_JIS \n\n";
#書き込み
if($Name1 ne "" && $Name2 ne "" && $Name3 ne "" && $Name4 ne ""){
open(FH,">>log.dat");
print FH "$Name1,$Name2,$Name3,$Name4\n";
close(FH);
}
#読み込み
if(!open(FH,"log.dat")){
print "読み込みに失敗しました。\n";
}else{
$F=0;
foreach my $line (<FH>){
@FILE_FOR[$F] = $line;
$F++;
}
}
close(FH);

#結果表示
if($F ne 0){
for($Y=$F;$Y > 0;$Y--){
$C = $Y;
@BOX = split(/,/ ,$FILE_FOR[$Y - 1]);
print "<CENTER>";
print "<HR><TABLE BORDER=2><TR><TD>No.$C</TD></TR>";
print "<TR><TD>投稿者:</TD><TD>@BOX[0]</TD></TR>";
print "<TR><TD>投稿タイトル:</TD><TD>@BOX[1]</TD></TR>";
print "<TR><TD>URL:</TD><TD><a href=@BOX[2]>@BOX[2]</a></TD></TR>";
print "<TR><TD>内容:</TD><TD><B>@BOX[3]</B></TD></TR></TABLE><HR>";
print "</CENTER>";
}
}else{
print "現在は未投稿です。";
}

A 回答 (1件)

以下のような変更で所望の結果は得られるでしょうか?



use CGI;
  ↓
use CGI qw(escapeHTML);

$Name4 = $q->param('txt');
  ↓
$Name4 = $q->param('txt');
$Name4 =~ s/\n/\0/g;

@BOX = split(/,/ ,$FILE_FOR[$Y - 1]);
  ↓
@BOX = split(/,/ ,$FILE_FOR[$Y - 1]);
for my $item (@BOX) {
$item = escapeHTML $item;
$item =~ s/\0/<br>/g;
}
    • good
    • 0
この回答へのお礼

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

上記の通りに変更してみたところ思った通りの結果になりました。
escapeHTMLというものを使うのですね。
本当にありがとうございました!

お礼日時:2009/12/05 17:08

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