掲示板
<?php //================================================ 設定 $FILE = './dat/bbs.dat'; // 書き込み保存ファイル $MAX = 100; // 保存件数 $VIEW = 10; // 1ページの表示件数 $TEXTMAX = 1000; // 本文文字数制限(全角) $NAMEMAX = 10; // 名前文字数制限(全角) $TITLEMAX = 20; // 題名文字数制限(全角) $PASSWORD = '1234'; // 削除用パスワード //================================================ 関数 function readLog($FILE){ $log = array(); if(!($file = fopen($FILE, "r"))) { return; } flock($file, LOCK_SH); for($i = 0 ; !feof($file) ; $i++) { $log[$i] = rtrim(fgets($file), "\n"); } flock($file, LOCK_UN); fclose($file); if($log[count($log) - 1] === "") { array_pop($log); } return $log; } function writeLog($FILE, $log, $max) { foreach($_POST as $key => $value) { $_POST[$key] = mb_convert_encoding($_POST[$key], "Shift_JIS", "auto"); $_POST[$key] = preg_replace("/&/", "&", $_POST[$key]); $_POST[$key] = preg_replace("/</", "<", $_POST[$key]); $_POST[$key] = preg_replace("/>/", "$gt;", $_POST[$key]); $_POST[$key] = preg_replace("/\s*\x0D\x0A\s*/", "<br>", $_POST[$key]); $_POST[$key] = preg_replace("/\s+/", " ", $_POST[$key]); } $tm = date("U"); $data = join("\t", array($tm, $_POST['name'], $_POST['title'], $_POST['text'], "")); array_unshift($log, $data); while(count($log) > $max) { array_pop($log); } if(!($file = fopen($FILE, "w"))) { return; } flock($file, LOCK_EX); fputs($file, join("\n", $log)); flock($file, LOCK_UN); fclose($file); return $log; } function deleteLog($FILE, $log) { array_splice($log, $_POST['del'], 1); if(!($file = fopen($FILE, "w"))) { return; } flock($file, LOCK_EX); fputs($file, join("\n", $log)); flock($file, LOCK_UN); fclose($file); return $log; } function printLog($log, $view) { $page = $_GET['page']; $start = $page * $view; $end = $start + $view; $count = count($log); if($end > $count) { $end = $count; } for($i = $start ; $i < $end ; $i++) { if(!preg_match("/\t/", $log[$i])) { continue; } list($tm, $name, $title, $text) = explode("\t", $log[$i]); $tm = getdate($tm); $tm = sprintf("%02d/%02d %02d:%02d", $tm[mon], $tm[mday], $tm[hours], $tm[minutes]); if($name === "") { $name = "名無し"; } if($title === "") { $title = "無題"; } printf("<input type=\"radio\" name=\"del\" value=\"%0d\">", $i); echo "【 $title 】$name<br>"; echo "$text"; echo "<div align=\"right\">$tm</div>"; echo "<hr>\n"; } echo "<center>\n"; if($page > 0) { printf("<a href=\"%s?page=%d\">≪前ページ</a>\n", $_SERVER['SCRIPT_NAME'], $page - 1); } if($end < $count) { printf("<a href=\"%s?page=%d\">次ページ≫</a>\n", $_SERVER['SCRIPT_NAME'], $page + 1); } echo "</center>\n"; } //================================================ メインプログラム $log = readLog($FILE); if($_POST['mode'] === "write") { if($_POST['text'] !== "" and strlen($_POST['text']) <= $TEXTMAX * 2 and strlen($_POST['name']) <= $NAMEMAX * 2 and strlen($_POST['title']) <= $TITLEMAX * 2 ) { // $log = writeLog($FILE, $log, $MAX); //サンプルにつき書き込み停止 } } elseif($_POST['mode'] === "delete") { if($_POST['pass'] === $PASSWORD) { // $log = deleteLog($FILE, $log); } } ?> <html> <head> <title>掲示板</title> </head> <body bgcolor="#ffffcc"> <h1 style="margin:2px;text-align:center;font-size:15px;letter-spacing:50px">掲示板</h1> <hr> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> 名前:<input type="text" name="name" size="50" maxlength="<?=$NAMEMAX?>" value="<?=$_POST['name']?>"><br> <br> 題名:<input type="text" name="title" size="50" maxlength="<?=$TITLEMAX?>"><br> <br> 本文: <small>※全角<?=$TEXTMAX?>文字以内</small><br> <textarea name="text" rows="10" cols="80"></textarea><br> <br> <input type="hidden" name="mode" value="write"> <input type="submit" value=" 書き込み "><br> </form> <form action="<?=$_SERVER['SCRIPT_NAME']?>" method="POST"> <hr> <?php printLog($log, $VIEW); ?> <div align="right"> <input type="password" name="pass" value="<?=$_POST['pass']?>" size="4"> <input type="hidden" name="mode" value="delete"> <input type="submit" value="削除"> </div> </form> </body> </html>
〔 実行する 〕