CGI_掲示板2_指定データ表示




#!/usr/local/bin/perl

# 掲示板2(フレームを利用したパターン)右画面

# id=bbs2.cgi

# update.  01.9.16

# 使用上の注意・・・漢字コードの変換が不完全ですので文字化けするおそれがあります。
#          そのつもりでお使い下さい。

# 日本語コード変換ライブラリ(v2.0)の指定
# &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される  

require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse;

# 設置するURLを設定
$reload = 'http://xxx/bbs2.cgi';

$file = "/cgi/bbs2.dat";
$sendmail = '/usr/lib/sendmail';

# 掲示板へ記入したら管理者へメール通知するならON
$send="off";
# メールの送り先
$myaddress =' oooooo@xxx.co.jp';

# データ確認デバッグモード(通常は$test=""、各画面で変数状態を見たいときは"on")
$test="";

# 最大登録数
$max=200;
# メッセージの文字数制限(この値の半分が漢字数)
$mojisu = 200;
# 表示期間の設定(設定した日数後のファイル更新時に消去します、消去しない場合は0)
$syokyo=7;  # 1週間後

# 1画面表示件数
$gyosu=10 ;

####################################
#                                  #
#   メインルーチン(処理の分岐)     #
#                                  #
####################################

# 消去日計算
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time);
$mm++;
# 2桁化
$mm = sprintf("%.2d",$mm);
$dd = sprintf("%.2d",$dd);
# 西暦4桁処理
if ($yy < 70) { $yy = $yy + 2000;}
else          { $yy = $yy + 1900;}
# 本日
$ymd=$yy.$mm.$dd;


$page=$in{'page'};
$syurui=$in{'syurui'};
# 最初に渡された状態セーブ
$syurui_sv=$syurui;

# 該当データを調べる
if ($syurui ne "all") { &read4 }

#  全体の流れを決定する
if ($in{'action'} eq 'main') { &main; }

elsif ($in{'action'} eq 'kinyu') { &kinyu; }

elsif ($in{'action'} eq 'check') { &check; &main; }

elsif ($in{'action'} eq 'meisai') { &meisai; }

elsif ($in{'action'} eq 'next') { &next; }

elsif ($in{'action'} eq 'back') { &back; }

elsif ($in{'action'} eq 'narabi') { &narabi; }
# メール送信画面
elsif ($in{'action'} eq 'email') { &email; }

# 詳細表示画面
elsif ($in{'action'} eq 'teisei') {&teisei;&main; }

else { &first; }

# なくても良いが最終出口を示す
exit;

#############################################
#                                           #
#    データを読む             # 
#                                           #
#############################################          

sub read {

# データを読み各連想配列に加算する
#   1       2       3     4    5     6
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード
$j=0;
# 配列の初期化
@data=();

open(DB,"$file");
flock(DB,2);
while (<DB>)  {
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);  

# とりあえずキーがないデータを表示しないため
if ($dt1 ne "")  {


# 表示期限チェック
if ($dt5 > 0 && $dt5 >= $ymd) {
# 9は全部、他は指定分類のみ、指定なしも全件
if ($syurui eq "all")  { $data[$j]=$_ ;$j++}
elsif ($syurui eq $dt2)  { $data[$j]=$_ ;$j++}
} # end of if

} # とりあえずここまで

} # end of while

flock(DB,8);
close(DB);
# データ数
$cnt=@data;

} # end of read
#############################################
#                                           #
#    登録データを読む(訂正削除用配列)  # 
#                                           #
#############################################          

sub read2 {

# データを読み各連想配列に加算する
open(DB,"$file");
flock(DB,2);
@data=<DB>;
flock(DB,8);
close(DB);

# データ数
$cnt=@data;
# 配列の初期化
%idxdt=();

# 各レコードを日時をキーにした連想配列にセットする
foreach (@data) {
($idx,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);  

# キーを変数名に入れて1レコード全体をセットする
$idxdt{$idx} = $_;
} # end of foreach

} # end of read2
#############################################
#                                           #
#    データを読む(全件)            # 
#                                           #
#############################################          

sub read3 {
open(DB,"$file");
flock(DB,2);
@data=<DB>;
flock(DB,8);
close(DB);
} # end of read3


