phpな休日 BBS sitemap
p-ho message board
※名前半角14文字・コメント半角66文字まで コメント欄にURL記入不可(スパム対策)
lostyandさんの投稿を制限しました。 2008/3/1

一行掲示板

もうちょっと手を加えて「一行掲示板」完成にしました。上記はインラインフレームに入れてありますが、単体で表示すると

こちら (サブウインドウで表示)

のようになります。

<?php
mb_language("ja");
mb_internal_encoding("UTF-8");
header("Content-Type:text/html; charset=UTF-8");
if (isset($_GET["line"])) {$line = $_GET["line"];} //GETで渡された番号を $line に代入
if (($_POST["name"] != "") or ($_POST["comment"] != "")) { //もしPOSTに [name] か [comment] があれば
if (!preg_match ("{(https?)(://[[:alnum:]¥+¥$¥;¥?¥.%,!#~*/:@&=_-]+)}", $_POST["comment"])) {
if (isset($_POST["name"])) { //もしPOSTに [name] があれば
$name = $_POST["name"]; //POSTのデータを変数$nameに格納
$name = htmlspecialchars ($name); //HTMLタグ禁止
$name = mb_strimwidth ($name, 0, 14, "", "UTF-8"); //長いデータを14バイトでカット
}
if (isset($_POST["comment"])) { //もしPOSTに [comment] があれば
$comment = $_POST["comment"]; //POSTのデータを変数$commentに格納
$comment = htmlspecialchars ($comment); //HTMLタグ禁止
$comment = mb_strimwidth ($comment, 0, 66, "", "UTF-8"); //長いデータを66バイトでカット
}
$data = fopen ("./mlog.cgi","r"); //ファイルを読みこみ専用でオープン
$bdata = fgets ($data); //1行読み込む
list($bname,$bcomment,$btime) = explode("<>",$bdata); //変数に変換
fclose($data); //ファイルを閉じる
if (($bname != $name) or ($bcomment != $comment)){ //name か comment が違っていたら
$time = date("Y/n/j G:i"); //日時の取得
$ip = getenv("REMOTE_ADDR"); //IPアドレス取得
$host = gethostbyaddr(getenv("REMOTE_ADDR")); //HOST取得
$iphost = ($host . "/" . $ip);
//mb_send_mail ("hoge@hoge.net", "一行掲示板より", "$name 様¥n$comment¥n$time¥n$iphost¥n");
$log = file("./mlog.cgi"); //ファイル1行づつ配列に入れながら読み込む
$topwrite = "$name<>$comment<>$time<>$iphost<>¥n"; //新しく追加するデータを <> で区切って整形
$write = fopen("./mlog.cgi","w"); //書き込み用モードでデータを開く(データは空になる)
flock($write, LOCK_EX); //ファイルロック開始
fputs($write, $topwrite); //先頭に1行書き込む
for($i = 0; $i < 179; $i++){ //179行まで走査処理をする
fputs($write, $log[$i]); //今までの分を書き込む
}
flock ($write, LOCK_UN); //ファイルロック解除
fclose ($write); //ファイルを閉じる
}
}
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>p-ho message board</title>
<style type="text/css"><!--
body {
margin-left:0px;
margin-top:12px;
margin-right:0px;
margin-bottom:4px;
}
.mform {
border:steelblue 1px solid;
}
.formf {
font-size:10px;
color:steelblue;
}
.fsubmit {
cursor:hand;
border:steelblue 1px solid;
background-color:#ffffff;
font-size:12px;
color:steelblue;
}
.frame {
width:100%;
margin-bottom:2px;
background-color:lavender;
text-align:left;
}
.name {
width:88px;
font-size:12px;
color:navy;
text-align:left;
}
.time {
width:80px;
font-size:10px;
color:slategray;
text-align:left;
}
.comment {
font-size:12px;
color:navy;
text-align:left;
}
.pno {
font-size:12px;
color:navy;
}
--></style>
</head>
<body>
<form method="POST" action="mboard.php">
<span class="formf">お名前</span> <input class="mform" type="text" name="name" size="14"> <span class="formf">コメント</span> <input class="mform" type="text" name="comment" size="46"> <input class="fsubmit" type="submit" value="送信">
</form>
<?php
$log = file("mlog.cgi"); //ログファイルを読み込みます
if (!$line) {
$line = 0; //最初のページは 0
}
$pageline = 5; //1ページに表示させる行数
for ($i = $line; $i < $line+$pageline; $i++) { //1行づつ走査しながら1ページ分を表示します
$list = explode("<>",$log[$i]);
if(($list[0] != "") or ($list[1] != "")){
?>
<table class="frame">
<tr>
<td class="name">
<?php print $list[0]; ?>
</td>
<td class="time">
<?php print $list[2]; ?>
</td>
<td class="comment">
<?php print $list[1]; ?>
</td>
</tr>
</table>
<?php
}
}
$totalline = (count($log)); //総行数
$totalpage = ceil(($totalline / $pageline)); //総ページ数(小数点以下切り上げ)
if ($totalline > $pageline) { //2ページ以上になるなら
$back = $totalline; //最初の $back は総行数
$now = 1; //ページ番号は1から
$next = 0; //行番号に代入される値は0から
print "&nbsp;";
for ($i = $line; $back >= 1; $i++) { //1行づつ走査しながら1ページ分を表示します
if ($line == $next) {
print "<span class='pno'>" . "$now" . "</span>&nbsp;";
}
else {
print "<a href='mboard.php?line=" . $next . "'><span class='pno'>" . $now . "</span></a>&nbsp;"; //GETで渡すリンク(行番号)
}
$now++; //ページ番号を増やしていく
$next = $next + $pageline; //行番号を増やしていく
$back = $back - $pageline; //行番号を減らしていく
}
}
?>
</body>
</html>

機能的な追加・変更部分は赤文字にしました。
スパム対策ですが7行目でコメント内にURLが書かれていたら投稿出来ないようにしました。
26行目からの処理でIPアドレス・ホストを取得しておきます。
29行目はコメントアウトしてありますが、行頭の // を削除すれば投稿時に管理者にメールを送るようにできます。メールアドレスを自分のものに書きかえてください。
112行目の if(($list[0] != "") or ($list[1] != "")){ は最後のページで空のテーブルを出力しないための処理です。
少し実用的なスクリプトになってきたので、ログファイルの拡張子を .cgi にしました。拡張子が .txt だとブラウザから表示出来てしまいますが .cgi にすると 表示されなくなります。拡張子が .cgi だからと言って、内容がCGIスクリプトでなくても良いので、便利な拡張子としてよく使われます。このサイトでもincludeで読み込むPHPファイルの拡張子は .cgi にしています。

2022.9.30 last edit

Produced by haku