#!/usr/local/bin/perl # 掲示板 # id=bbs.cgi # update. 2001.9.13 # 使用上の注意・・・漢字コードの変換が不完全ですので文字化けするおそれがあります。 #          そのつもりでお使い下さい。 # 日本語コード変換ライブラリ(v2.0)の指定 # &ReadParse命令で、$in{ }の変数にフォーム入力データが格納される require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; # 設置するURLを設定 $reload = 'http://www0.kumagaya.or.jp/cgi-bin/users/chichibu/bbs.cgi'; $bkhmpg = "http://www.kumagaya.or.jp/~chichibu/cgi1.html"; $file = "/dialup/chichibu/cgi-bin/bbs.dat"; $sendmail = '/usr/lib/sendmail'; # 掲示板へ記入したら管理者へメール通知するならON $send="on"; # メールの送り先 $myaddress = 'chichibu@po.kumagaya.or.jp'; # データ確認デバッグモード(通常は$test=""、各画面で変数状態を見たいときは"on") $test=""; # 最大登録数 $max=200; # メッセージの文字数制限(この値の半分が漢字数) $mojisu = 200; # 分類名配列 $bunruimei[1]="一般的なお話"; $bunruimei[2]="質問"; $bunruimei[3]="Mac仲間"; $bunruimei[4]="女の子専用"; # 分類毎の表示色 $buncol[1]="#000000"; # 黒 $buncol[2]="#0000FF"; # 青 $buncol[3]="#007700"; # 緑 $buncol[4]="#FF00FF"; # ピンク #################################### # # # メインルーチン(処理の分岐) # # # #################################### # 全体の流れを決定する $page=$in{'page'}; if ($in{'action'} eq 'main') { &main; } elsif ($in{'action'} eq 'kinyu') { &kinyu; } elsif ($in{'action'} eq 'help') { &help; } elsif ($in{'action'} eq 'check') { ✓ &kakunin; } elsif ($in{'action'} eq 'update') { &update; } 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 'sendmail') { &sendmail; &main; } # 詳細表示画面 elsif ($in{'action'} eq 'teisei') {&teisei;&main; } elsif ($in{'action'} eq 'hensin') {&hensin; &main; } elsif ($in{'action'} eq 'nexts') { &nexts; } elsif ($in{'action'} eq 'backs') { &backs; } else { &first; } # なくても良いが最終出口を示す exit; ############################################# # # # ヘルプ画面を表示する          # # # ############################################# sub help { # 表示出力処理 print "Content-type: text/html\n\n"; print < 掲示板の説明 EOM print '
'; print ''; print ''; print '
'; print "はじめまして、CGIおもちゃ箱掲示板です。\n"; print '

'; print "この掲示板は、みんなで楽しめるものを意識して作りました。\n"; print '
'; print "つまり、いろいろなメッセージを見て返事を書いたり、質問したり等です。\n"; print '
'; print "このページへ来られた方はお気軽にご利用ください。\n"; print '
'."\n"; print '
'; print '