#############################################
#                                          
#    アンカータグで渡されたキーデータから該当内容を調べる  
#                                          
#############################################          

sub read4 {

open(DB,"$file");
flock(DB,2);

while (<DB>)  {
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);  
# 指定レコードキーがあったらそのレコードの宛先をセットする
if ($syurui == $dt1)  { $syurui=$dt2 ;last ; }

} # end of while

flock(DB,8);
close(DB);

} # end of read4
########################
#            #
# 項目分解ルーチン   #
#            #
########################
sub bunkai  {
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);

# 日付時刻分解
$yy=substr($dt1,0,4);
$mm=substr($dt1,4,2);
$dd=substr($dt1,6,2);
$ji=substr($dt1,8,2);
$fun=substr($dt1,10,2);
$byo=substr($dt1,12,2);
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;
$hizuke="$yy年$mm月$dd日$ji時$fun分";
$hizuke1="$yy年$mm月$dd日";
$hizuke2="$ji時$fun分";
# 番号

# 内容の改行を元に戻す
$dt3 =~ s/&k/\n/g;
# 表示用に変換する
$naiyo2 = $dt3;
$naiyo2 =~ s/\n/<BR>/g;

} # end of bunkai

#############################################
#                                           #
#    最初に処理するルーチン          # 
#                                           #
#############################################          

sub first {

print "Content-type: text/html\n\n";

print <<EOM;
<HTML>
<HEAD><TITLE>掲示板2</TITLE></HEAD>
<BODY BGCOLOR="#ffffff" BACKGROUND="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">
EOM

print '<BR><BR><FONT size=5 color="blue">';
print '<CENTER>左側から表示させる内容を選択してください</CENTER></FONT>'."\n";
print '<BR><BR>'."\n";
$page=1;
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="kinyu">' . "\n";
print '<input type=submit value=" 記入画面へ ">' . "\n";
&hidpara;
print '</FORM>';

print '</BODY></HTML>'. "\n";

} # end of first

#############################################
#                                           #
#    メイン処理画面を表示する            # 
#                                           #
#############################################          

sub main {

# 表示用変数
$page = $in{'page'};
$sortkb = $in{'sortkb'} ;

&read;

# 昇順にする
if ($sortkb == 1)  { @data=reverse(@data);}
# ページ数計算
$page_max = (($cnt-1) / $gyosu) + 1;
# 整数部をとりだす
($page_max,$dummy)=split(/\./,$page_max);

# 表示出力処理
print "Content-type: text/html\n\n";
print <<EOM;
<HTML>
<HEAD><TITLE>掲示板2</TITLE></HEAD>
<BODY BGCOLOR="#ffffff" BACKGROUND="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">
EOM

print '<TABLE BORDER="1">';
print '<TR><TD>';
print '<FONT SIZE=3 COLOR=#0000FF>'."\n";
print '掲示板2'."\n";
print '</FONT></TD>';
print '<TD>指定データ</TD>';

print "<TH>該当件数</TH><TH><FONT COLOR=#0000FF>表示頁</FONT></TH><TH>最終頁</TH></TR>\n";

print '<TR VALIGN="MIDDLE"><TD ALIGN="CENTER">';
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="kinyu">' . "\n";
print '<input type=submit value=" 記入画面へ ">' . "\n";
&hidpara;
print '</FORM>';
print '</TD>';
if ($syurui eq "all")  { $sitei="全件" } else { $sitei=$syurui }
print "<TD ALIGN=\"CENTER\"><FONT COLOR=#AA0000>$sitei</FONT></TD>\n";

print "<TD ALIGN=\"right\"><FONT COLOR=#AA0000>$cnt</FONT></TD><TD ALIGN=\"right\"><FONT COLOR=#0000FF>$page</FONT></TD>\n";
print "<TD ALIGN=\"right\"><FONT COLOR=#AA0000>$page_max</FONT></TD>\n";
print '</TR></TABLE>'."\n";

# 前頁表示

# ボタンを並べる
# 上段
print '<TABLE BGCOLOR="#ffffCC">';
print '<TR VALIGN="BOTTOM">';
# 表示順序
print '<TD>';
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="narabi">' . "\n";
&hidpara;
if ($sortkb == 0)  { $sortkbn = "日付の古いものを先に"; }
else { $sortkbn = "日付の新しいものを先に"; }
print '<input type=submit value="'.$sortkbn.'">' . "\n";
print '</FORM>'. "\n";
print '</TD>';
print '<TD>   </TD>';
# 前頁表示
print '<TD>';
if ($page == 1)  { print ' '; }
else  {
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="back">' . "\n";
&hidpara;
print '<input type=submit value="前頁">' . "\n";
print '</FORM>';
} # end of if

print '</TD>';
print '<TD>  </TD>';
# 次頁表示
print '<TD>';
if ($page == $page_max)  { print ' '; }
else  {
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="next">' . "\n";
&hidpara;
print '<input type=submit value="次頁">' . "\n";
print '</FORM>'. "\n";
} # end of if
print '</TD>';
print '<TD>  </TD>';

print '</TR></TABLE>'."\n";
print '</FORM>'. "\n";

# 該当データが0件の場合
if ($cnt == 0)  {
print '<BR><BR><FONT size=5 color="blue">';
print '<CENTER>該当データは0件です、選択内容を変えてご覧ください</CENTER></FONT>'."\n";
return } # end of if

# 最初は詳細形式を表示する
&disp3;

} # end of main

