CGI-BBS > 電子掲示板 > その他 > 自作掲示板でログ消去のスクリプトが動きません。


カレッヂ
カレッヂ


質問者 まだまだ初心者  投稿日 7/18(木) 20:09:32
自作の掲示板を作っています。
bbs_reg.cgi、log.dat、bbs_show.cgiという3つのファイルで実現させようと思っています。
bbs_reg.cgiでは投稿内容をlog.datに書き込み、bbs_show.cgiではlog.datの内容を読み込んで表示させます。
bbs_reg.cgiはきちんと動くのですが、bbs_show.cgiが動いてくれないのです。(mac perlではsyntax OKと出ます)
以下に、bbs_reg.cgiとbbs_show.cgiのスクリプトを記しておきますので、どなたかアドバイスを頂けませんでしょうか。

bbs_reg.cgi

#!/usr/bin/perl

require 'jcode.pl';

read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/, $buffer);

foreach $pair (@pairs) {
	($name, $value) = split(/=/, $pair);
	$value =~ tr/+/ /;
	$value =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
	&jcode'convert(*value, 'sjis');
	$value =~ s/\r\n/<br>/g;
	$value =~ s/\r/<br>/g;
	$value =~ s/\n/<br>/g;
	$form{$name} = $value;
}

$time = time;

$expire = int($time + $form{'expire'} * 86400);

$data = "$form{'title'},$form{'message'},$expire\n";

open(LOG_FILE, ">>log.dat") || die "ファイルを開けませんでした。";;
flock(LOG_FILE, 2);
print LOG_FILE $data;
flock(LOG_FILE, 8);
close(LOG_FILE);

open(LOG_FILE, ">>i-log.dat") || die "ファイルを開けませんでした。";;
flock(LOG_FILE, 2);
print LOG_FILE $data;
flock(LOG_FILE, 8);
close(LOG_FILE);

print "Content-type:text/html\n\n";
print << "EOH";
<html>
<head>登録完了</head>
<body>
登録は無事完了しました。<br>
<br>
<a href="http://www.-----.jp/------/main.html" target=main>こちらから最初のページに戻って下さい。</a>
<br>
</body>
</html>

EOH


bbs_show.cgi

#!/usr/bin/perl

$LogFile = './log.dat';

$time = time;

open(IN,"$LogFile") || die "ファイルを開けませんでした。";
while(<IN>){
   $data = $_;
   ($expire) = (split(/\,/,$data))[2]; #有効期限を得る

   if($time <= $expire){ #現在のtime値が$expireより少なければ
     push @all,$data;  #@allに入れる
   } 
 } 
 close IN;

 open OUT,">> $LogFile";
 foreach (@all){  #@allをログファイルに書き込む
   print $_;
 }
 close OUT;

print "Content-type:text/html\n\n";
print << "EOH";
<HTML>
<HEAD>
<TITLE>新入荷コミックス</TITLE>
<BODY>
<center>
<img src = "http://www.-------.jp/-----.jpg"><br>
<img src = "http://www.-------.jp/-----.jpg"><br></center>
EOH

$spacer = "http://www.--------.jp/-------.jpg";

open IN,"LogFile";
foreach(<IN>){
   $data = $_;
   ($title,$message,$expire) = (split(/\,/,$data))[0,1,2];
print "■$title<br>■$message<br>$spacer\n";
}
print << "EOH";
<a href= "http://www.-------.jp/--------.html" target="main">戻る</a>
</BODY>
</HTML>

EOH

プロバイダ参照:http://www.interlink.or.jp/
サーバのOS:UNIXサーバ
パソコンのOS:Mac9
エディタ:mac J perl
FTPソフト:fetch v3
サーバ移転:していない
改造:(未選択)
CGI習熟度:advanced

回答者 しあわせのツボ  [削除]  投稿日 7/18(木) 21:13:45
「動いてくれない」とは具体的にどのような状況ですか?

