<?php

/*----- ※1 -----*/
//ログの最大保存件数(多すぎるとレスポンスが悪化します) 
$maxLog 50 ;
//ログファイル名
$logFile 'bbs.log';


//投稿ボタンを押した後の処理
if($_POST['submit']) {

    
/*----- ※2 -----*/
    //エラーチェック
    
if(!$_POST['yourName']){
        
$errMsg 'お名前を入力してください<br>';
    } elseif(
strlen($_POST['yourName']) > 100) {
        
$errMsg .= 'お名前が長すぎます';
    }
    if(
strlen($_POST['maxEmail'] > 100)) {
        
$errMsg .= 'メールアドレスが長すぎます';
    }
    if(!
$_POST['subject']){
        
$errMsg .= '題名を入力してください<br>';
    } elseif(
strlen($_POST['subject']) > 100) {
        
$errMsg .= '題名が長すぎます';
    }
    if(
strlen($_POST['maxUrl'] > 100)) {
        
$errMsg .= 'URLが長すぎます';
    }
    if(!
$_POST['msg']){
        
$errMsg .= 'メッセージを入力してください<br>';
    } elseif(
strlen($_POST['msg']) > 1000) {
        
$errMsg .= 'メッセージが長すぎます';
    }


    
//エラーがなければログに書きこみ
    
if(!$errMsg) {

        
/*----- ※3 -----*/
        //投稿内容をログ書き込み用に変換  ※スクリプト最下部の function convString() を参照
        
$putYourName convString($_POST['yourName']);
        
$putEmail convString($_POST['email']);
        
$putSubject convString($_POST['subject']);
        
$putMsg convString($_POST['msg']);
        
$putUrl convString($_POST['url']);
        
//投稿番号は、最終書き込み番号に1加えた数字にする
        //投稿日時を取得する
        
$putDay date("Y/m/d");
        
$putTime date("H:i:s");

        
/*----- ※4 -----*/
        //クッキーを発行
        
setcookie("yourName",$putYourName);
        
setcookie("email",$putEmail,time() + 30 24 60 60);
        
setcookie("url",$putUrl,time() + 30 24 60 60);


        
/*----- ※5 -----*/
        //ログファイルを開く
        
$fp = @fopen($logFile,"r+") or die('ファイルが開けません<br>') ;
        
//ログファイルをロック
        
flock($fpLOCK_EX);


        
/*----- ※6 -----*/
        //1行ずつ取得し、配列に格納する
        
$row ;
        while (
$buf fgets($fp4096)) {
            
$data[$row] = $buf;
            
$row++ ;
        }


        
/*----- ※7 -----*/
        //最終書き込み番号(logの最初の数字)を取得し、今回の書き込みNoを生成
        
$lastNo ereg_replace("^([0-9]+),.+$","\\1",$data[1]);
        
$putNo = ++$lastNo;

        
/*----- ※8 -----*/
        //ログファイルのフォーマット・配列の最初に挿入(項目ごとをカンマ区切りにし、最後に改行)
        
$data[0] = "$putNo,$putDay,$putTime,$putYourName,$putEmail,$putSubject,$putMsg,$putUrl\n" ;

        
//ファイルポインタを先頭に戻す
        
rewind($fp);

        
//書き込み件数が、ログの最大保存件数に満たない場合の処理
        
if($maxLog $putNo) { $maxLog $putNo ; }

        
//最大保存件数の分のみ、ログに保存する
        
for($i $i $maxLog $i++) {
            
ftruncate($fp,ftell($fp)); 
            
fputs($fp,$data[$i]);
        }

        
//ファイルのロック解除
        
flock($fp,LOCK_UN);

        
//ファイルを閉じる
        
fclose($fp);

        
/*----- ※9 -----*/
        //書きこみ後に自分自身のスクリプトに転送(リロードによる多重投稿防止)
        
header("Location: http://{$_SERVER['HTTP_HOST']}{$_SERVER['PHP_SELF']}");
    }

}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<title>BBS</title>
<style type="text/css">
<!--
td {font-size:10pt;}
body {font-size:10pt;}
h1 {  font-size: 14pt ; text-align:center ; color: #0033FF ; }
-->
</style>
</head>
<body>
<?php /*----- ※10 ------*/ ?>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'?>">
<h1 align="center">PHP掲示板サンプル</h2>
<p align="center"><a href="/">TOPに戻る</a></p>
<?php

/*----- ※11 ------*/
//エラーメッセージの表示
if($errMsg) {
    echo <<<END_OF_ERROR
<table align="center">
  <tr>
    <td>$errMsg<br></td>
  </tr>
  <tr>
    <td align="center">&lt;&lt;<a href="JavaScript:history.back()">投稿画面に戻る</a></td>
  </tr>
</table>
</body>
</html>
END_OF_ERROR;
//エラーを表示してスクリプト終了
exit ;
}
?>
<?php 
/*----- ※12 ------*/ ?>
<table border="1" cellspacing="0" cellpadding="4" align="center" bordercolor="#0099FF" bordercolordark="#FFFFFF">
  <tr> 
    <td bgcolor="#99CCFF" align="right"><b>お名前</b></td>
    <td bgcolor="#EEEEEE"> 
      <input type="text" name="yourName" size="30" value="<?php echo $_COOKIE['yourName']; ?>">
    </td>
  </tr>
  <tr> 
    <td bgcolor="#99CCFF" align="right"><b>メールアドレス</b></td>
    <td bgcolor="#EEEEEE"> 
      <input type="text" name="email" size="30" value="<?php echo $_COOKIE['email']; ?>">
    </td>
  </tr>
  <tr> 
    <td bgcolor="#99CCFF" align="right"><b>題名</b></td>
    <td bgcolor="#EEEEEE"> 
      <input type="text" name="subject" size="30">
    </td>
  </tr>
  <tr> 
    <td bgcolor="#99CCFF" align="right"><b>メッセージ</b></td>
    <td bgcolor="#EEEEEE"> 
      <textarea name="msg" cols="40" rows="5"></textarea>
    </td>
  </tr>
  <tr> 
    <td bgcolor="#99CCFF" align="right"><b>URL</b></td>
    <td bgcolor="#EEEEEE"> 
      <input type="text" name="url" size="30" value="<?php echo $_COOKIE['url']; ?>">
    </td>
  </tr>
  <tr bgcolor="#FFFFFF" align="center"> 
    <td colspan="2"> 
      <input type="submit" name="submit" value="投稿">&nbsp;
      <input type="reset" value="リセット" name="reset">
    </td>
  </tr>
</table>
</form>
<?php

//投稿内容を表示用にファイルを開く
$fp = @fopen($logFile,"r") or die("ファイルが開けません") ;

/*----- ※13 ------*/
// fgetscsv関数にてカンマ区切りのデータを配列に格納し、書き込み件数分を表示
while ($readBuf fgetcsv ($fp4096",")) {
    echo 
'<table width="600" border="1" cellspacing="0" cellpadding="4" align="center" bordercolor="#0099FF" bordercolordark="#FFFFFF">'."\n";
    echo 
'<tr bgcolor="#99CCFF">'."\n";
    echo 
'<td>[No.'.$readBuf[0].'] <b>'.$readBuf[5].'</b>&nbsp&nbsp&nbsp['.$readBuf[1].']'.$readBuf[2].'</td>'."\n";
    echo 
'</tr>'."\n";
    echo 
'<tr bgcolor="#EEEEEE">'."\n";
    echo 
'<td>';
    if(
$readBuf[4]){ echo '<a href="mailto:'.$readBuf[4].'" target="_blank">'; }
    echo 
$readBuf[3] ;
    if(
$readBuf[4]){ echo '</a>';}
    echo 
'</td>'."\n";
    echo 
'</tr>'."\n";
    echo 
'<tr>'."\n";
    echo 
'<td>'.$readBuf[6]."\n";
    if(
$readBuf[7]) { echo '<p align="right"><a href="'.$readBuf[7].'" target="_blank">'.$readBuf[7].'</a></p>'; }
    echo 
'</td>'."\n";
    echo 
'</tr>'."\n";
    echo 
'</table>'."\n";
    echo 
'<br><br>'."\n";
}

//ファイルを閉じる
fclose($fp);
?>
</body>
</html>
<?php
//タグの無効化等を処理する関数
function convString($string) {
    
//[\]を取り除く
    
$string stripslashes($string);

    
//HTMLタグを除去する
    
$string htmlspecialchars($string);

    
//文字列のカンマを全角に変換
    
$string ereg_replace(",",",",$string);

    
//改行を<br>に変換
    
$string ereg_replace("\n|\r|\r\n","<br>",$string);
    return 
$string;
}

?>