#################################
#   hiddenパラメータ共通項目  #
#################################
sub  hidpara  {
print '<input type=hidden name="page" value="'.$page.'">'."\n";
print '<input type=hidden name="sortkb" value="'.$in{'sortkb'}.'">' . "\n";
print '<input type=hidden name="syurui" value="'.$syurui_sv.'">' . "\n";
} # end of hidpara

##########################
#            #
#  詳細表示ルーチン  #
#            #
##########################
sub disp3  {

print "<TABLE BORDER=\"1\" WIDTH=\"100%\" >\n";
print "<TR><TH>№</TH><TH>宛先</TH><TH>日付</TH><TH>内 容</TH><TH>差出人</TH></TR>\n";

# 行数分だけ繰り返す
for($i=1; $i<=$gyosu; $i++) {

#print '<TR>';
# 1列目はページカウンタ*行数+$i

$lno=$gyosu * ($page - 1) + $i;
$no=$lno-1;

# 項目分解処理
$bundt=$data[$no];
&bunkai;

# 分類別色
$iro=$buncol[$bunrui];

print '<TR>';
print '<TD ALIGN="right"><FONT COLOR='.$iro.'>'.$lno.'</FONT>'."\n";
if ($test eq "on") { print '<BR>'.$bundt.''."\n"; } # テスト表示
print '</TD>'."\n";
print '<TD ALIGN="left" NOWRAP><FONT COLOR='.$iro.'>'.$dt2.'</FONT></TD>';
print '<TD ALIGN="left" NOWRAP><FONT COLOR='.$iro.'>'.$hizuke1.'<BR>'.$hizuke2.'</FONT></TD>';
print '<TD ALIGN="left"><FONT COLOR='.$iro.'>';
$act="meisai";
print '<A HREF = "'.$reload.'?action='.$act.'&keyno='.$dt1.'&tbno='.$lno.'&page='.$page.'&sortkb='.$sortkb.'">'.$naiyo2.'</A>';
print '</FONT><BR>'."\n";
print '</TD>'."\n";
print '<TD ALIGN="left"><FONT COLOR='.$iro.'>'.$dt4.'</FONT></TD>'."\n";
print '</TD>'."\n";
#print '<TD ALIGN="left"><FONT COLOR='.$iro.'>'.$dt5.'</FONT></TD>'."\n";
#print '</TD>'."\n";
#print '<TD ALIGN="left"><FONT COLOR='.$iro.'>'.$dt6.'</FONT></TD>'."\n";
print '</TR>'."\n";

# 最終データを表示したら抜ける
if ($lno >= $cnt)  { last }

} # end of for

print '</TABLE>';
print "</BODY></HTML>\n";

} # end of disp3


#############################################
#                                           #
#    掲示板新規記入処理            # 
#                                           #
#############################################          