ざっと見たところ「これで動くの?」という部分はいくつかありますが…
質問者 まだまだ初心者  [削除]  投稿日 7/18(木) 22:06:33
お返事ありがとうございます。

bbs_reg.cgiは何の問題もなく、その前のページからformで送られてきた内容をlog.datに書き込みます。
その後、bbs_show.cgiにアクセスすると、「サーバーの内部エラー/サーバで内部エラーまたは設定エラーが発生したため、リクエストに対する処理を完了できませんでした。」
とエラーが出ます。
更に、log.datを見てみると、ものの見事に全てデータが消されてしまいます。

どうしたらよいでしょう?アドバイスお願いします。
回答者 しあわせのツボ  [削除]  投稿日 7/19(金) 12:23:40
サーバエラーが出るということは、どこかに文法的な破綻があるか、
指定したファイルを読めない等の不具合が発生しています。
具体的に問題点を。

 open OUT,">> $LogFile";
# >>(追記)ではなく>(書き込み)が正解でしょう。
# でないと見るたびにログがコピーされていきます。
 foreach (@all){  #@allをログファイルに書き込む
   print $_;
 }
 close OUT;
# print OUT $_; ($_は省略可)とすべきです。
# これを忘れるととんでもない所に出力されます。
# ついでに、foreachを使わなくてもprint OUT @all;で大丈夫です。

open IN,"LogFile";
# "$LogFile" ですね。これでは「LogFileという名前のファイル」を
# 指定したことになります。
# この指定が間違っていたのと、open失敗時の処理を書いてなかったので
# エラーに落ちたのでしょう。
# あと、わざわざ読み直さず@allを再利用する方がベターです。

細かいところはまだありますが、とりあえずこれだけ直してみてください。
質問者 まだまだ初心者  [削除]  投稿日 7/21(日) 12:27:46
返事が遅くなってすみません。

お教え頂いた通り(になっているでしょうか?)、下記のようにスクリプトを変えてみました。

そうしたら、投稿件数を表示するようになってしまい、
投稿内容を表示しなくなってしまいました...

どこがいけないのでしょうか?

アドバイスをお願いします。

#!/usr/bin/perl

$LogFile = './log.dat';

$time = time;

open(IN,"$LogFile") || die "ファイルを開けませんでした。";
while(<IN>){
   $data = $_;
   ($expire) = (split(/\,/,$data))[2]; #有効期限を得る

   if($time <= $expire){ #現在のtime値が$expireより少なければ
     push @all,$data;  #@allに入れる
   } 
 } 
 close IN;

 open OUT,"> $LogFile";
 print OUT @all;

 close OUT;

print "Content-type:text/html\n\n";
print << "EOH";
<HTML>
<HEAD>
<TITLE>新入荷コミックス</TITLE>
<BODY>
<center>
<img src = "http://www.---------.jp/---------.jpg"><br>
<img src = "http://www.---------.jp/---------.jpg"><br></center>
EOH

$spacer = "http://www.----------.jp/---------.jpg";

 $log = @all;
   ($title,$message) = (split(/\,/,$log))[0,1];

print << "EOH";

■$title<br>
$message<br>
<center>
<img src = $spacer><br>
</center>
<a href= "http://www.---------.jp/----------.html" target="main">戻る</a>
</BODY>
</HTML>

EOH
回答者 しあわせのツボ  [削除]  投稿日 7/21(日) 15:35:44
$log = @all;
が原因です。
それと、これでは最も古い1件しか表示できません。

while ($log = shift(@all)) { $logをどうのこうのしてprint }
のような流れにしてください。
質問者 まだまだ初心者  [削除]  投稿日 7/21(日) 16:52:05
しあわせのツボさん、いろいろと教えて頂きありがとうございました。

無事、動くようになりました。
時間が来ると、ログも自動的に消えるようになりました。

どうもありがとうございました。

今の問題は一番古い投稿が一番上に来るので、それを直したいと思います。

自分なりにがんばってみて、ダメなら、また教えて下さい。お願いします。

このページは終了したので返信(回答)は書きこめません

Web裏技