に入れるタイトル */ $title1 = 'P-BBS'; /* 掲示板のTOPタイトル(HTML可)*/ $title2 = 'P-BBS'; /* タグ */ $body = ''; /* 管理者用パスワード。必ず変更して下さい。*/ $admin_pass = 'asdfg'; /* ログ保存ファイル */ $logfile = 'bbs.log'; /* TOPページをHTMLに書き出すか (yes=1 no=0)*/ $htmlw = 0; /* 静的HTMLを書き出す場合のHTMLファイル */ $html_file = 'pbbs.html'; /* 戻り先(HOME)*/ $home = 'http://hogehoge.com'; /* 一ページあたりの表示記事数 */ $page_def = 10; /* 最大記録件数 これを越えると古い物から過去ログへ移ります。*/ $max = 30; /* 同一ホストからの連続投稿を制限 --> 秒数を記述するとその時間以上を経過しないと連続投稿できない*/ $w_regist = 30; /* 文中で自動リンクするかどうか(yes=1 no=0)*/ $autolink = 1; /* HTMLタグを有効にするか(yes=1 no=0)*/ $tag = 0; /* タイトル無しで投稿された場合 */ $mudai = '(無題)'; /* 使用するファイルロックのタイプ(mkdir=1 flcok=2 使わない=0)*/ define("LOCKEY", 1); /* mkdirロックを使う時のディレクトリ名 */ define("LOCK" , "plock"); /* >がついた時の色 */ $re_color = "#AA5620"; /* 過去ログ作成する */ $past_key = 1; /* 過去ログ番号ファイル */ $past_no = "pastno.log"; /* 過去ログ作成ディレクトリ(書き込み権限必要) */ $past_dir = "./"; /* 過去ログ一つに書き込む行数 */ $past_line= "50"; //---------設定ここまで-------------- function head(&$dat){ //ヘッダー表示部 global $mode,$no,$PHP_SELF,$logfile,$title1,$title2,$body,$p_bbs; //クッキーを頂きます list($r_name,$r_mail) = explode(",", $p_bbs); if($mode == "resmsg"){ //レスの場合 $res = file($logfile); $flag = 0; while (list($key, $value) = each ($res)) { list($rno,$date,$name,$email,$sub,$com,$url) = explode("<>", $value); if ($no == "$rno"){ $flag=1; break; } } if ($flag == 0) error("該当記事が見つかりません"); $r_sub = "Re:$sub"; $r_com = ">$com"; $r_com = eregi_replace("
","\r> ",$r_com); } $head=' '.$title1.' '; $dat=$head.$body.'
'.$title2.'
title
name
mail
url
comment
pass



'; } function foot(&$dat){ //フッター表示部 global $PHP_SELF,$home; $dat.='
No. pass
[ Home ] [ admin ] [ old_log ]

- P-BBS -
'; } function Main(&$dat){ //記事表示部 global $logfile,$page_def,$page,$PHP_SELF,$autolink,$re_color; $view = file($logfile); $total = sizeof($view); $total2= $total; (isset($page)) ? $start = $page : $start = 0; $end = $start + $page_def; for($s = $start;$s <= $end;$s++){ if(!$view[$s]) break; list($no,$now,$name,$email,$sub,$com,$url, $host,$pw) = explode("<>", $view[$s]); if($url){ $url = "HP";} if($email){ $email = "Mail";} // >がある時は色変更 $com = eregi_replace("(>)([^<]*)", "\\1\\2", $com); // URL自動リンク if ($autolink) { $com=auto_link($com); } $dat.="
\n"; $dat.="\n"; $dat.="\n"; $dat.="\n"; $dat.="
 $sub / $name[ Res ]

    $com
No.$no
$email $url $now
\n"; $dat.="
\n

\n"; $p++; } //end for $dat.="