sub kinyu {
# 消去日が設定してある場合
if ($syokyo > 0)  {
# 消去日計算
$syokyobyo = $syokyo * 60 * 60 * 24;
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime(time + $syokyobyo);
$mm++;
# 2桁化
$mm = sprintf("%.2d",$mm);
$dd = sprintf("%.2d",$dd);
$ji = sprintf("%.2d",$ji);
$fun = sprintf("%.2d",$fun);
$byo = sprintf("%.2d",$byo);
# 西暦4桁処理
if ($yy < 70) { $yy = $yy + 2000;}
else          { $yy = $yy + 1900;}
# 消去日
$symd=$yy.$mm.$dd;
} # end of if
else { $symd=0 } # end of else

print "Content-type: text/html\n\n";

print <<EOM;
<HTML>
<HEAD><TITLE>掲示板への記入</TITLE></HEAD>
<BODY BGCOLOR="#ffffff" BACKGROUND="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">
<H2>掲示板への記入</H2>
EOM

# 外側の飾り線(画面の設定によってはわくとして表示しないことがある)
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';
print '<TR>';

print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="check">' . "\n";
# 左画面から指定された宛先があれば表示させる
if ($syurui eq "all")  { $atesaki = "" } else { $atesaki = $syurui }
print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40" value="'.$atesaki.'"><br>'."\n";
print '<BR>';
print 'メッセージをどうぞ(漢字の場合100文字以内)';
print '<BR>';
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5></TEXTAREA>' . "\n";
print '<BR><BR>';

print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40">' . "\n";
print '<BR><BR>';

print '<FONT COLOR=#AA0000>';
print '登録後にあなたが訂正削除する場合に必要。未設定時は訂正削除不可';
print '</FONT>';
print '<BR>';
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">' . "\n";
print '<BR><BR>';

print '<FONT COLOR=#AA0000>';
print "表示期限は本日より $syokyo日間です、要変更の場合は訂正して下さい\n";
print '<BR>';
print '</FONT>';
print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10" value="'.$symd.'">' . "\n";
print '<BR>';
print '<TABLE BGCOLOR="#ffffCC">';
print '<TR VALIGN="BOTTOM">';
# 表示順序
print '<TD>';
print '<input type=submit value="登録">' . "\n";
print '</TD>';
print '<TD>  </TD>';
print '<TD>';
print '<input type=reset value="入力内容取消">' . "\n";

# 登録日時セット
($byo,$fun,$ji,$dd,$mm,$yy,$yobi) = localtime;
$mm++;
# 2桁化
$mm = sprintf("%.2d",$mm);
$dd = sprintf("%.2d",$dd);
$ji = sprintf("%.2d",$ji);
$fun = sprintf("%.2d",$fun);
$byo = sprintf("%.2d",$byo);
# 西暦4桁処理
if ($yy < 70) { $yy = $yy + 2000;}
else          { $yy = $yy + 1900;}
# 登録日時
$nichiji=$yy.$mm.$dd.$ji.$fun.$byo;

# ここで同時刻に登録しようとした場合を考えてキーをユニーク(唯一)にするため
# 日時の後に4桁のランダム数字を足す(これでも同一になった場合は訂正時1つのデータ消滅する)
srand;
$a=rand;
$no4=substr($a,index($a,".")+1,4);
if ($no4 == 0)  { $no4 = "0000"; }
$nichiji.=$no4;
print '<input type=hidden name="nichiji" value="'.$nichiji.'">' . "\n";

# 共通データ渡し
$syurui_sv=$nichiji;
&hidpara;
print '</FORM>'. "\n";
print '</TD>';
print '<TD>  </TD>';
print '<TD>';
# 戻る
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="main">' . "\n";
print '<input type=submit value="記入せずに戻る">' . "\n";

# 最初の画面から来たときは何も指定データがないから
if ($syurui eq "")  { $syurui="all" }
$syurui_sv=$syurui;
&hidpara;
print '</TD></TR></TABLE>'."\n";


print '</FORM>'. "\n";

# 外側の飾り線
print '</TR></TABLE>';

print '</BODY></HTML>'. "\n";
} # end of kinyu