'; print ''; print ''; print "\n"; print ''; print ''; print ''; print '
項目説明
'; print "記入について\n"; print ''; print "(1) 登録後に訂正や削除ができます、但し最初の登録時に訂正削除パスワードの設定が必要です。\n"; print '
'; print "(2) 分類を指定することができ、これにより分類を指定した表示をすることができます。\n"; print '
'; print "(3) メールアドレスの表示に対して、プライバシー保護指定にすると表示されません。そのかわりあなたのメールアドレスが必要の人にはメールアドレス請求処理によりその方へメールでお知らせします、と同時にあなたへも請求があったことをメールでお知らせします。\n"; print '
'; print "表示変更機能\n"; print ''; print "一般的な表示に加え、掲示内容をできるだけ多く見られるように1列と2列形式、また1画面に表示させる行数も変えることができます。それから記入時に設定した分類を指定することができます。\n"; print '
'; print "通常の掲示内容表示の状態で次のことができます。\n"; print '
'; print "・掲示内容に対して返信を書くことができます。質問の回答や感想などを返信欄にお書きください。方法はお名前の部分をクリックすると記入形式の画面になります、下の返信欄に記入後返信ボタンをクリック\n"; print '
'; print "・メールアドレスをクリックするとあなたの持っているメールソフトが起動してメールを送ることができます。\n"; print '
'; print "・ホームページアドレスをクリックすると、そのページへリンクします。\n"; print '
'; print "・右側の返信欄に『有』と表示してるのはその掲示内容に対して返信の書き込みがあったことを意味します。\n"; print '
'; print "日付の並び替え機能\n"; print ''; print "最初は、日付の新しいものを先頭に表示しますが、『日付の古いものから先に』をクリックすると古いものから順に見ることができます。\n"; print '
'."\n"; # 戻る print '
'; print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; print '
'; } ############################################# # # # データを読む           # # # ############################################# sub read { # データを読み各連想配列に加算する # 1 2 3 4 5 6 7 8 9 # 日付時刻、お名前、内容、分類、email、URL、プライバシー保護区分、削除用パスワード、返信 open(DB,"$file"); flock(DB,2); $j=0; # 配列の初期化 @data=(); while () { $bundt = $_; &bunkai; # 9は全部、他は指定分類のみ、指定なしも全件 if ($syurui == 9) { $data[$j]=$_ ;$j++} elsif ($syurui == $bunrui) { $data[$j]=$_ ;$j++} } # end of while flock(DB,8); close(DB); # データ数 $cnt=@data; # 1件目の日付時刻セット $bundt=$data[0]; &bunkai; $eday=$hizuke1; $etime=$hizuke2; # 最終の日付時刻セット $endno=$cnt-1; $bundt=$data[$endno]; &bunkai; $sday=$hizuke1; $stime=$hizuke2; } # end of read ############################################# # # # 登録データを読む(訂正削除用配列)  # # # ############################################# sub read2 { # データを読み各連想配列に加算する open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); # データ数 $cnt=@data; # 配列の初期化 %idxdt=(); # 各レコードを日時をキーにした連想配列にセットする foreach (@data) { # キー部をとる(左から18桁) $idx=substr($_,0,18); # キーを変数名に入れて1レコード全体をセットする $idxdt{$idx} = $_; } # end of foreach } # end of read2 ############################################# # # # データを読む(全件)          # # # ############################################# sub read3 { open(DB,"$file"); flock(DB,2); @data=; flock(DB,8); close(DB); } # end of read3 ######################## #            # # 項目分解ルーチン   # #            # ######################## sub bunkai { ($dt1,$dt2,$dt3,$bunrui,$dt5,$dt6,$dt7,$dt8,$dt9) = 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分"; # お名前がなかったら内容の20文字を使う if ($dt2 eq "") { $dt2 = substr($dt3,0,40) } # 内容の改行を元に戻す $dt3 =~ s/&k/\n/g; # 表示用に変換する $naiyo2 = $dt3; $naiyo2 =~ s/\n/
/g; # 返信の改行を元に戻す $dt9 =~ s/&k/\n/g; } # end of bunkai ############################################# # # # 最初に処理するルーチン         # # # ############################################# sub first { # 初期値セット $in{'page'}=1; # 内容は全件 $in{'syurui'}=9; # 表示は明細 $in{'hyoji'}=3; $in{'gyosu'}=10 ; $in{'sortkb'}=0; &main; } # end of first ############################################# # # # メイン処理画面を表示する    # # # ############################################# sub main { # 表示用変数 $page = $in{'page'}; $syurui = $in{'syurui'} ; $hyoji = $in{'hyoji'} ; $gyosu = $in{'gyosu'} ; $sortkb = $in{'sortkb'} ; &read; # 昇順にする if ($sortkb == 1) { @data=reverse(@data);} # ページ数計算・・・間違っていました。下に訂正しました。 ###if ($hyoji == 2) { $page_max = ($cnt /(2*$gyosu)) + 1;} ###else { $page_max = ($cnt / $gyosu) + 1;} # ページ数計算 (010913修正) if ($hyoji == 2) { $page_max = (($cnt-1) /(2*$gyosu)) + 1;} else { $page_max = (($cnt-1) / $gyosu) + 1;} # 整数部をとりだす ($page_max,$dummy)=split(/\./,$page_max); # 表示出力処理 print "Content-type: text/html\n\n"; print < 掲示板 EOM print ''; print ''; print ''; print "\n"; print ''; print "\n"; print "\n"; print "\n"; print '
'; print ''."\n"; print 'CGIおもちゃ箱の掲示板'."\n"; print '   開始日時終了日時登録件数表示頁最終頁
'; print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '
'; print '
'."\n"; print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '
'. "\n"; print '
'."\n"; print '
' . "\n"; print '' . "\n"; print '
' . "\n"; print '
$sday
$stime
$eday
$etime
$cnt$page$page_max
'."\n"; # 前頁表示 # ボタンを並べる # 上段 print ''; print ''; # 表示順序 print ''; print ''; # 前頁表示 print ''; print ''; # 次頁表示 print ''; print ''; print ''; print '
'; print '
' . "\n"; print '' . "\n"; &hidpara; if ($sortkb == 0) { $sortkbn = "日付の古いものを先に"; } else { $sortkbn = "日付の新しいものを先に"; } print '' . "\n"; print '
'. "\n"; print '
   '; if ($page == 1) { print ' '; } else { print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'; } # end of if print '
  '; if ($page == $page_max) { print ' '; } else { print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; } # end of if print '
  '; print '
