phpな休日 BBS sitemap
新規投稿時の処理

新規投稿で [ゲストブック] との違いは [通し番号] のつけ方です。
[ゲストブック] の場合

5<>name<>email<>url<>title<>comment<>time<>iphost<>
6<>name<>email<>url<>title<>comment<>time<>iphost<>
3<>name<>email<>url<>title<>comment<>time<>iphost<>
4<>name<>email<>url<>title<>comment<>time<>iphost<>
1<>name<>email<>url<>title<>comment<>time<>iphost<>
2<>name<>email<>url<>title<>comment<>time<>iphost<>

このようなログに追加する時は、一番上の行の [項目1] の数値に +1 するだけでしたが(上記の場合ですと 6 になります。) 、レス式の場合同じ数字(6)がすでに存在しますのでデータに不整合が生じてしまいます。
ログを走査して最も大きな数値を見つけて、それに +1 することにします。

$data = file("./bbslog.cgi"); //ファイルを開いて
$bno = 0; //とりあえず 0
foreach($data as $value) { //走査する
$list = explode("<>", $value); //区切り文字で分ける
if ($bno < $list[0]) $bno = $list[0]; //とりあえずの $bno より大きい数値を見つけるたびに書きかえる
}
$no = $bno + 1; //最後に+1したものを新しい $no にする

追加していくばかりではログファイルが肥大しますので、新規投稿があった時点で一番下のスレッドを削除するようにします。
まずスレッドに関係なく一番下の行(一番下が一番古いとは限りませんが)を削除して、削除した行の [項目2] と同じ数値が入っている [項目2] を持つ行を同一スレッド行と見なして削除します。

$thread = 0; //親記事を数える
$data = file("./bbslog.cgi");
for ($i = 0; $i < count($data); $i++) {
$list = explode("<>", $data[$i]);
if ($list[0] == $list[1]) { //親記事なら
$thread++; //親記事の数
}
}
if ($thread >= 6){ //親記事が6以上あれば
$data = file("./bbslog.cgi");
$delete = array_pop($data); //最後の行を削除
list($dno,$dresno,$dname,$demail,$durl,$dtitle,$dcomment,$dtime,$dip) = explode("<>",$delete); //最後の行の内容
}
for ($i = 0; $i < count($data); $i++) {
$list = explode("<>", $data[$i]);
if ($list[1] == $dresno) { //削除した行の親記事または返信記事があれば
array_splice($data, $i); //記事削除
}
}
$nwrite = fopen("./bbslog.cgi", "w");
flock($nwrite, LOCK_EX); //ファイルロック
foreach($data as $value) {
fputs($nwrite, $value);
}
flock($nwrite, LOCK_UN); //ロック解除
fclose($nwrite);

2014.2.4 last edit

Produced by haku