<?php
/*-------------------------------------------------*/
/* php研究室掲示板 Ver1.00           */
/*  creater   -> MOJA               */
/*  reference -> phpマニュアル 2004年1月1日版   */
/*         http://www.php.net/docs.php   */
/*                         */
/* 改造、再配布、ソースの流用などご自由にどうぞ  */
/* 連絡不用です                  */
/*-------------------------------------------------*/
    /* ログファイル */
    
define("LOGFILE""logfile.txt");

    
/* 過去ログファイル */
    
define("OLDFILE""oldfile.txt");

    
/* 現行ログの最大記事数 */
    
define("LOGMAX""25");

/* 処理分岐 */
if($_POST["mode"] == "regist"){
    
regist();
}

/* 記事書込処理 */
function regist(){
    
// 名前、メッセージの入力チェック
    
if(!$_POST["name"] || !$_POST["msg"]){
        
// 未入力の場合はLocationでリダイレクト
        
header("Location: $_SERVER[PHP_SELF]"); 
        
// Locationできない場合はMETAでリダイレクト
        
echo "<html>\n";
        echo 
"<head><meta http-equiv=\"Refresh\" content=\"0;URL=$_SERVER[PHP_SELF]\"></head>\n";
        echo 
"<body></body>\n";
        echo 
"</html>\n";
        exit;
    }
    
    
// POST入力データのチェック
    
foreach($_POST as $key => $value){
        
// サーバのmagic_quotes_gpc設定を確認
        
if(get_magic_quotes_gpc()){
            
// 自動エスケープ解除
            
$value stripslashes($value);
        }
        
// HTML特殊記号変換
        
$value htmlspecialchars($value);

        
// メッセージかチェック
        
if($key == "msg"){
            
// 改行コードを<br>タグに変換
            
$_POST[$key] = str_replace(array("\r\n""\r""\n"), "<br>"$value);
        }
    }
    
// 時間を取得
    
$now time();
    
    
// 投稿時間をフォーマット
    
$post date("Y/m/d H:i"$now);

    
// 記事をフォーマット
    
$line "<div>名前 : " $_POST["name"] . " 投稿日 : "$post"</div><p>" $_POST["msg"] . "</p><hr>\n";

    
// 現行ログを配列に取込
    
$LOG_DATA file(LOGFILE);

    
// 新規投稿記事を配列に追加
    
array_unshift($LOG_DATA$line);

    
// 過去ログ処理
    
if(LOGMAX <= count($LOG_DATA)){
        
// 配列の末尾の記事を取得
        
$line array_pop($LOG_DATA);
        
// 過去ログファイル追記モードで開く
        
$fp fopen(OLDFILE"a");
        
// 過去ログに記事を書込
        
fputs($fp$line);
        
// 過去ログファイルを閉じる
        
fclose($fp);
    }
    
// ログファイルを書込モードで開く
    
$fp fopen(LOGFILE"w");
    
// ファイルロック
    
flock($fp,LOCK_EX);
    
// 配列をスカラデータに展開してログへ書込
    
fputs($fpimplode(""$LOG_DATA));
    
// ファイルロック解除
    
flock($fp,LOCK_UN);
    
// ログファイルを閉じる
    
fclose($fp);

    
// 投稿者名をクッキーに書出(保存期間1ヶ月間)
    
setcookie("name"$_POST["name"],time()+2592000);

    
// クッキー代替文字の定義
    
$_COOKIE["name"] = $_POST["name"];
}

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<meta http-equiv="content-style-type" content="text/css">
<link rel="stylesheet" type="text/css" href="bbs.css" media="all">
<title>phpのお勉強 - 掲示板</title>
</head>
<body>
<h1>掲示板@phpのお勉強</h1>
<p>なんでもお気軽に書き込んでください。</p>
<form action="bbs.php" method="post">
<input type="hidden" name="mode" value="regist">
名前 <input type="text" name="name" size="20" value="<? echo $_COOKIE["name"]; ?>"><br>
<textarea name="msg" rows="7" cols="60"></textarea>
<input type="submit" value="投稿">
</form>
<hr>
<?
    
// ログを配列に取込
    
$LOG_DATA file(LOGFILE);
    foreach(
$LOG_DATA as $line){
        echo 
$line;
    }
?>
</body>
</html>