' . "\n"; print ''."\n"; print '' . "\n"; print '' . "\n"; ##&hidpara; print '' . "\n"; print '
   '; $sels1="";$sels2="";$sels3="";$sels4=""; if ($syurui == 9) {$sels9 = "SELECTED";} elsif ($syurui == 1) {$sels1 = "SELECTED"; } elsif ($syurui == 2) {$sels2 = "SELECTED"; } elsif ($syurui == 3) {$sels3 = "SELECTED"; } elsif ($syurui == 4) {$sels4 = "SELECTED"; } else {$sels9 = "SELECTED"; } print ''. "\n"; print '   '; $selh1="";$selh2="";$selh3=""; if ($hyoji == 1) {$selh1 = "SELECTED";} elsif ($hyoji == 2) {$selh2 = "SELECTED"; } else {$selh3 = "SELECTED"; } print ''. "\n"; print '   '; $sel5="";$sel10="";$sel30="";$sel40="";$sel50=""; if ($gyosu == 5) {$sel5 = "SELECTED";} elsif ($gyosu == 10) {$sel10 = "SELECTED"; } elsif ($gyosu == 30) {$sel30 = "SELECTED"; } elsif ($gyosu == 40) {$sel40 = "SELECTED"; } elsif ($gyosu == 50) {$sel50 = "SELECTED"; } else {$sel20 = "SELECTED"; } print ''. "\n"; print '   
'."\n"; print ''. "\n"; # 該当データが0件の場合 if ($cnt == 0) { print '

