全体表示

基本構造へ戻る

#サブルーチン呼び出し
&xxxx;

#HTML領域指定
print <<"html";
~から~
html
で囲まれた範囲

*全体表示*

######################################################
# 設定
######################################################
#
#
#!/usr/local/bin/perl
require './lib/jcode.pl';
local($key,$t_titol,$t_post,$t_memo,$val,$buf);
#
#プログラム名称
$prgname = "./bbs.cgi";
# ファイルロック形式
# → 0=no 1=symlink関数 2=mkdir関数
$lockkey = 2;
# ロックファイル名
$lockfile = './lock/newform.lock';
#記録データファイル名称
$logfile = "./data/bbs.dat";
$titol = "掲示板";
&decode;
&date;
#
#
######################################################
# モード切替 条件分岐#
######################################################
#
#
$mode = $FORM{'mode'};
if($mode eq "view"){&view;}#ログ表示
if($mode eq "log"){&log;}#ログ書込
if($mode eq "delet"){&delet;}#削除
if($mode eq "delform"){&delform;}#削除確認
if($mode eq "edit"){&edit;}#修正削除
if($mode eq "ediform"){&ediform;}#修正確認
if($mode eq "correct"){&correct;}#修正
if($mode eq "n_post"){&n_post;}#ログ投稿
$word = $FORM{'word'};
$cond = $FORM{'cond'};
&n_post;
#
#
######################################################
# ログ記録
######################################################
#
#
sub log{
&scook($FORM{'m_post'},$FORM{'m_titol'});
#入力確認
$m_titol = $FORM{'m_titol'};
$m_post = $FORM{'m_post'};
$m_memo = $FORM{'m_memo'};
$count=0;
$xnum=0;
if($FORM{'m_titol'} eq "") {&error("タイトルをお書きください");}
if($FORM{'m_post'} eq "") {&error("お名前をお書きください");}
if($FORM{'m_memo'} eq "") {&error("コメントをお書き下さい");}
#二重投稿禁止
# ロック処理
&lock if ($lockkey);
open(IN,"$logfile") ;
$top = ;
($cqxnum,$cqdate,$cqm_titol,$cqm_post,$cqm_memo) = split(/<>/, $top);
if ($FORM{'ttitol'} eq $cqm_titol && $FORM{'tmemo'} eq $cqm_memo) {
&error("二重投稿は禁止です。","lock");
}
close(IN);
# ロック解除
&unlock if ($lockkey);
# ロック処理
&lock if ($lockkey);
open (IN,"$logfile");
@xfile = ;
close(IN);
($qxnum,$qdate,$qm_titol,$qm_post,$qm_memo) = split(/\<>/, $xfile[0]);
$xnum=$qxnum+1;
unshift(@xfile,"$xnum<>$date<>$m_titol<>$m_post<>$m_memo<>\n");
open(OUT,">$logfile");
print OUT @xfile;
close(OUT);
# ロック解除
&unlock if ($lockkey);
#
#
######################################################
# 書き込み確認・一件表示
######################################################
#
#
# ロック処理
&lock if ($lockkey);
open(IN,"$logfile");
$top = ;
($xqxnum,$xqdate,$xqm_titol,$xqm_post,$xqm_memo) = split(/<>/, $top);
close(IN);
# ロック解除
&unlock if ($lockkey);
$xqm_memo =~ s/</ $xqm_memo =~ s/>/>/g;
&head;
print <<"html";
<div id="wrapper">
<h2>$titol</h2>
<table border="0"><tr><td>
[$xqm_titol][$xqm_post]($xqdate)
</td></tr><tr><td>
$xqm_memo
</td></tr></table>
<a href="$prgname">記事投稿</a> <a href="$prgname?mode=view">記事\表\示</a> <a href="$prgname?mode=edit">修正・削除</a>
</div>
html
exit;
}
#
#
######################################################
# ログ出力
######################################################
#
#
sub view{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
<a href="$prgname">記事投稿</a> 
<a href="$prgname?mode=edit">修正・削除</a>
html
# ロック処理
&lock if ($lockkey);
open (IN,"$logfile");
while() {
($qxnum,$qdate,$qm_titol,$qm_post,$qm_memo) = split(/\<>/);
$qm_memo =~ s/</ $qm_memo =~ s/>/>/g;
print <<"html";
<div id="wrapper">
<table cellspacing="0" cellpadding="0"><tr><td>
[ $qm_titol ][ $qm_post ]($qdate)
</td></tr><tr><td>
$qm_memo
</td></tr><tr>
</td></tr></table>
</div>
html
}
close(IN);
# ロック解除
&unlock if ($lockkey);
exit;
}
#
#
######################################################
# ログ修正削除
######################################################
#
#
sub edit{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
<a href="$prgname">記事投稿</a> <a href="$prgname?mode=view">記事\表\示</a>
html
# ロック処理
&lock if ($lockkey);
open (IN,"$logfile");
while() {
($qxnum,$qm_date,$qm_titol,$qm_post,$qm_memo) = split(/\<>/);
print <<"html";
<div id="wrapper">
<div id="main">
(No:$qxnum)<br>
[$qm_titol][$qm_post]<br>
$qm_memo<br>
</div>
<div id="smain">
<table border="0" cellpadding="0" cellspacing="0"><tr><td>
<form action=\"$prgname\" method=\"post\">
<input type=hidden name=mode value="delform">
<input type="checkbox" name="tsus" value="$qxnum">
<input type="hidden" name="tm_titol" value="$qm_titol">
<input type="hidden" name="tm_date" value="$qm_date">
<input type="hidden" name="tm_post" value="$qm_post">
<input type="hidden" name="tm_memo" value="$qm_memo">
<input type="submit" value="削除" class="bttn10">
</form>
</td><td> </td><td>
<form action=\"$prgname\" method=\"post\">
<input type=hidden name=mode value="ediform">
<input type="checkbox" name="tsus" value="$qxnum">
<input type="hidden" name="tm_titol" value="$qm_titol">
<input type="hidden" name="tm_date" value="$qm_date">
<input type="hidden" name="tm_post" value="$qm_post">
<input type="hidden" name="tm_memo" value="$qm_memo">
<input type="hidden" name="" value="">
<input type="submit" value="修正" class="bttn10">
</form>
</td></tr></table>
</div>
</div>
html
}
close(IN);
# ロック解除
&unlock if ($lockkey);
exit;
}
#
#
######################################################
# 削除記事確認
######################################################
#
#
sub delform{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
html
$tsus = $FORM{'tsus'};
$tm_date = $FORM{'tm_date'};
$tm_titol = $FORM{'tm_titol'};
$tm_post = $FORM{'tm_post'};
$tm_memo = $FORM{'tm_memo'};
print <<"html";
<div id="wrapper">
<div id="main">
No.<$tsus>
<input type="hidden" name="ssus" value="$tsus">
<p><input type="text" name="sm_date" value="$tm_date">年月日</p>
<p>名前<br><input type="text" size="50" name="sm_post" value="$tm_post"></p>
<p>タイトル<br><input type="text" size="50" name="sm_titol" value="$tm_titol"></p>
<p>メモ<br><textarea cols="70" rows="10" name="sm_memo" value="$tm_memo" class="i_text5">$tm_memo</textarea></p>
</div>
<form action=\"$prgname\" method=\"post\">
<input type=hidden name=mode value="delet">
<input type="hidden" name="sus" value="$tsus">
<input type="hidden" name="sm_titol" value="$tm_titol">
<input type="hidden" name="sm_post" value="$tm_post">
<input type="hidden" name="sm_memo" value="$tm_memo">
<input type="submit" value="削除" class="bttn10">
</form>
</div>
</body>
</html>
html
exit;
}
#
#
######################################################
# 記事削除
######################################################
# # sub delet{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
html
$m_titol = $FORM{'sm_titol'};
$m_post = $FORM{'sm_post'};
$m_memo = $FORM{'sm_memo'};
$tsus = $FORM{'sus'};
#該当データ削除
@new1=();
# ロック処理
&lock if ($lockkey);
open(IN,"$logfile");
while () {
($qxnum,$qm_date,$m_titol,$m_post,$m_memo) = split(/\<>/);
if ($FORM{'sus'} == $qxnum){ next;}
push(@new1,$_);
}
close(IN);
# ロック解除
&unlock if ($lockkey);
# ロック処理
&lock if ($lockkey);
open(OUT,">$logfile");
print OUT @new1;
close(OUT);
# ロック解除
&unlock if ($lockkey);
print <<"html";
<div id="wrapper">
<div id="main">
<p>番号「$tsus」<br>
[$FORM{'sm_titol'}][$FORM{'sm_post'}]</p>
<p>$FORM{'sm_memo'}</p>
<p>上記ログを削除しました。</p>
<div>
<a href="$prgname?" class="blk">戻る</a>
 <a href="$prgname?mode=view">記事\表\示</a>