##########################################
#                                        #
#  入力されたデータのチェックルーチン    #
#                                        #
##########################################

sub check {

&form_data;

# 宛名がない場合
if ($namae eq "" ) { &error(2); }
# 差出人がない場合
if ($sasidasi eq "" ) { &error(3); }

# チェック通過、更新へ
&update;

$syurui=$namae;
# 管理者へメール送信
if ($send eq "on")  {  &mymail }

} # end of check

#############################################
#                                           #
#    管理者へのメール送信ルーチン       # 
#                                           #
#############################################

sub mymail  {
# 改行コードを戻す
$naiyo =~ s/&k/\n/g;

$message = <<EOM;
Subject: 掲示板記入連絡
Reply-To: $myaddress

掲示板2への書き込みがありました。

宛先       : $namae

メッセージ

$naiyo

差出人     : $sasidasi

訂正削除パスワード : $pwd1

登録日時   : $nichiji
EOM

# メール送信はJISと決められている
&jcode'convert(*message,'jis');

open(MAIL,"|$sendmail $myaddress");
print MAIL $message;
close(MAIL);
} # end of mymail
#############################################
#                                           #
#    フォーム入力データセットルーチン    # 
#                                           #
#############################################
sub form_data  {
$nichiji=$in{'nichiji'};
$namae=$in{'namae'};
$naiyo=$in{'naiyo'};

# メッセージの改行のみをカットする
@chk = split(/\n/,$naiyo);
$msg="";
foreach (@chk) {
if (length($_) > 1)  {
$msg=$msg.$_."\n";
} # end of if
} # end of foreach
$naiyo=$msg;

$naiyo=~ s/\015\012/\n/g;
$naiyo=~ s/\015/\n/g;
$naiyo =~ s/\n/&k/g;
# 文字数チェック
if (length($naiyo) > $mojisu)  { $naiyo = substr($naiyo,0,$mojisu); }

$sasidasi=$in{'sasidasi'};
$pwd1=$in{'pwd1'};
$symd=$in{'symd'};

# タグの無効化
$ckdt=$namae ; &tagck ; $namae=$ckdt;
# 宛先をセットする
$syurui=$namae;
$ckdt=$naiyo ; &tagck ; $naiyo=$ckdt;
$ckdt=$sasidasi ; &tagck ; $sasidasi=$ckdt;
$ckdt=$pwd1 ; &tagck ; $pwd1=$ckdt;
$ckdt=$symd ; &tagck ; $symd=$ckdt;

} # end of form_data

###############################
#  タグの無効化サブルーチン
###############################
sub tagck  {
$ckdt =~ s/</&lt;/ig;
$ckdt =~ s/>/&gt;/ig;
$ckdt =~ s/<!--.*-->//ig;
$ckdt =~ s/\,//g;

}

##########################################
#                                        #
#  次ページ表示処理              #
#                                        #
##########################################

sub next {
$in{'page'}++;
&main;
} # end of sub

##########################################
#                                        #
#  前ページ表示処理              #
#                                        #
##########################################

sub back {
if ($page  > 1)  { $in{'page'}--; }
&main;
} # end of sub
##########################################
#                                        #
#  表示順序の変更指示             #
#                                        #
##########################################
sub narabi {
if ($in{'sortkb'} == 0)  { $in{'sortkb'} = 1; }
else { $in{'sortkb'} = 0; }
&main;
} # end of sub

#####################
#  ファイル登録
#####################
sub update  {

#   1       2       3     4    5     6
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード
$value = "$nichiji\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";
$pwd1=$in{'pwd1'};

# 登録済みデータを読み配列にセットする
if ($pwd1 ne "subetekesu")  { &read3; unshift(@data,$value);}
else {push(@data,$value);}

# 表示期限を過ぎたデータを消す
%new=();
foreach(@data)  {
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$_);
# 消去日が本日を過ぎていたら除外する
if ($dt5 == 0 || $dt5 >= $ymd) { push(@new,$_);}
} # end of foreach

# 掲示板は先頭から古い順になっているのでそのまま1番目のデータをシフトする
$a=@new;
if ($a > $max)  {
$herasu=$a - $max;
for ($i=1; $i<=$herasu; $i++)  { pop(@new) }
} # end of if

