タグのネストを修正。 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 ?>


TreeBBS by trustBee
トピックの一覧 全メッセージの表示 新規トピックの作成

", MYFILE, $bbs, $info["no"]); $titlestr2 = ""; } $msg = $info["delflag"] ? "このメッセージは削除されました" : nl2br($info["msg"]); // URLのリンク $msg = preg_replace("'(http://[-_~./?=%+#&;:\w]+)'", "".htmlspecialchars('\\1')."", $msg); ?>
">
", $msg); $msg = "> ".implode("\n> ", $temp); } // ボタン $str = $ref ? "返信のプレビュー" : "新規トピックのプレビュー"; // 投稿フォーム表示 ?>
さんの「」への返信
題名
お名前
メールアドレス 情報を保存する
メッセージ
削除パスワード

%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; } ?> メッセージの返信を入力してください。

0) { ?> 前のページ 0) { ?> 次のページ

=$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); // リプライボタン ?>
<前 次>
<< >>

"; $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; ?>
\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(); // 表示 ?> このメッセージを投稿します。
よろしいですか?

", $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); // 確認 ?>
削除パスワード
\n"; break; } // リスト取得 $list = ReadListFile($bbs); // 削除パスワード比較 if ($list[$no]["delpass"] == crypt($delpass, SALT)) { $list[$no]["delflag"] = 1; $msg = "メッセージを削除しました。"; } else { $msg = "削除パスワードが違います。\n"; } // リスト格納 WriteListFile($bbs, $list); // 表示 ?>

トピックに戻る 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; ?>
新着メッセージ
"> ">

トピック一覧

time() - 86400) { $temp1 = ""; $temp2 = ""; } else { $temp1 = $temp2 = ""; } ?>
タイトル お名前 最新更新時刻
"> () ">