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(",", ",", $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, $key, 1);
}
}
}
switch ($flag) {
case 0:showError("No.{$post['delno']}がみつかりません");
case 1:showError("パスワードが違います");
}
//ログ更新
updatelog($log);
}
//ログ更新
function updateLog($log){
$fp = fopen(LOGFILE, 'w');
stream_set_write_buffer($fp, 0);
flock ($fp, LOCK_EX);
$i=0;
foreach($log as $value) {
//最大書き込み数まで
if (++$i > LOGMAX) break;
$value = trim($value);
fputs($fp, $value."\n");
}
flock ($fp, LOCK_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;
}
?>