# ファイル登録
if (!open(WRITE,">$file")) { &error(0); }
flock(WRITE,2);
print WRITE @new;
flock(WRITE,8);
close (WRITE);

} # end of update

#############################################
#                                           #
#    チェックエラー表示画面ルーチン      # 
#                                           #
#############################################

sub error {

#  &error(xx); で呼び出されたルーチンは、()内の数字が $error に代入される。

$error = $_[0];

if    ($error eq "0") { $error_msg = 'ファイルがない、またはOPENできない。'; }

elsif    ($error eq "2") { $error_msg = '宛名がありません'; }

elsif    ($error eq "3") { $error_msg = '差出人は必ず入力してください'; }

elsif    ($error eq "91") { $error_msg = '訂正パスワードが最初の登録時入力してありませんので、訂正/削除はできません。'; }

elsif    ($error eq "92") { $error_msg = '訂正パスワードが最初の登録時のものと不一致のため、訂正/削除はできません。'; }
      
print "Content-type: text/html\n\n";

print '<html><head><title>掲示板</title></head>' . "\n";
print '<body bgcolor="#ff66ff" text="#000000" LINK="#0000ff" VLINK="#ff8888" ALINK="#FF0000">' . "\n";
print '<h2>掲示板の入力で下記のエラーが発生しました</h2>' . "\n";
print '<BR><BR>';
print "<i>$error_msg</i>\n";

# リロードでもどると入力データが消えてしまうので
print 'ブラウザ画面の戻るをクリックする'."\n";;
print '</body></html>' . "\n";
# サブルーチンからプログラムを抜けるので
exit;
}

#############################################
#                                           #
#    明細データの訂正・削除ルーチン      # 
#                                           #
#############################################          

sub meisai {

&read2;
# キー
$keyno=$in{'keyno'};
# 配列番号(次前データ移動用)
$tbno=$in{'tbno'};
# 実配列番号は-1
$tbno--;

# 項目分解処理
$bundt=$idxdt{$keyno};
&bunkai;

&meisai_display;

} # end of meisai
#############################################
#                                           #
#    明細データの訂正・削除ルーチン      # 
#    (次前データ処理用)                     #
#############################################     
sub meisai2 {

&read;

# 項目分解処理
$bundt=$data[$tbno];
&bunkai;
# キー
$keyno=$dt1;

&meisai_display;

} # end of meisai2
#############################################
#                                           #
#    明細データの共通表示ルーチン       # 
#                                           #
#############################################          
sub meisai_display  {
# 明細表示データ№は配列№+1
$mno=$tbno+1;

print "Content-type: text/html\n\n";
print <<EOM;
<HTML>
<HEAD><TITLE>掲示板の詳細</TITLE></HEAD>
<BODY BGCOLOR="#ffffff" BACKGROUND="http://www0.kumagaya.or.jp/~chichibu/gazo/bg1.gif">
<H2>掲示板の詳細</H2>
EOM

print '<form method="post" action="' . $reload . '">' . "\n";
# 外側の飾り線
print '<TABLE BORDER="10" CELLPADDING="10" WIDTH="100%">';
print '<TR>';

print '宛先 <input type=text name="namae" size="40" MAXLENGTH="40" value="'.$dt2.'"><br>' . "\n";
print '<BR>';

print 'メッセージをどうぞ';
print '<BR>';
print '<TEXTAREA NAME="naiyo" COLS=70 ROWS=5>'.$dt3.'</TEXTAREA>' . "\n";
print '<BR><BR>';

print '差出人 <input type=text name="sasidasi" size="40" MAXLENGTH="40" value="'.$dt4.'"><br>' . "\n";
print '<BR>';

print '表示期限 <input type=text name="symd" size="10" MAXLENGTH="10" value="'.$dt5.'"><br>' . "\n";
print '<BR>';

# パスワードが設定してあれば変更可能
# 最終項目なので改行コードがあるのでカットして比較する
$dt6=~s/\n//g;
if ($dt6 ne "")  {
print '訂正削除パスワード <input type=text name="pwd1" size="10" MAXLENGTH="10">' . "\n";
print '<BR>';
print '<FONT COLOR=#AA0000>';
print '*訂正又は削除する場合に必要です。未設定時は訂正削除不可';
print '</FONT>';
print '<BR>';
# 訂正か削除か選択する
print '<TABLE BGCOLOR="#ffffCC">';
print '<TR><TD>';
print '<input type="radio" name="syori" value ="0" checked>訂正削除なし' . "\n";
print '</TD><TD>   </TD><TD>';
print '<input type="radio" name="syori" value ="1">訂正します' . "\n";
print '</TD><TD>   </TD><TD>';
print '<input type="radio" name="syori" value ="2">削除します' . "\n";
print '</TD><TD>   </TD><TD>';
print '<input type=hidden name="action" value="teisei">'."\n";
print '<input type=hidden name="keyno" value="'.$keyno.'">'."\n";
$syurui_sv=$dt1;
&hidpara;

print '<input type=submit value="訂正削除の実行">' . "\n";
print '</TD></TR></TABLE>'."\n";
print '</FORM>'. "\n";
print '<BR>';
# キーの確認表示
if ($test eq "on")  { print "<right><i>($keyno)</i></right>\n"; }

} # end of if

############################

# 戻る
print '<form method="post" action="' . $reload . '">' . "\n";
print '<input type=hidden name="action" value="main">' . "\n";
$syurui_sv=$dt1;
&hidpara;
print '<input type=submit value="戻る">' . "\n";
print '</FORM>'. "\n";
print '<BR>';
# 外側の飾り線
print '</TR></TABLE>';

print '</BODY></HTML>'. "\n";
} # end of meisai

