/*****************************************************************
Tree Bulletin Board System
treebbs.php3
trustBee (http://www.trustbee.com/)
Coded by I.Yamamoto 2000/05/16
-----------------------------------------------------------------
【使い方】
・このソースリストを適当なファイル名(例:treebbs.php3)で保存します。
・PHPをサポートしているサーバに、treebbs.php3をアップロードします。
・空のデータ用ファイルを作成し、パーミッションを変更します。
% touch hogehoge.dat
% chmod 666 hogehoge.dat
・ブラウザから、下記のようにアクセスしてください。
http://サーバ名/treebbs.php3?bbs=hogehoge
(*) データ用ファイルを複数用意することで、
複数の掲示板が作成できます。
-----------------------------------------------------------------
【更新履歴】
日付 Ver 内容
2000/05/16 0.1 ソースを公開
2000/05/21 0.11 データ区切りの不具合を修正
返信時の動作を修正
2000/06/21 0.12 新着メッセージの表示を修正
2000/07/04 0.13 フッタと削除時の問題を修正
2000/07/26 0.14 メッセージ表示部の修正
2000/08/09 0.15 メールアドレスチェック関数を修正
2000/10/23 0.16 URLリンクの機能を修正
2000/11/24 0.17 URLリンクの機能を修正
タグのネストを修正。
2000/12/22 0.18 メッセージ表示時に前後のメッセージと
ツリーへのリンクを追加
メール送信機能を追加
2000/12/25 0.19 URLリンクの機能を修正
2000/12/28 0.20 PHP4でも動作するように修正。
2001/01/10 0.21 クッキー有効期限の記述を修正。
2001/01/11 0.22 返信時に名前とタイトルを表示するように修正。
2001/02/18 0.23 新着メッセージを上部に表示するように修正。
2001/02/19 0.24 新着メッセージ数を設定できるように修正。
2001/07/04 0.25 URLリンクを修正
2001/08/12 0.26 トピック一覧にお名前を追加
2001/08/22 0.27 返信をリンクからボタンに変更
2001/08/25 0.28 半角スペースを変換するように修正
*****************************************************************/
// タイトルの設定
define("TITLE", "ツリー掲示板");
// 削除機能の設定 (「使わない」がおすすめ。;-P)
// 0:使わない 1:使う
define("USE_DELETE", 0);
// メール送信機能の設定
// 0:使わない 1:使う
define("USE_MAILSEND", 0);
// 新着メッセージ表示数の設定
define("NEW_MESSAGE", 10);
// 管理者メールアドレスの設定
define("ADMIN_MAIL", "webmaster@trustbee.com");
// 投稿時送信先アドレスの指定(複数指定可)
$sendaddress = array(
"user@example.com",
"yamamoto@trustbee.com"
);
// メールフッタの設定
$mailfooter = "
--------------------
Send by TreeBBS
trustBee http://www.trustbee.com/
";
// データファイルの拡張子の設定
define("DATA_EXT", ".dat");
// 暗号化SALTの設定
define("SALT", "tb");
// 自分自身のファイル名の取得
define("MYFILE", basename(__FILE__));
// PHPバージョンの取得
define("PHPVER", substr(phpversion(), 0, 1));
// メール関数名の設定
$mailfunc = (PHPVER == 3) ? "mail" : "mb_send_mail";
// ファイルロックの定義
define("READ_LOCK", 1);
define("WRITE_LOCK", 2);
define("UNLOCK", 3);
// 全表示時のページごとの表示数の設定
define("PAGE_VIEW", 5);
// ツリー表示用文字の設定
define("TREE0", " ");
define("TREE1", " │ ");
define("TREE2", " ├ ");
define("TREE3", " └ ");
// 表のカラー設定
define("BG_LABEL", "#FFCC33");
define("BG_COL", "#FFFFCC");
define("BG_COL2", "#FFFFFF");
define("BG_LINE", "#660000");
// クッキー期限の秒数
define("COOKIE_EXPIRE", 60*60*24*365); // 1 Year
// アイコン用画像の設定
$image_icon = "
R0lGODlhIAAgANX/AP////zpe/r07fbr3vbgcvKtOfHZbPDiy+6pNevQYurXuuimNObJWuXPreWh
MuHHnuHBVeCdMNu5T9ubLdq8jdeYKdW0gNWxSNGTKdCqQs+rcc2kPcuPJMijZMiMJMWdNcSbVcSJ
I8CWL76EHb2SSryOKbuBHbeKO7eIIraDH7aCHrV/HLSCMLSBILOBKLN/HrKDMrKCILF7Gq57HK18
Ja14Gqx7JKl0GAAAAMDAwAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAADkALAAAAAAgACAAQAb/wJxw
SBySWqeicrkkfQgBaGAaYCSFGtKJZGFqLoHbjTq9oAiSUEGU6gDecE23SBrA4QJXgnpZRRAOV0yD
FjRzg0UtBRM3Wyd7ZJFTEhR3loJ0LR8fJSwjCAUIIx9kGTcaiDl1lnAUHUokNCSpSzQRhrS5WCcu
NCUus7mHQiRgkmE3BAw0GgKWByxCFnMWxscBGRkJJ6x3mEIsCQaQBh8MBBufBSMSUyUKbw/fRCSV
eDMoF1JTBC0OJcOadHsz4MSMCg4iYFgxYYSwE/AIggimi5YFFwVCBKzIxMKNjRyXFEIV0osLfWSW
gaTFwhoZMegsaLFwAMABCyy6kChBY4gFi1LXqDAgMfCBlhArSLCgwSJoFFIfag6kSIxBUAkoAnwY
caJBt4JFLGxAJrTEEwkrEIhCp+GOgnk5ClmlgiYFhwIZgQYwQMIo1SYdDtRUwAEBhxUQyCRY0WKl
TxCsOrjci2JCgRYsBx5wAUFCi8KhVvRMxW0ggJwdSKhuISIESUKlLckjJEyLbcdMggAAOw==";
/**************************************************
DispHeader
ヘッダを表示する
--------------------------------------------------
引数 $title タイトル
戻り値 なし
**************************************************/
function DispHeader($title) {
?>
echo $title ?>
}
/**************************************************
DispFooter
フッタを表示する
--------------------------------------------------
引数 なし
戻り値 なし
**************************************************/
function DispFooter() {
?>
}
/**************************************************
DispMenu
メニューを表示する
--------------------------------------------------
引数 $bbs 掲示板名
戻り値 なし
**************************************************/
function DispMenu($bbs) {
?>
}
/**************************************************
DispMsg
メッセージを表示する
--------------------------------------------------
引数 $info メッセージ配列
戻り値 なし
**************************************************/
function DispMsg($bbs, $info) {
if ($info["no"] && !$info["delflag"]) {
$titlestr1 = sprintf("", MYFILE, $bbs, $info["no"]);
$titlestr2 = "";
}
$msg = $info["delflag"] ? "このメッセージは削除されました" : nl2br($info["msg"]);
// URLのリンク
$msg = preg_replace("'(http://[-_~./?=%+#&;:\w]+)'", "".htmlspecialchars('\\1')."", $msg);
?>
| echo $titlestr1.$info["title"].$titlestr2 ?> |
// 投稿者名の表示
if ($info["mail"]) {
?>
"> echo $info["name"] ?>
} else {
?>
echo $info["name"] ?>
}
?>
|
echo date("Y/m/d H:i:s", $info["date"]) ?> |
| echo $msg ?> |
}
/**************************************************
DispForm
メッセージ入力フォームを表示する
--------------------------------------------------
引数 $bbs 掲示板名
$name 名前
$mail メールアドレス
$title タイトル
$msg メッセージ
$tree ツリー番号
$ref 参照メッセージ番号
戻り値 なし
**************************************************/
function DispForm($bbs, $name, $mail, $title="", $refname="", $msg="", $tree=0, $ref=0) {
// タイトル
$titleheader = substr($title, 0, 3);
$newtitle = ($title && $titleheader != "Re:") ? "Re:".$title : $title;
// メッセージ
if ($msg) {
$temp = explode("
", $msg);
$msg = "> ".implode("\n> ", $temp);
}
// ボタン
$str = $ref ? "返信のプレビュー" : "新規トピックのプレビュー";
// 投稿フォーム表示
?>
}
/***********************************************************************
メールアドレスチェック関数
メールアドレス内の不正文字、無効なホスト名をチェックする。
引数 $mail メールアドレス
戻り値 0 メールアドレス有効
1 不正文字検知
2 ホスト名エラー
***********************************************************************/
function CheckMail($mail) {
// メールアドレス内の不正文字をチェック
if (preg_match("/[^-._~@\w]+/", $mail))
return 1;
// メールアドレス内のホスト名の有効性をMXレコードからチェック
$hostname = substr($mail, strpos($mail, "@")+1);
$mxcheck = getmxrr($hostname, $mxhosts);
$hostcheck = ($hostname != gethostbyname($hostname));
if (!$mxcheck and !$hostcheck)
return 2;
return 0;
}
/**************************************************
ParseTree
リスト配列をツリー構造にする
--------------------------------------------------
引数 $list メッセージリスト配列
$no メッセージ番号
$tree ツリー構造格納配列
戻り値 なし
**************************************************/
function ParseTree($list, $no, &$tree) {
// 静的変数の宣言
static $num = 1;
while (list($key, $val) = each($list)) {
if ($val["ref"] == $no) {
$tree[$num]["no"] = $val["no"];
// 再帰実行前のnumを保存
$lastnum = $num;
// 再帰実行
$num++;
ParseTree($list, $val["no"], $tree);
}
}
if ($lastnum)
$tree[$lastnum]["last"] = 1;
}
/**************************************************
ReadListFile
メッセージリストを読み込む
--------------------------------------------------
引数 $bbs 掲示板名
戻り値 メッセージリスト配列
**************************************************/
function ReadListFile($bbs) {
$info = array();
// ファイルの存在チェック
if (!file_exists($bbs.DATA_EXT)) {
printf("掲示板 %s は作成されていません。
\n", $bbs);
return $info;
}
// ファイルオープン
$fp = fopen($bbs.DATA_EXT, "r") or die("file open error.
\n");
flock($fp, READ_LOCK) or die("file lock error.
\n");
$i = 1;
while ($data = fgetcsv($fp, 10240, "`")) {
$info[$i]["no"] = $i;
$info[$i]["tree"] = $data[0];
$info[$i]["ref"] = $data[1];
$info[$i]["depth"] = $data[2];
$info[$i]["title"] = $data[3];
$info[$i]["name"] = $data[4];
$info[$i]["mail"] = $data[5];
$info[$i]["msg"] = $data[6];
$info[$i]["delpass"] = $data[7];
$info[$i]["delflag"] = $data[8];
$info[$i]["date"] = $data[9];
$info[$i]["remote"] = $data[10];
$info[$i]["agent"] = $data[11];
$i++;
}
flock($fp, UNLOCK) or die("file unlock error.
\n");
fclose($fp);
return $info;
}
/**************************************************
WriteListFile
メッセージリストを書き込む
--------------------------------------------------
引数 $bbs 掲示板名
$list メッセージリスト配列
戻り値 なし
**************************************************/
function WriteListFile($bbs, $list) {
// ファイルの存在チェック
if (!file_exists($bbs.DATA_EXT)) {
printf("掲示板 %s は作成されていません。
\n", $bbs);
return $info;
}
// ファイルオープン
$fp = fopen($bbs.DATA_EXT, "w") or die("file open error.
\n");
flock($fp, WRITE_LOCK) or die("file lock error.
\n");
// 追加
while (list($key, $val) = each($list)) {
$str = $separator = "";
while (list($listkey, $listval) = each($val)) {
if ($listkey == "no")
continue;
$str .= $separator.$listval;
if (!$separator) $separator = "`";
}
$str .= "\n";
fputs($fp, $str);
}
flock($fp, UNLOCK) or die("file unlock error.
\n");
fclose($fp);
}
/**************************************************
AddMsg
メッセージを追加する
--------------------------------------------------
引数 $bbs 掲示板名
$info メッセージ配列
戻り値 なし
**************************************************/
function AddMsg($bbs, $info) {
// ファイルの存在チェック
if (!file_exists($bbs.DATA_EXT))
touch($bbs.DATA_EXT);
// ファイルオープン
$fp = fopen($bbs.DATA_EXT, "a") or die("file open error.
\n");
flock($fp, WRITE_LOCK) or die("file lock error.
\n");
// 追加
while (list($key, $val) = each($info)) {
$str .= $separator.$val;
if (!$separator) $separator = "`";
}
$str .= "\n";
fputs($fp, $str);
flock($fp, UNLOCK) or die("file unlock error.
\n");
fclose($fp);
}
/**************************************************
GetTopNo
ツリーのトピックのメッセージ番号を取得する
--------------------------------------------------
引数 $list メッセージリスト配列
$treeno ツリー番号
戻り値 メッセージ番号
**************************************************/
function GetTopNo($list, $treeno) {
//リストファイルの評価
while (list($key, $val) = each($list)) {
if ($val["tree"] == $treeno && !$val["ref"] && !$val["delflag"])
return $val["no"];
}
}
/**************************************************
GetListTopic
トピックリストを取得する
--------------------------------------------------
引数 $list メッセージリスト配列
戻り値 トピックリスト配列
**************************************************/
function GetListTopic($list) {
//リストファイルの評価
$info = array();
$tree = array();
$treenum = array();
while (list($key, $val) = each($list)) {
// 削除済みの場合はスキップ
if ($val["delflag"])
continue;
// ツリー内最新日時の格納
$treeno = $val["tree"];
if ($newest[$treeno] < $val["date"]) {
$newest[$treeno] = $val["date"];
$newestno[$treeno] = $val["no"];
}
// ツリー内投稿数の格納
$treenum[$treeno]++;
// 参照が0のメッセージを抽出
if (!$val["ref"]) {
$temp[$treeno]["no"] = $val["no"];
$temp[$treeno]["tree"] = $val["tree"];
$temp[$treeno]["title"] = $val["title"];
$temp[$treeno]["name"] = $val["name"];
$temp[$treeno]["mail"] = $val["mail"];
$temp[$treeno]["date"] = $val["date"];
}
}
// 削除済みならリターン
if (!count($newest))
return $info;
// ツリー内最新日時でソート
arsort($newest);
// 情報配列に格納
$i = 0;
while (list($key, $val) = each($newest)) {
$info[$i]["no"] = $temp[$key]["no"];
$info[$i]["tree"] = $temp[$key]["tree"];
$info[$i]["title"] = $temp[$key]["title"];
$info[$i]["name"] = $temp[$key]["name"];
$info[$i]["mail"] = $temp[$key]["mail"];
$info[$i]["date"] = $temp[$key]["date"];
$info[$i]["newest"] = $val;
$info[$i]["newestno"] = $newestno[$key];
$info[$i]["msg_num"] = $treenum[$key];
$i++;
}
return $info;
}
/**************************************************
GetMsg
メッセージを取得する
--------------------------------------------------
引数 $list メッセージリスト配列
$no メッセージ番号
戻り値 メッセージ配列
**************************************************/
function GetMsg($list, $no) {
// 配列の初期化
$info = array();
//リストファイルの評価
while (list($key, $val) = each($list)) {
if ($val["no"] == $no) {
$info["no"] = $val["no"];
$info["tree"] = $val["tree"];
$info["depth"] = $val["depth"];
$info["title"] = $val["title"];
$info["name"] = $val["name"];
$info["mail"] = $val["mail"];
$info["msg"] = $val["msg"];
$info["date"] = $val["date"];
$info["delpass"] = $val["delpass"];
$info["delflag"] = $val["delflag"];
}
}
return $info;
}
/**************************************************
GetNumTree
ツリー数を取得する
--------------------------------------------------
引数 $list メッセージリスト配列
戻り値 ツリー数
**************************************************/
function GetNumTree($list) {
while (list($key, $val) = each($list)) {
if (!$val["delflag"])
$tree[$val["tree"]] = 1;
}
return count($tree);
}
/**************************************************
ConvertHTMLChars
HTMLの特殊文字を元の文字に戻す
(htmlspecialchars関数の逆処理を行なう)
--------------------------------------------------
引数 $buffer 文字列
戻り値 文字列
**************************************************/
function ConvertHTMLChars($buffer) {
$chars = array(
"<" => "<",
">" => ">",
"&" => "&",
""" => "\"",
" " => " "
);
while (list($key, $val) = each($chars))
$buffer = str_replace($key, $val, $buffer);
return $buffer;
}
// メニューの表示
if ($act != "add" && $act != "icon") {
// ヘッダの表示
DispHeader(TITLE);
// メニューの表示
DispMenu($bbs);
}
// 処理の分岐
switch ($act) {
// アイコン画像の表示
case "icon":
// ヘッダの出力
header("Content-Type: image/gif");
if (PHPVER == 3)
i18n_http_output("pass");
// アイコンイメージの出力
echo base64_decode($image_icon);
break;
// 新規メッセージの投稿
case "new":
// 投稿フォーム表示
$name = urldecode($HTTP_COOKIE_VARS["BBS_NAME"]);
$mail = urldecode($HTTP_COOKIE_VARS["BBS_MAIL"]);
DispForm($bbs, $name, $mail);
break;
// リプライ
case "reply":
// リスト取得
$list = ReadListFile($bbs);
// メッセージの取得
$info = GetMsg($list, $no);
if (!$info["no"]) {
echo "エラー:メッセージを取得できません。\n";
break;
}
?>
メッセージの返信を入力してください。
// 投稿フォーム表示
$name = urldecode($HTTP_COOKIE_VARS["BBS_NAME"]);
$mail = urldecode($HTTP_COOKIE_VARS["BBS_MAIL"]);
$msg = $info["delflag"] ? "" : ConvertHTMLChars($info["msg"]);
DispForm($bbs, $name, $mail, $info["title"], $info["name"], $msg, $info["tree"], $no);
break;
// 全メッセージの表示
case "all":
// リスト取得
$list = ReadListFile($bbs);
// 開始・終了番号
$from = count($list) - $page*PAGE_VIEW;
$to = $from - PAGE_VIEW;
if ($from < 1)
$from = count($list);
if ($to < 1)
$to = 1;
if ($page > 0) {
?>
前のページ
}
if ((count($list) - ($page + 1)*PAGE_VIEW) > 0) {
?>
次のページ
}
?>
for ($i=$from; $i>=$to; $i--) {
if (!$list[$i]["delflag"])
DispMsg($bbs, $list[$i]);
echo "
";
}
break;
// メッセージの表示
case "view":
// リスト取得
$list = ReadListFile($bbs);
// メッセージ情報の取得
$info = GetMsg($list, $no);
if (!$info["no"]) {
echo "エラー:メッセージを取得できません。\n";
break;
}
// トピックリスト取得
$topic = GetListTopic($list);
// 前後のツリーを検索
$prevtree = $nexttree = $flag = 0;
while (list($key, $val) = each($topic)) {
if ($flag) {
$nexttree = $val["tree"];
$nextreetitle = $val["title"];
break;
}
if ($val["tree"] == $info["tree"]) {
$flag = 1;
continue;
} else {
$prevtree = $val["tree"];
$prevtreetitle = $val["title"];
}
}
// ツリートップ番号取得
$treetop = GetTopNo($list, $info["tree"]);
if ($prevtree)
$prevtreetop = GetTopNo($list, $prevtree);
if ($nexttree);
$nexttreetop = GetTopNo($list, $nexttree);
// ツリー取得
$tree[0]["no"] = $treetop;
ParseTree($list, $treetop, $tree);
// 前後のメッセージを検索
$prevmsg = $nextmsg = $flag = 0;
while (list($key, $val) = each($tree)) {
if ($flag) {
$nextmsg = $val["no"];
break;
}
if ($val["no"] == $no) {
$flag = 1;
continue;
} else
$prevmsg = $val["no"];
}
// メッセージ表示
DispMsg($bbs, $info);
// リプライボタン
?>
if (USE_DELETE) {
?>
}
// メッセージとツリーのリンク
?>
?>
// 表示
?>
reset($tree);
while (list($key, $val) = each($tree)) {
$indent = "";
// 親カテゴリの階層文字をセット
for ($i=1; $i<$list[$val["no"]]["depth"]; $i++) {
if ($depthchar[$i] == 2) $indent .= TREE1;
else if ($depthchar[$i] == 3) $indent .= TREE0;
}
// 同階層の階層文字をセット
if ($list[$val["no"]]["depth"]) {
if (!$val["last"]) {
$depthchar[$list[$val["no"]]["depth"]] = 2;
$indent .= TREE2;
} else {
$depthchar[$list[$val["no"]]["depth"]] = 3;
$indent .= TREE3;
}
}
// 表示
if ($val["no"] == $no) {
$str1 = "";
$str2 = "";
} elseif (!$list[$val["no"]]["delflag"]) {
$str1 = sprintf("", MYFILE, $bbs, $val["no"]);
$str2 = "";
} else {
$str1 = $str2 = "";
}
$addtitle = $list[$val["no"]]["delflag"] ? "(削除済)" : "";
// 最新日時のチェック
if ($list[$val["no"]]["date"] > time() - 86400) {
$temp1 = "";
$temp2 = "";
} else {
$temp1 = $temp2 = "";
}
$color = ($key % 2) ? BG_COL2 : BG_COL;
?>
|
echo $indent ?>
echo $str1.$list[$val["no"]]["title"].$addtitle.$str2 ?>
echo $list[$val["no"]]["name"] ?>
echo $temp1.date("Y/m/d H:i:s", $list[$val["no"]]["date"]).$temp2 ?>
|
}
?>
break;
// プレビュー
case "preview":
// 入力チェック
if (!$title) $errmsg .= "題名を入力してください。
\n";
if (!$name) $errmsg .= "お名前を入力してください。
\n";
if (USE_DELETE && !$delpass) $errmsg .= "削除パスワードを入力してください。
\n";
if ($mail) {
$ret = CheckMail($mail);
if ($ret == 1) {
$errmsg .= "メールアドレスに不正な文字が入っています。
\n";
$errmsg .= "「,」(カンマ)や全角文字が入っていないか確認してください。
\n";
} else if ($ret == 2) {
$errmsg .= "メールアドレスが正しくありません。
\n";
$errmsg .= "ホスト名(@の後の部分)を確認してください。
\n";
}
}
if (!$msg) $errmsg .= "メッセージを入力してください。
\n";
if ($errmsg) {
echo $errmsg;
echo "
戻る";
break;
}
$info["title"] = $title;
$info["name"] = $name;
$info["msg"] = str_replace("
", "\r\n", htmlspecialchars($msg));
$info["msg"] = str_replace(" ", " ", $info["msg"]);
$info["date"] = time();
// 表示
?>
このメッセージを投稿します。
よろしいですか?
DispMsg($bbs, $info);
// 確認
$str = $ref ? "返信の投稿" : "新規メッセージの投稿";
?>
break;
// メッセージの追加
case "add":
// クッキーの送信
if ($save) {
setcookie("BBS_NAME", urlencode($name), time() + COOKIE_EXPIRE);
setcookie("BBS_MAIL", urlencode($mail), time() + COOKIE_EXPIRE);
} else {
setcookie("BBS_NAME");
setcookie("BBS_MAIL");
}
// リストファイルの取得
$list = ReadListFile($bbs);
// ツリー番号の取得
$data["tree"] = $tree ? $tree : GetNumTree($list) + 1;
$newflag = $tree ? 0 : 1;
// 参照番号がある場合は参照投稿情報の取得
if ($ref) {
$info = GetMsg($list, $ref);
$data["ref"] = $ref;
$data["depth"] = $info["depth"] + 1;
} else {
$data["ref"] = 0;
$data["depth"] = 0;
}
$data["title"] = $title;
$data["name"] = $name;
$data["mail"] = $mail;
// メッセージの変換
$data["msg"] = htmlspecialchars($msg);
$data["msg"] = str_replace("`", "'", $data["msg"]);
$data["msg"] = str_replace("\r", "\n", $data["msg"]);
$data["msg"] = str_replace("\n\n", "\n", $data["msg"]);
$data["msg"] = str_replace("\n", "
", $data["msg"]);
$data["msg"] = str_replace(" ", " ", $data["msg"]);
$data["delpass"] = crypt($delpass, SALT);
$data["delflag"] = 0;
$data["date"] = mktime();
$data["remote"] = gethostbyaddr(getenv("REMOTE_ADDR"));
$data["agent"] = getenv("HTTP_USER_AGENT");
// メッセージの追加
AddMsg($bbs, $data);
// メール送信
if (USE_MAILSEND) {
$header = sprintf("From: %s <%s>", i18n_mime_header_encode($name), $mail ? $mail : ADMIN_MAIL);
$body = "お名前: $name\n".
"メール: $mail\n\n".
"$msg\n".
$mailfooter;
while (list($key, $val) = each($sendaddress)) {
$mailfunc($val, "[TreeBBS:$bbs]$title", $body, $header);
}
}
// リストファイルの取得
$list = ReadListFile($bbs);
// 表示画面にリダイレクト
$url = sprintf("%s?bbs=%s&act=view&no=%d", MYFILE, $bbs, count($list));
header("Location: $url");
break;
// 削除
case "delete":
// リスト取得
$list = ReadListFile($bbs);
// 削除機能チェック
if (!USE_DELETE) {
echo "削除機能は使用できません。
\n";
break;
}
// メッセージの取得
$info = GetMsg($list, $no);
// 表示
if ($info["ref"]) {
echo "このメッセージを削除します。
\n";
echo "よろしいですか?
\n";
} else {
echo "トピックを削除すると、そのトピック以下のメッセージも削除されます。
\n";
echo "よろしいですか?
\n";
}
DispMsg($bbs, $info);
// 確認
?>
break;
// 削除実行
case "delexec":
// 削除機能チェック
if (!USE_DELETE) {
echo "削除機能は使用できません。
\n";
break;
}
// リスト取得
$list = ReadListFile($bbs);
// 削除パスワード比較
if ($list[$no]["delpass"] == crypt($delpass, SALT)) {
$list[$no]["delflag"] = 1;
$msg = "メッセージを削除しました。";
} else {
$msg = "削除パスワードが違います。\n";
}
// リスト格納
WriteListFile($bbs, $list);
// 表示
?>
echo $msg ?>
トピックに戻る
break;
// トピック一覧の表示
default:
// リスト取得
$list = ReadListFile($bbs);
$listnum = count($list);
// 新着メッセージの表示
if ($listnum) {
$num = 0;
$maxmsg = ($listnum > NEW_MESSAGE) ? NEW_MESSAGE : $listnum;
for ($i=count($list); $i>0 && $num<$maxmsg; $i--) {
if (!$list[$i]["delflag"]) {
// 投稿日時のチェック
if ($list[$i]["date"] > time() - 86400) {
$temp1 = "";
$temp2 = "";
} else {
$temp1 = $temp2 = "";
}
if (!$flag_header) {
$flag_header = 1;
?>
}
}
if ($listnum) {
// トピックリスト取得
$topic = GetListTopic($list);
if (count($topic)) {
?>
トピック一覧
}
}
break;
}
if ($act != "add" && $act != "icon") {
// フッタの表示
DispFooter();
}
?>