1stPHP

メール

BBS 掲示板

<?php
include "../../d/common.php";
$common = new common;

//ログファイル名
define("LOGFILE","./data/bbs.txt");
//最大書き込み件数
define("LOGMAX",10);

//ログを読み込み
$logdata file(LOGFILE);


//modeで分岐
switch ($_POST['mode']) {
    case 
'write':
        
//書き込み
        
writeLog($logdata,$_POST);
        break;
        
    case 
'delete':
        
//削除
        
deleteLog($logdata,$_POST);
        break;
        
    default:
        
//ログ表示
        
showLog($logdata);
}


//ログ表示
function showLog($log){
    
showHeader();

//投稿用のフォーム表示します
$doc = <<<EOD
<form method="post" action="{$_SERVER['PHP_SELF']}">
<h2>記事投稿</h2>
<label>題名</label><input type="text" name="title" /><br />
<label>名前</label><input type="text" name="name" /><br />
<label>メール</label><input type="text" name="mail" /><br />
<textarea name="message"  cols="64" rows="4"></textarea><br />
<label>PASS</label><input type="password" maxlength="8" name="pass" /><span>(記事削除用)</span><br />
<input type="submit" name="write" value="送信">
<input type="hidden" name="mode" value="write">
</form>

EOD;
print 
$doc;
    
    
//ログから1件ずつ表示します
    
foreach($log as $value) {
        
$value trim($value);
        
        
// , で分割し配列にセット
        
$data explode(","$value);
        
        
//配列と同じ形式で、変数へ代入します
        
list($no,$name,$title,$mail,$message,$pass,$time) = $data;

        print 
"<div class=\"bbs\">";
        print 
"<h3>【{$no}{$title}</h3>";
        if (
$mail){
            print 
"名前:<a href='mailto:{$mail}'>{$name}</a>";
        }else{
            print 
"名前:{$name}";
        }
        
//日時を書式化します
        
$time date("Y年m月d日 H時i分s秒",$time);
        print 
"({$time})";
        
        print 
"<p>{$message}</p></div>\n";
    }

//削除用のフォーム表示します
$doc = <<<EOD
<form method="post" action="{$_SERVER['PHP_SELF']}">
<h2>記事削除</h2>
<label>No</label><input type="text" name="delno" />
<label>PASS</label><input type="password" maxlength="8" name="pass" />
<input type="submit" name="delete" value="削除" />
<input type="hidden" name="mode" value="delete" />
</form>

EOD;
print 
$doc;
    
    
showFooter();
}


//文字列をチェック
function checkStr($str){
    
$str str_replace(",""&#44;"$str);
    
$str str_replace(" "," ",$str); 
    
$str trim($str);
    
$str stripslashes($str);
    
$str htmlspecialchars($str);
    return 
$str;
}


//ログへ書き込み
function writeLog($log,$post){
    
//先頭が一番新しい
    
$data explode(","$log[0]);
    
//番号をひとつ増やします
    
$no $data[0] + 1;
    
    
$name checkStr($post['name']);
    
//名前が無い場合「名無し」にします
    
if (!$name$name "名無し";
    if (
strlen($name) > 64) {
        
showError("名前が長すぎます");
    }
    
    
$mail checkStr($post['mail']);
    if (
strlen($mail) > 64) {
        
showError("メールが長すぎます");
    }
    
    
$title checkStr($post['title']);
    if (!
$title$title "無題";
    if (
strlen($title) > 64) {
        
showError("題名が長すぎます");
    }
    
    
$message checkStr($post['message']);
    if (!
$message) {
        
//メッセージが無い場合エラーにします
        
showError("メッセージが未入力です");
    }elseif (
strlen($message) > 256) {
        
showError("メッセージが長すぎます");
    }
    
//改行を<br />に置換します
    
$message str_replace(array("\r","\n","\r\n"), "<br />"$message);
     
    
$pass checkStr($post['pass']);
    
//パスワードを暗号化
    
if ($pass$pass md5($pass);
    
    
//現在のタイムスタンプを取得
    
$time time();
    
    
//新規書き込み文字列
    
$wdata "$no,$name,$title,$mail,$message,$pass,$time,\n";
     
     
//ログ配列の先頭に追加します
     
array_unshift($log$wdata);
     
     
//ログ更新
    
updatelog($log);
}


//ログから削除
function deleteLog($log,$post){
    if (!
$post['delno']) {
        
showError("削除する記事番号が未入力です");
    }
    
    
$flag 0;
    foreach (
$log as $key=>$value){
        
// , で分割し配列にセット
        
$data explode(","$value);
        
//配列と同じ形式で、変数へ代入します
        
list($no,$name,$title,$mail,$message,$pass,$time) = $data;
        
        
//番号が一致した場合
        
if ($no == $post['delno']){
            
$flag 1;
            
            
$post['pass'] = md5($post['pass']);
            
//パスワードが一致した場合
            
if ($pass == $post['pass']){
                
$flag 2;
                
//ログ配列から削除します
                
array_splice($log$key1);
            }
        }
  }
  
  switch (
$flag) {
      case 
0:showError("No.{$post['delno']}がみつかりません");
        case 
1:showError("パスワードが違います");
    }
  
  
//ログ更新
    
updatelog($log);
}


//ログ更新
function updateLog($log){
    
$fp fopen(LOGFILE'w');
    
stream_set_write_buffer($fp0);
    
flock ($fpLOCK_EX);
    
$i=0;
    foreach(
$log as $value) {
        
//最大書き込み数まで
        
if (++$i LOGMAX) break;
        
$value trim($value);
        
fputs($fp$value."\n");
    }
    
flock ($fpLOCK_UN);
    
fclose($fp);
    
    
//リダイレクト
    
header("Location: {$_SERVER['PHP_SELF']}");
    exit;
}


//ヘッダ表示
function showHeader(){
/*
$doc = <<<EOD
<?xml version="1.0" encoding="EUC-JP"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" dir="ltr" >
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP" />
<title>BBS</title>
</head>
<body>
EOD;
print $doc;
*/
    
global $common;
    
$common->showHead("BBS 掲示板-".$common->cfg[title],"../../css/main.css<>./bbs.css","","../../d/count/top.cgi");
    
$common->showAdd();
    
$common->smpmenu("BBS","./bbs.php");
}


//フッタ表示
function showFooter(){
//    print "</body></html>";
    
global $common;
    
$common->showFoot();
}


//エラー表示
function showError($str){
    
showHeader();
    print 
"<p style=\"color:red;font-size:150%;\">$str</p>";
    print 
"<p>ブラウザの「戻る」ボタンで戻ってください</p>";
    
showFooter();
    exit;
}




?>