全 $total2 件 $page_def 件ずつ表示
Page:"; $p_no=1;$p_li=0; while ($total > 0) { if ($page == $p_li) { $dat.="[$p_no]\n"; }else{ $dat.="[$p_no]\n"; } $p_no++; $p_li = $p_li + $page_def; $total = $total - $page_def; } } function regist(){ //ログ書き込み global $name,$email,$sub,$com,$url,$tag,$past_key; global $password,$html_url,$logfile,$jisa,$max,$w_regist,$autolink,$mudai; if (preg_match("/(]*?>|\[url(?:\s?=|\]))|href=/i", $com)) die("禁止ワードエラー!!"); // フォーム内容をチェック if(!$name||ereg("^[ | |]*$",$name)){ error("名前が書き込まれていません"); } if(!$com||ereg("^[ | |\t]*$",$com)){ error("本文が書き込まれていません"); } if(!$sub||ereg("^[ | |]*$",$sub)){ $sub=$mudai; } $times = time(); $check = file($logfile); $tail = sizeof($check); list($tno,$tdate,$tname,$tmail,$tsub,$tcom,$tu,$th,$tpw) = explode("<>", $check[0]); if($name == $tname && $com == $tcom) error("二重投稿は禁止です"); if ($w_regist && $times - $ttime < $w_regist) error("連続投稿はもうしばらく時間を置いてからお願い致します"); // 記事Noを採番 $no = $tno + 1; // ホスト名を取得 $host = getenv("REMOTE_HOST"); $addr = getenv("REMOTE_ADDR"); if($host == "" || $host == $addr){//gethostbyddrが使えるか if(function_exists(gethostbyaddr)) $host=gethostbyaddr($addr); else $host=$addr; } // 削除キーを暗号化 if ($password) { $PW = crypt(($password),aa); } $now = gmdate( "Y/m/d(D) H:i",time()+9*60*60); $url = ereg_replace( "^http://", "",$url); if (get_magic_quotes_gpc()) {//\を削除 $com = stripslashes($com); $sub = stripslashes($sub); $name = stripslashes($name); $email = stripslashes($email); } if ($tag == 0){ $sub = htmlspecialchars($sub);//タグっ禁止 $name = htmlspecialchars($name); $com = htmlspecialchars($com); $email = htmlspecialchars($email); } $com = str_replace( "\r\n", "\r", $com); //改行文字の統一。 $com = str_replace( "\r", "\n", $com); $com = ereg_replace("\n(( | |\t)*\n){3,}","\n",$com);//連続する空行を一行 $com = nl2br($com); //改行文字の前に
を代入する。 $com = ereg_replace( "\n", "", $com); //\nを文字列から消す。 $new_msg="$no<>$now<>$name<>$email<>$sub<>$com<>$url<>$host<>$PW<>\n"; //クッキー保存 $cookvalue = implode(",", array($name,$email)); setcookie ("p_bbs", $cookvalue,time()+14*24*3600); /* 2週間で期限切れ */ $old_log = file($logfile); $line = sizeof($old_log); $new_log[0] = $new_msg;//先頭に新記事 if($past_key && $line >= $max){//はみ出した記事を過去ログへ for($s=$max; $s<=$line; $s++){//念の為複数行対応 past_log($old_log[$s-1]); } } for($i=1; $i<$max; $i++) {//最大記事数処理 $new_log[$i] = $old_log[$i-1]; } renewlog($new_log);//ログ更新 } function usrdel(){ //ユーザー削除 global $pwd,$no,$logfile; if ($no == "" || $pwd == "") { error("削除Noまたは削除キーが入力モレです"); } $logall = file($logfile); $flag=0; while(list(,$lines)=each($logall)){ list($ono,$dat,$name,$email,$sub,$com,$url,$host,$opas) = explode("<>",$lines); if ($no == "$ono") { $flag=1; $pass=$opas; } else { $pushlog[]=$lines; } } if ($flag == 0) { error("該当記事が見当たりません"); } if ($pass == "") { error("該当記事には削除キーが設定されていません"); } // 削除キーを照合 $match = crypt(($pwd),aa); if (($match != $pass)) { error("削除キーが違います"); } // ログを更新 renewlog($pushlog); } function admin(){ //管理機能 global $admin_pass,$PHP_SELF,$logfile; global $del,$apass,$head,$body; if ($apass && $apass != "$admin_pass") { error("パスワードが違います"); } echo "$head"; echo "$body"; echo "[掲示板に戻る]\n"; echo "
\n"; echo "管理モード\n"; echo "
\n"; if (!$apass) { echo "

パスワードを入力して下さい

\n"; echo "
\n"; echo "\n"; echo ""; echo "
\n"; }else { // 削除処理 if ($del) { // 削除情報をマッチングし更新 $delall = file($logfile); while(list(,$delline)=each($delall)){ list($no,$date,$name,$email,$sub,$com,$url,$host) = explode("<>",$delline); if ($del != "$no") { $dellog[]=$delline; } } // ログを更新 renewlog($dellog); } // 削除画面を表示 echo "
\n"; echo "\n"; echo "\n"; echo "

削除したい記事のチェックボックスにチェックを入れ、削除ボタンを押して下さい。\n"; echo "

