1stPHP

メール

BBS 掲示板

<?php

//ログファイル名
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;
*/
}


//フッタ表示
function showFooter(){
//  print "</body></html>";
}


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




?>

サンプル実行

BBS