'; print '
該当データは0件です、選択内容を変えてご覧ください
'."\n"; return } # end of if # 最初は詳細形式を表示する if ($hyoji == 1) { &disp1; } elsif ($hyoji == 2) { &disp2; } else { &disp3; } } # end of main ################################# # hiddenパラメータ共通項目  # ################################# sub hidpara { print ''."\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; print '' . "\n"; } # end of hidpara ########################## #            # #  詳細表示ルーチン  # #            # ########################## sub disp3 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { #print ''; # 1列目はページカウンタ*行数+$i $lno=$gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; print ''; print ''."\n"; print ''."\n"; # 返信の有無 if (length($dt9) > 1) { $umu = "有" } else { $umu = " " } print ''."\n"; print ''."\n"; # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
日付お名前内 容返信
'.$lno.''."\n"; if ($test eq "on") { print '
'.$bundt.''."\n"; } # テスト表示 print '
'.$hizuke1.'
'.$hizuke2.'
'; $act="meisai"; print ''.$dt2.''; print '
'."\n"; # Email if ($dt5 ne ""){ # 非保護の場合は表示する if ($dt7 ne "on") { $ml="E-mail:$dt5へメール"; print ''.$ml.'
'; } # 保護の場合は非表示する else { $act="email"; print 'メールの請求はここから'; } # end of else } # end of if # url if ($dt6 ne "") { print "
$dt6へリンク"; } print '
'.$naiyo2.''.$umu.'
'; print "\n"; } # end of disp3 ########################## #            # #  1列表示ルーチン  # #            # ########################## sub disp1 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { # 項目分解処理 ##print ''; # 1列目はページカウンタ*行数+$i $lno=$gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; print ''."\n"; print ''."\n"; print ''."\n"; # 返信の有無 if (length($dt9) > 1) { $umu = "有" } else { $umu = " " } print ''."\n"; print ''; # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
日付お名前内 容返信
'.$lno.''.$hizuke.''; $act="meisai"; print ''.$dt2.''; print ''.$naiyo2.''.$umu.'
'; print "\n"; } # end of disp1 ########################## #            # #  2列表示ルーチン  # #            # ########################## sub disp2 { print "\n"; print "\n"; # 行数分だけ繰り返す for($i=1; $i<=$gyosu; $i++) { # 1列目はページカウンタ*2*行数+$i $lno=2 * $gyosu * ($page - 1) + $i; $no=$lno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; # 分類別色 $iro=$buncol[$bunrui]; print ''; print ''."\n"; $act="meisai"; print ''."\n"; print ''."\n"; # 2列目は1列目+行数 $rno=$lno + $gyosu; if ($rno <= $cnt) { $no=$rno-1; # 項目分解処理 $bundt=$data[$no]; &bunkai; print ''."\n"; $act="meisai"; print ''."\n"; print ''."\n"; print ''; } # end of if # 最終データを表示したら抜ける if ($lno >= $cnt) { last } } # end of for print '
日付お名前日付お名前
'.$lno.''.$hizuke.''; print ''.$dt2.''; print ''.$rno.''.$hizuke.''; print ''.$dt2.''; print '
'; print "\n"; } # end of disp2 ############################################# # # # 掲示板新規記入処理          # # # ############################################# sub kinyu { print "Content-type: text/html\n\n"; print < 掲示板への記入

掲示板への記入

EOM # 外側の飾り線(画面の設定によってはわくとして表示しないことがある) print ''; print ''; print '' . "\n"; print '' . "\n"; print '記入内容はどこに入れますか? '. "\n"; print '

'; print 'お名前 
' . "\n"; print '
'; print 'メッセージをどうぞ(漢字の場合100文字以内)'; print '
'; print '' . "\n"; print '

'; print 'メールアドレス  ' . "\n"; print '
'; print 'オン=保護する・オフ=しない' . "\n"; print '
'; print ''; print '*プライバシー保護をオンにするとメールアドレスが掲示板から隠れ、要求があった場合'; print '
'; print ' 請求者にメールでアドレスを送り同時にあなたへも要求があったことをメールします。'; print '
'; print '

'; print 'ホームページURL http://
' . "\n"; print '
'; print '訂正削除パスワード ' . "\n"; print '
'; print ''; print '*登録後にあなたが訂正又は削除する場合に必要です。未設定時は訂正削除不可'; print ''; print '

'; print '
'; print '  ' . "\n"; print '
'; # 共通データ渡し &hidpara; # 登録日時セット ($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桁処理 $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 '' . "\n"; print '' . "\n"; print ''. "\n"; # 戻る print '

'; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print ''. "\n"; # 外側の飾り線 print '
'; print ''. "\n"; } # end of kinyu ########################################## # # # 入力されたデータのチェックルーチン # # # ########################################## sub check { # なにも入力がない場合 if ($in{'namae'} eq "" && $in{'naiyo'} eq "") { &error(2); } # 英数字と@と.と_と-(大文字と小文字の違いを無視するiフラグ) if ($in{'email'} =~ /[^a-z0-9@._-]/i) { &error(3); } # メールアドレスが入力されたとき1つの@とその後ろに.が含まれているばOKでそうでないならエラー if ($in{'email'} ne "") { if (!($in{'email'} =~ /.*\@.*\..*/)) { &error(3); }} # メールアドレスが短すぎる場合 if ($in{'email'} ne "") {if (length($in{'email'}) < 6) { &error(3); }} } ############################################# # # # 入力データ登録確認画面ルーチン     # # # ############################################# sub kakunin { print "Content-type: text/html\n\n"; print < 掲示板入力データの確認

掲示板データの確認


EOM # フォームからの入力データ # キーとなる日時 $nichiji=$in{'nichiji'}; $yy=substr($nichiji,0,4); $mm=substr($nichiji,4,2); $dd=substr($nichiji,6,2); $ji=substr($nichiji,8,2); $fun=substr($nichiji,10,2); $byo=substr($nichiji,12,2); # 時刻表示用 $jikan="$yy年$mm月$dd日$ji時$fun分$byo秒"; # フォーム入力データ &form_data; print ''; # 分類名 print ""."\n"; print ""."\n"; # 表示用に改行コードを<BR>タグにする $naiyo2 = $naiyo; $naiyo2 =~ s/&k/
/g; # 管理者へのメール用に改行コードを\nにする $naiyo3 = $naiyo; $naiyo3 =~ s/&k/\n/g; print ""."\n"; print ""."\n"; print ""."\n"; print ""."\n"; print ""."\n"; print "
分類$bunruimei[$bunrui]
お名前$namae
メッセージ$naiyo2
メールアドレス$email
プライバシー保護"."\n"; if ($hogo eq "on") { print "入力されたメールアドレスは非表示とする"."\n"; } else { print "入力されたメールアドレスを表示します"."\n"; } print "
ホームページURL$url
訂正削除パスワード$pwd1
"."\n"; print '

'; print "登録日時:$jikan"."\n"; print '

'; # 確認 print '
' . "\n"; print '' . "\n"; # データ追加 $value = "$nichiji\t$namae\t$naiyo\t$bunrui\t$email\t$url\t$hogo\t$pwd1\n"; if ($test eq "on") { print "追加データ=$value\n";print "メール内容=$naiyo3\n"; } &update; print '
'; print ''."\n"; print '
'."\n"; &hidpara; print "
\n"; print "\n"; print "\n"; # 記入時のメール通知 if ($send eq "on") { &mymail } } # end of kakunin ############################################# # # # 管理者へのメール送信ルーチン     # # # ############################################# sub mymail { $message = < 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); } $email=$in{'email'}; $url=$in{'url'}; $pwd1=$in{'pwd1'}; $hogo=$in{'hogo'}; # タグの無効化 $ckdt=$namae ; &tagck ; $namae=$ckdt; $ckdt=$naiyo ; &tagck ; $naiyo=$ckdt; $ckdt=$email ; &tagck ; $email=$ckdt; $ckdt=$url ; &tagck ; $url=$ckdt; $ckdt=$pwd1 ; &tagck ; $pwd1=$ckdt; } # end of form_data ############################### # タグの無効化サブルーチン ############################### sub tagck { $ckdt =~ s//>/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 { $pwd1=$in{'pwd1'}; # 登録済みデータを読み配列にセットする if ($pwd1 ne "subetekesu") { &read3; unshift(@data,$value);} else {push(@data,$value);} # 掲示板は先頭から古い順になっているのでそのまま1番目のデータをシフトする $a=@data; if ($a > $max) { $herasu=$a - $max; for ($i=1; $i<=$herasu; $i++) { pop(@data) } } # end of if # ファイル登録 if (!open(WRITE,">$file")) { &error(0); } flock(WRITE,2); print WRITE @data; 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 '掲示板' . "\n"; print '' . "\n"; print '

掲示板の入力で下記のエラーが発生しました

' . "\n"; print '

'; print "$error_msg\n"; print '