\n"; echo ""; echo ""; echo "\n"; $delmode = file($logfile); while (list($l,$val)=each($delmode)){ list($no,$date,$name,$email,$sub,$com,$url, $host,$pw,$tail,$w,$h,$time,$chk) = explode("<>",$val); list($date,$dmy) = split("\(", $date); if ($email) { $name="$name"; } $com = str_replace("
","",$com); $com = htmlspecialchars($com); if(strlen($com) > 40){ $com = substr($com,0,38) . " ..."; } echo ($l % 2) ? "" : ""; echo ""; echo ""; echo ""; echo "\n\n"; } echo "
削除記事No投稿日題名投稿者コメントホスト名
$no$date$sub$name$com$host
\n"; echo "

"; echo "

\n"; } echo "
\n"; } function lock_dir($name=""){//ディレクトリロック if($name=="") $name="lock"; // 3分以上前のディレクトリなら解除失敗とみなして削除 if ((file_exists($name))&&filemtime($name) < time() - 180) { @RmDir($name); } do{ if (@MkDir($name,0777)){ return 1; } sleep(1);// 一秒待って再トライ $i++; }while($i < 5); return 0; } function unlock_dir($name=""){//ロック解除 if($name=="") $name="lock"; @rmdir($name); } function renewlog($arrline){//ログ更新 入力:配列 global $logfile; if(LOCKEY==1){ lock_dir(LOCK) or error("ロックエラー
しばらく待ってからにして下さい"); } elseif(LOCKEY==2){ $fp = @fopen("lock.txt" , "w") or error("ロックエラー
しばらく待ってからにして下さい"); flock($fp, 2); } $rp = fopen($logfile, "w"); // php4: foreach($arrline as $val){ while(list(,$val)=each($arrline)){ fputs($rp,$val); } fclose($rp); if(LOCKEY==1){ unlock_dir(LOCK); } elseif(LOCKEY==2){ fclose($fp); } } function MakeHtml(){ //HTML生成 global $html_file; head($buf); Main($buf); foot($buf); $hp = @fopen ($html_file,"w"); flock($hp,2); fputs($hp, $buf); fclose($hp); } function past_log($data){//過去ログ作成 global $past_no,$past_dir,$past_line,$autolink; $fc = @fopen($past_no, "r") or die(__LINE__.$past_no."が開けません"); $count = fgets($fc, 10); fclose($fc); $pastfile = $past_dir."index".$count.".html"; if(file_exists($pastfile)) $past = file($pastfile); if(sizeof($past) > $past_line){ $count++; $pf = fopen($past_no, "w"); fputs($pf, $count); fclose($pf); $pastfile = $past_dir."index".$count.".html"; $past = ""; } list($pno,$pdate,$pname,$pemail,$psub, $pcom,$purl,$pho,$ppw) = explode("<>", $data); if($url){ $url = "HP";} if($email){ $email = "Mail";} // >がある時は色変更 $com = eregi_replace("(>)([^<]*)", "\\1\\2", $com); // URL自動リンク if ($autolink) { $com=auto_link($com); } $dat.="
[$pno] $psub Name:$pname Date:$pdate $purl
\n"; $np = fopen($pastfile, "w"); fputs($np, $dat); if($past){ while(list(, $val)=each($past)){ fputs($np, $val); } } fclose($np); } function past_view(){ global $past_no,$past_dir,$past_line,$body,$pno; $fc = @fopen($past_no, "r") or die(__LINE__.$past_no."が開けません"); $count = fgets($fc, 10); fclose($fc); if(!$pno) $pno = $count; echo '■ 過去ログ '.$pno.' ■ '.$body.'[掲示板に戻る]
■ 過去ログ '.$pno.' ■

new← '; $pastkey = $count; while ($pastkey > 0) { if ($pno == $pastkey) { echo "[$pastkey]"; } else { echo "[$pastkey]"; } $pastkey--; } echo ' →old

'.$past_line.'件ずつ表示'; $pastfile = $past_dir."index".$pno.".html"; if(!file_exists($pastfile)) error("
過去ログがみつかりません"); include($pastfile); die(""); } function auto_link($proto){ //自動リンク $proto = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\(\)\;\?\.,!#~*'/:@&=-\%]+)","\\1\\2",$proto); return $proto; } function error($mes){ //エラーフォーマット ?>







$val){echo "$key---$val
";} */ switch($mode): case 'regist': regist(); if($htmlw) MakeHtml(); echo ''; break; case 'admin': admin(); break; case 'usrdel': usrdel(); if($htmlw) MakeHtml(); break; case 'past': past_view(); break; default: head($buf); Main($buf); foot($buf); echo $buf; break; endswitch; ?>