</div>
html
exit;
}
#
#
######################################################
# 修正確認
######################################################
#
#
sub ediform{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
html
$tsus = $FORM{'tsus'};
$tm_date = $FORM{'tm_date'};
$tm_titol = $FORM{'tm_titol'};
$tm_post = $FORM{'tm_post'};
$tm_memo = $FORM{'tm_memo'};
print <<"html";
<div id="wrapper">
<div id="main">
<form action=\"$prgname\" method=\"post\">
<input type=hidden name=mode value="correct">
No.<$tsus>
<input type=hidden name=ssus value="$tsus">
<input type=hidden name="sm_pdate" value="$tm_pdate">
<p>
<input type="text" name="sm_date" value="$tm_date">年月日</p>
<p>
名前<br><input type="text" size="50" name="sm_post" value="$tm_post"></p>
<p>
タイトル<br><input type="text" size="50" name="sm_titol" value="$tm_titol"></p>
<p>
メモ<br><textarea cols="70" rows="10" name="sm_memo" value="$tm_memo" class="i_text5">$tm_memo</textarea></p>
</div>
<input type="submit" value="修正" class="bttn10">
</form>
</div>
</body>
</html>
html
exit;
}
#
#
######################################################
# 記事修正
######################################################
#
#
sub correct{
print "Content-type: text/html\n\n";
&head;
print <<"html";
<h2>$titol</h2>
<a href="$prgname">記事投稿</a> 
html
$rsus = $FORM{'ssus'};
$rm_date = $FORM{'sm_date'};
$rm_titol = $FORM{'sm_titol'};
$rm_post = $FORM{'sm_post'};
$rm_memo = $FORM{'sm_memo'};
##修正書き込み
@new=();
# ロック処理
&lock if ($lockkey);
open(IN,"$logfile");
#$top = ;
while () {
chop;
($qxnum,$qm_date,$qm_titol,$qm_post,$qm_memo) = split(/\<>/);
if ($FORM{'ssus'} == $qxnum){
$_ = "$rsus<>$rm_date<>$rm_titol<>$rm_post<>$rm_memo<>";
}
push(@new,"$_\n");}
close(IN);
# ロック解除
&unlock if ($lockkey);
# ログを更新
#unshift(@new,$top);
# ロック処理
&lock if ($lockkey);
open(OUT,">$logfile");
print OUT @new;
close(OUT);
# ロック解除
&unlock if ($lockkey);
print <<"html";
<div id="wrapper">
<div id="main">
rsus「番号:$rsus」<br>
<p>「日付:$rm_date」</p>
<p>タイトル:$rm_titol</p>
<p>名前:$rm_post</p>
<p>メモ:$FORM{'sm_memo'}</p>
</div>
<a href="$prgname?mode=view&pass1=$qpass1" class="blk">トップへ戻る</a>
</div>
</body>
</html>
html
exit;
}
#
#
######################################################
# 新規記事投稿
######################################################
#
#
sub n_post {
print "Content-type: text/html\n\n";
local($cpost,$ctitol) = &gcook;
&head;
print <<"html";
<div id="wrapper">
<a href="$prgname?mode=view">記事\表\示</a>
<form method="post" action="$prgname">
<input type=hidden name=mode value="log">
<h2>記事投稿</h2>
<div id="main">
<p>タイトル:<br><input type="text" size="40" name="m_titol" value="$ctitol" class="i_text4"></p>
<p>投稿者:<br><input type="text" size="40" name="m_post" value="$cpost" class="i_text4"></p>
<p>記事内容:<br><textarea cols="70" rows="10" name="m_memo" value="" class="i_text5"></textarea>
</p>
</div>
<p><input type="submit" value="書 込" class="bttn10">
<input type="reset" value="取 消" class="bttn10">
<input type="button" value="閉じる" onClick=window.close() class="bttn10"></p>
</form>
</div>
</body>
</html>
html
exit;
}
#
#
######################################################
# 日付セット#
######################################################
#
#
sub date{
$times = shift; if (!$times) { $ENV{'TZ'} = "JST-9"; $times = time; }
($sec,$min,$hour,$mday,$mon,$year,$wday) = (localtime($times))[0..6];
@week = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
# 日時のフォーマット
$date_r = sprintf("%04d/%02d/%02d(%s) %02d:%02d",
$year+1900,$mon+1,$mday,$wk[$wday],$hour,$min);
$week = ("日","月","火","水","木","金","土")[$wday];
$mon++;
$year += 1900;
$date = "$year年$mon月$mday日";
$date1 = "$mon";
$date2 = "$mday";
$pdate = "$year";
$pdate1 = "$mon";
$pdate2 = "$mday";
}
#
#
######################################################
# デコード#
######################################################
#
#
sub decode{
if ($ENV{'REQUEST_METHOD'} eq "POST"){
$post_flag = 1;
read(STDIN, $buf, $ENV{'CONTENT_LENGTH'});
} else {
$post_flag = 0;
$buf = $ENV{'QUERY_STRING'};}
undef(%in); $page = 0;
@pair = split (/&/,$buf);
foreach (split(/&/, $buf)) {
local($key, $val) = split(/=/, $_);
#($names, $val) = split (/=/, $_);
#$val =~ tr/ / /;
$val =~ tr/+/ /;
$val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("c", hex($1))/eg;
&jcode'convert(*val,"sjis","","z");
# 改行処理
$val =~ s/\r\n/<br>/g;
$val =~ s/\r/<br>/g;
$val =~ s/\n/<br>/g;
$val =~s/;/,/g;
# タグ処理
$val =~ s/&/&/g;
$val =~ s/"/"/g;
$val =~ s/ $val =~ s/>/>/g;
$FORM{$names} = $val;
# ページ繰り越し
if ($key =~ /^page(\d+)$/) {
$page = $1;
}
$FORM{$key} .= "\0" if (defined($FORM{$key}));
$FORM{$key} .= $val;
}
}
#
#
######################################################
# ヘッダ
######################################################
#
#
sub head{
print <<"html";
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=Shift_JIS">
<meta http-equiv="content-style-type" content="text/css">
<title>$titol</title>
</head>
<link rel="stylesheet" type="text/css" href="./css/style.css">
html
}
#
#
######################################################
# エラー処理
######################################################
#
#
sub error{
print < <body>
<div align="center">
<table border=1 cellpadding=18 cellspacing=0 width="450">
<tr><td align="center">
<h5>確認して下さい♪</h5>
<font color="hotpink">$_[0]</font>
<p>
<form>
<input type="button" value="戻る" OnClick="javascript:history.back();" class="bttn1">
</form>
</td></tr></table>
</div>
</body>
</html>
html
exit;
}
#
#
######################################################
# ロック処理 #
######################################################
#
#
sub lock {
# 1分以上古いロックは削除する
if (-e $lockfile) {
local($mtime) = (stat($lockfile))[9];
if ($mtime < time - 60) { &unlock; }
}
local($retry) = 5;
# symlink関数式ロック
if ($lockkey == 1) {
while (!symlink(".", $lockfile)) {
if (--$retry <= 0) { &error('LOCK is BUSY'); }
sleep(1);
}
# mkdir関数式ロック
} elsif ($lockkey == 2) {
while (!mkdir($lockfile, 0755)) {
if (--$retry <= 0) { &error('LOCK is BUSY'); }
sleep(1);
}
}
$lockflag=1;
}
#
#
######################################################
# ロック解除 #
######################################################
#
#
sub unlock {
if ($lockkey == 1) { unlink($lockfile); }
elsif ($lockkey == 2) { rmdir($lockfile); }
$lockflag=0;
}
#
#
######################################################
# クッキーセット
######################################################
#
#
sub scook{
local(@cook) = @_; local($gmt, $cook, @t, @m, @w);
@t = gmtime(time + 60*24*60*60); @m = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');
@w = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat');
# 国際標準時を定義
$gmt = sprintf("%s, %02d-%s-%04d %02d:%02d:%02d GMT",
$w[$t[6]], $t[3], $m[$t[4]], $t[5]+1900, $t[2], $t[1], $t[0]);
# 保存データをURLエンコード
$cook='';
foreach (@cook) {
s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;
$cook .= "$_<>";
}
# 格納
print "Set-Cookie: bbs=$cook; expires=$gmt\n";
print "Content-type: text/html\n\n";
}
#
#
######################################################
# クッキーゲット
######################################################
#
#
sub gcook{
local($key, $val, *cook);
# クッキーを取得
$cook = $ENV{'HTTP_COOKIE'};
# 該当IDを取り出す
foreach ( split(/;/, $cook) ) {
($key, $val) = split(/=/);
$key =~ s/\s//g;
$cook{$key} = $val;
}
# データをURLデコードして復元
@cook=();
foreach ( split(/<>/, $cook{'bbs'}) ) {
s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1))/eg;
push(@cook,$_);
}
return (@cook);
}
exit;
#
#
######################################################