'; if ($test eq "on") { if ($error eq "92") { print "登録パスワード=$dt8,入力パスワード=$pwd1,\n";print '

'; } } # end of if # リロードでもどると入力データが消えてしまうので print 'ブラウザ画面の戻るをクリックする'."\n";; print '' . "\n"; # サブルーチンからプログラムを抜けるので exit; } ############################################# # # # 明細データの訂正・削除ルーチン    # # # ############################################# sub meisai { &read2; # キー $keyno=$in{'keyno'}; # 配列番号(次前データ移動用) $tbno=$in{'tbno'}; # 実配列番号は−1 $tbno--; # 項目分解処理 $bundt=$idxdt{$keyno}; &bunkai; &meisai_display; } # end of meisai ############################################# # # # 明細データの訂正・削除ルーチン    # # (次前データ処理用) # ############################################# sub meisai2 { # 対象データ $syurui=$in{'syurui'}; &read; # 項目分解処理 $bundt=$data[$tbno]; &bunkai; # キー $keyno=$dt1; &meisai_display; } # end of meisai2 ############################################# # # # 明細データの共通表示ルーチン     # # # ############################################# sub meisai_display { # 明細表示データbヘ配列a{1 $mno=$tbno+1; print "Content-type: text/html\n\n"; print < 掲示板の詳細

掲示板の詳細

EOM print "
a@$mno / $cnt
\n"; if ($test eq "on") {print "keyno=$keyno,bundt=$bundt\n" } print '
' . "\n"; # 外側の飾り線 print ''; print ''; if ($bunrui == 2) {$sel2 = "SELECTED";} elsif ($bunrui == 3) {$sel3 = "SELECTED"; } elsif ($bunrui == 4) {$sel4 = "SELECTED"; } else {$sel1 = "SELECTED"; } print '記入内容はこの分類に入っています '. "\n"; print '

'; print 'お名前 
' . "\n"; print '
'; print 'メッセージをどうぞ'; print '
'; print '' . "\n"; print '

'; # メール保護ならば表示しない if ($dt7 eq "on") { print ''; print "プライバシー保護設定のため表示しません。\n"; print "メールアドレスの変更は、1度プライバシー選択をオフに訂正して\n"; print "再度この画面を呼び出してから訂正してください。\n"; print ''; $chk="checked"; } # end of if else { print 'メールアドレス  ' . "\n"; $chk=""; } # end of else print '
'; print "オン=保護する・オフ=しない\n"; print '
'; print ''; print '*プライバシー保護をオンにするとメールアドレスが掲示板から隠れ、要求があった場合'; print '
'; print ' 請求者にメールでアドレスを送り同時にあなたへも要求があったことをメールします。'; print '
'; print '

'; print 'ホームページURL http://' . "\n"; print '

'; print '訂正削除パスワード ' . "\n"; print '
'; print ''; print '*訂正又は削除する場合に必要です。未設定時は訂正削除不可'; print ''; print '

'; # 訂正か削除か選択する print '
'; print '
'; print '訂正削除なし' . "\n"; print '   '; print '訂正します' . "\n"; print '   '; print '削除します' . "\n"; print '   '; print ''."\n"; print ''."\n"; &hidpara; print '' . "\n"; print '' . "\n"; print '
'."\n"; print '
'. "\n"; ############################ # ボタンを並べる #print '
'; print ''; print ''; # 戻る print ''; print ''; # 前データ print ''; print ''; # 次データ print '
'; print '
' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; print '
   '; if ($tbno == 0) { print '  '; } else { print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'; } # end of if print '
   '; if (($tbno+1) == $cnt) { print '  '; } else { print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '' . "\n"; print '
'. "\n"; } # end of if print '
'."\n"; print '

'; print '
'; print '返信メッセージをどうぞ'; print '
'; print '
' . "\n"; print '' . "\n"; print '