#####################
#  データ訂正
#####################
sub teisei  {
# 訂正削除なしの場合
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 0))  { return }
# 入力項目チェック
# フォーム入力データ
&form_data;

# 宛名がない場合
if ($namae eq "" ) { &error(2); }
# 差出人がない場合
if ($sasidasi eq "" ) { &error(3); }

# チェック通過、更新へ

$syurui=$namae;
# 管理者へメール送信
if ($send eq "on")  {  &mymail }

&read2;
# キー
$keyno=$in{'keyno'};
# 管理者用強制パスワード
if ($pwd1 ne "nopassword")  {
# 訂正パスワードチェック
$bundt=$idxdt{$keyno};
($dt1,$dt2,$dt3,$dt4,$dt5,$dt6) = split(/\t/,$bundt);

#登録パスワードの改行コードをカットしたものと比較する (98.7.11)
$pck=$dt6;
$pck=~s/\n//g;

if ($pck eq "") { &error(91) }
if ($pck ne $pwd1) { &error(92) }
} # end of if
########################

# 削除の場合
if (($in{'action'} eq 'teisei') && ($in{'syori'} == 2))  { &sakujo; return }

# ここからは訂正選択時処理

# データ訂正
#   1       2       3     4    5     6
# 日付時刻、宛先、内容、差出人、消去日、訂正用パスワード
$value = "$keyno\t$namae\t$naiyo\t$sasidasi\t$symd\t$pwd1\n";
$idxdt{$keyno}=$value;
&file_write;
} # end of teisei

#####################
#  データ削除
#####################
sub sakujo  {

# データ削除
delete $idxdt{$keyno};
&file_write;
} # end of sakujo


##########################
#  ファイル登録共通処理 #
##########################
sub file_write  {

#  登録用配列にデータセット
%new=();

# 配列データを降順にソートする(keysでは登録順に値が返されるとは限らないため)
@data=sort by_date keys(%idxdt);

foreach (@data){
# 通常では発生しないが開発途中での空のデータを除く(10は適当)
if (length($idxdt{$_}) > 10) {
push(@new,$idxdt{$_});}
} # end of foreach

# ファイル登録
if (!open(WRITE,">$file")) { &error(0); }
flock(WRITE,2);
print WRITE @new;
flock(WRITE,8);
close (WRITE);

} # end of write
####################################
#                                  #
#   キー(日付)を降順ソートする    #
#                                  #
####################################
sub by_date { $b cmp $a }

################ end of script ###################

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2008年07月12日 14:38
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。