'; print '' . "\n"; print ''."\n"; &hidpara; print '' . "\n"; print '
'. "\n"; print '
'; # 外側の飾り線 print ''; print ''. "\n"; } # end of meisai ########################################## # # # 次データ表示処理(詳細)     # # # ########################################## sub nexts { $tbno=$in{'tbno'}; $tbno++; &meisai2; } # end of nexts ########################################## # # # 前データ表示処理(詳細)     # # # ########################################## sub backs { $tbno=$in{'tbno'}; if ($tbno > 0) { $tbno--; } &meisai2; } # end of backs ##################### # データ訂正 ##################### sub teisei { # 訂正削除なしの場合 if (($in{'action'} eq 'teisei') && ($in{'syori'} == 0)) { return } # 入力項目チェックへ ✓ # フォーム入力データ &form_data; &read2; # キー $keyno=$in{'keyno'}; # 管理者用強制パスワード if ($pwd1 ne "nopassword") { # 訂正パスワードチェック $bundt=$idxdt{$keyno}; ($dt1,$dt2,$dt3,$dt4,$dt5,$dt6,$dt7,$dt8,$dt9) = split(/\t/,$bundt); #登録パスワードの改行コードをカットしたものと比較する (98.7.11) $pck=$dt8; $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 } # ここからは訂正選択時処理 # 保護されたメールアドレスは一度保護をオフにしないと訂正できない if ($dt8 eq "on") { $email=$dt5 } # データ訂正 $value = "$keyno\t$namae\t$naiyo\t$bunrui\t$email\t$url\t$hogo\t$pwd1\t$dt9\n"; $idxdt{$keyno}=$value; &file_write; } # end of teisei ##################### # データ削除 ##################### sub sakujo { # データ削除 delete $idxdt{$keyno}; &file_write; } # end of sakujo ##################### # 返信処理 ##################### sub hensin { # フォーム入力データ $hensin2=$in{'hensin'}; # メッセージの改行のみをカットする @chk = split(/\n/,$hensin2); $msg=""; foreach (@chk) { if (length($_) > 1) { $msg=$msg.$_."\n"; } # end of if } # end of foreach $hensin2=$msg; $hensin2 =~ s/\015\012/\n/g; $hensin2 =~ s/\015/\n/g; $hensin2 =~ s/\n/&k/g; # 文字数チェック if (length($hensin2) > $mojisu) { $hensin2 = substr($hensin2,0,$mojisu); } &read2; # キー $keyno=$in{'keyno'}; $bundt=$idxdt{$keyno}; &bunkai; # 内容の改行を元に戻す $dt3 =~ s/\n/&k/g; # 返信データのみ更新する $value = "$dt1\t$dt2\t$dt3\t$bunrui\t$dt5\t$dt6\t$dt7\t$dt8\t$hensin2"; $value =~ s/\n//g; $value = "$value\n"; $idxdt{$keyno}=$value; &file_write; } # end of hensin ########################## # ファイル登録共通処理 # ########################## 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 } ############################################# # # # E−MAIL請求画面処理         # # # ############################################# sub email { &read2; # キー $keyno=$in{'keyno'}; # 項目分解処理 $bundt=$idxdt{$keyno}; &bunkai; print "Content-type: text/html\n\n"; print < メールアドレス請求の確認

メールアドレス請求の確認


EOM print '
' . "\n"; print ''; # 分類名 print ""."\n"; print ""."\n"; print ""."\n"; print ""."\n"; print "
分類$bunruimei[$bunrui]
お名前$dt2
メッセージ$naiyo2
ホームページURL$dt6
"."\n"; print '

'; print 'あなたのメールアドレス  ' . "\n"; # 確認 print '

'; print '
'; print '
'; print '' . "\n"; print '' . "\n"; print ''."\n"; &hidpara; print ''. "\n"; print '
   '; print '
' . "\n"; print '' . "\n"; print '' . "\n"; &hidpara; print '
'. "\n"; print '
'; print '
'; print ''. "\n"; } # end of email ############################################# # # # メール送信ルーチン           # # # ############################################# sub sendmail { &read2; # キー $keyno=$in{'keyno'}; # 項目分解処理 $bundt=$idxdt{$keyno}; &bunkai; # # 請求先への連絡 # $message = <