「掲示板」の編集履歴(バックアップ)一覧はこちら

掲示板 - (2005/12/09 (金) 09:35:13) の1つ前との変更点

追加された行は緑色になります。

削除された行は赤色になります。

<?php if (phpversion() >= "4.1.0") { extract($_GET); extract($_POST); extract($_SERVER); extract($_COOKIE); } //■基本設定 $masterpass = "0000"; //管理パスワード $bbstitle = "BBS"; //掲示板タイトル $homeurl = 'http://www7.atwiki.jp/chacha/pages/35.html'; //戻る先URL $stylesheet = 'style.css'; //CSSファイル指定 $my_url = $_SERVER{'PHP_SELF'}; $logfile = 'log.txt'; //ログファイル名 $default_num = 10; //ログ表示数 $reslimit = 7; //返信できる最大数 //クッキー名 $cookie_name = "noblogbbs_c"; //■文字数 $name_max = 30; //名前文字数(全角) $title_max = 50; //タイトル文字数(全角) $com_max =2000; //メッセージ文字数(全角) $pass_max = 8; //パスワード文字数(半角) //■文字色 $colorvalue = array('#000000'=>'黒','blue'=>'青','green'=>'緑','yellow'=>'黄','white'=>'白','pink'=>'桃'); // 選択クラス名を定義(クラス名=>選択時表示名 $collen = 6; //折り返しの数 //================================================// //■メイン // //================================================// $dp = new Display(); $rg = new Regist(); $sr = new Search(); $pl = new Pastlog(); if($_SERVER['REQUEST_METHOD'] == "GET"){ $_POST['mode'] = &$_GET['mode']; } if($_POST['mode'] =="write" || $_POST['mode'] =="reswrite"){ $rg->set_cookie(); } $dp->header_html();//ヘッダー $dp->menu_bar();//メニューバー switch($_POST['mode']): case 'write-h': // 書き込みフォーム $rg->write_html("write"); break; case 'write': // 書き込み処理 $rg->write(); break; case 'reswrite': // レス処理 $rg->reswrite(); break; case 'serach-h': // 検索表示 $sr->serach_html(); break; case 'serach': // 検索表示 $sr->serach(); break; case 'delete': // 削除処理 $rg->delete(); break; case 'past': // 過去ログ $pl->past_html(); break; case 'th_view': // スレッド表示 $dp->thread_view(); break; default: $dp->view();// 一覧表示 break; endswitch; $dp->footer_html();//フッター exit(); //================================================// //■書き込み部 // //◇write_html() 新規投稿画面 //◇write() 書き込み処理 //◇write_check 文字チェック // //================================================// class Regist{ //================================================// //□投稿画面 //================================================// function write_html($mode,$id="",$error ="",$r_name="",$r_mail="",$r_url="",$r_title="",$r_com=""){ global $cookie_name,$colorvalue,$collen,$name_max,$title_max,$com_max,$pass_max; //クッキーがあるか調べる if (isset($_COOKIE["$cookie_name"])) { $cookie = $_COOKIE["$cookie_name"]; } list($c_name,$c_mail,$c_url,$c_col,$c_pass) = split("<>", $cookie); //入力ミスで戻ってきたのじゃなければクッキー if($r_name == ""){ $r_name = $c_name; } if($r_mail == ""){ $r_mail = $c_mail; } if($r_url == ""){ $r_url = $c_url; } //フォントカラー準備 //初期化 $select = array(""); //フォントカラー表示 $i=0; foreach($colorvalue as $key => $value) { //初期値決定 if($c_col == $key){ $checked="checked"; }else{ $checked=""; //クッキーがない場合 if($c_col==""){ $checked = "checked"; //ダミー書き込み $c_col ="true"; } } //折り返し if($i==$collen){ $i=0; array_push($select,"<br/>"); } //格納 array_push($select,"<input type=radio name=color value=\"$key\"$checked>$value"); $i++; } if($mode =="write"){ $titlcom ="<h3>新規スレッド作成フォーム</h3>"; $modeflg ="<span class=\"error\">*</span>"; }else{ $titlcom ="<h3>返信フォーム</h3>"; $modeflg =""; } echo <<<EOM <div align="center" > <table class="write-h-table"> <tr> <td>{$titlcom} <span class="error">$error</span> </td> </tr> </table> <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="$mode"> <input type=hidden name="id" value="$id"> <table class ="write-table"> <tr> <td><span class="error">*</span><b>名前:</b></td> <td><input type=text name=name size=40 value="$r_name" title ="全角{$name_max}文字以内"></td> </tr><tr> <td><b>E-mail:</b></td> <td><input type=text name=mail size=40 value="$r_mail"></td> </tr> EOM; //スレッド作成の場合はタイトル入力 if($mode =="write"){ echo"<tr> <td><span class=\"error\">*</span><b>タイトル:</b></td\> <td><input type=text name=title size=40 value=\"$r_title\" title =\"全角{$title_max}文字以内\"></td> </tr>"; } echo <<<EOM <tr> <td><span class="error">*</span><b>メッセージ:</b></td> <td><textarea rows="7" name="comment" cols="35" "title=全角{$com_max}文字以内">$r_com</textarea></td> </tr><tr> <td><b>URL:</b></td> <td><input type=text name=url size=50 value="http://$r_url"></td> </tr><tr> <td><b>フォントカラー:</b></td> <td> EOM; //配列を文字列で表示(implode) echo implode("\n",$select); echo <<<EOM </td> </tr><tr> <td>{$modeflg}<b>パスワード:</b></td> <td><input type="password" name=pass value="$c_pass" size="10" maxlength="$pass_max" title="半角英数{$pass_max}文字以内"></td> </tr><tr> <td colspan="2" height="40"><input type=submit value="投稿する"><input type=reset value="リセット"><br> *は必須次項<br> メッセージは{$com_max}文字以内</td> </tr> </table> </form> </div> EOM; } //================================================// //□書き込み処理 //================================================// function write(){ global $logfile,$my_url; $name =$_POST['name']; $title =$_POST['title']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $com = $_POST['comment']; $que = $_POST['question']; //文字数チェック $this->write_check("write"); //時間を取得 $time = gmdate("Y/m/d H:i:s",time()+9*60*60); // パスワードの暗号化 $pass = ""; if($_POST['pass'] != ""){ $pass = md5($_POST['pass']); } //ホスト取得 $host =$this->get_host(); //ログ読み込み $lines = file($logfile); //前回の記事読み込み list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[0]); //二重投稿防止 if(($b_name == $name) &&($b_com == $com)){ die("二重投稿は禁止です。"); } //スレッドNO+ $snum =1 + $b_snum; //数初期化 $num = 0;//記事内No $cnt = 0;//参照数 $res = 0;//返信数 //改行用 $com = str_replace("\r\n", "\r", $com); //Win系は\r\n $com = str_replace("\r", "\n", $com); //Mac系は\r $com = str_replace("\n", "<br/>", $com);//<br>に置き換え //特殊文字 $name = $this->str_change($name); $title = $this->str_change($title); $com = $this->str_change($com); //URL置き換え $url = ereg_replace("http://","",$url); //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //ファイルオープン $fp = fopen($logfile,"w")or error("ログファイルを開けません"); //ロック開始 flock($fp, LOCK_EX); fputs($fp, $line); //先頭に書き込み for($i = 0; ; $i++){ if(!$lines[$i]) break; $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp, "$lines[$i]\n"); //現行ログ書き込み } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); echo"書き込みました。"; //一覧にもどる $this->back_html($my_url); } //================================================// //□レス処理 //================================================// function reswrite(){ global $logfile,$my_url; $name =$_POST['name']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $com = $_POST['comment']; $que = $_POST['question']; $sid = $_POST['id']; //文字数チェック $this->write_check("reswrite",$sid); //時間を取得 $time = gmdate("Y/m/d H:i:s",time()+9*60*60); // パスワードの暗号化 $pass = ""; if($_POST['pass'] != ""){ $pass = md5($_POST['pass']); } //ホスト取得 $host =$this->get_host(); //ログ読み込み $lines = file($logfile); //前回の記事読み込み list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[0]); //二重投稿防止 if(($b_name == $name) &&($b_com == $com)){ die("二重投稿は禁止です。\n"); } //親記事探しNO+ for($i=0; $i<sizeof($lines); $i++){ list($o_snum,$o_num, $o_title ,$o_time, $o_name, $o_mail, $o_url, $o_com,$o_color, $o_pass, $o_res, $o_cnt,$o_que,$o_host) = split("<>", $lines[$i]); //見つかった if($sid == $o_snum){ break; } } $num =1 + $o_num;//No+ $res = 1+$o_res;//返信数 //数初期化 $snum = $sid;//親記事No $cnt = 0;//参照数 //改行用 $com = str_replace("\r\n", "\r", $com); //Win系は\r\n $com = str_replace("\r", "\n", $com); //Mac系は\r $com = str_replace("\n", "<br/>", $com);//<br>に置き換え //URL置き換え $url = ereg_replace("http://","",$url); //特殊文字 $com = $this->str_change($com); $name = $this->str_change($name); $title = $this->str_change($title); //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //ファイルオープン $fp = fopen($logfile,"w")or error("ログファイルを開けません"); //ロック開始 flock($fp, LOCK_EX); //fputs($fp, $line); //先頭に書き込み $check = 0; for($i = 0;$i<sizeof($lines); $i++){ list($o_snum,$o_num, $o_title ,$o_time, $o_name, $o_mail, $o_url, $o_com,$o_color, $o_pass, $o_res, $o_cnt,$o_que,$o_host) = split("<>", $lines[$i]); //該当記事かどうか if($check == 0 && $sid == $o_snum){ $line = rtrim($line);//空白削除 fputs($fp,"$line\n");//書き込み $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n");//現行ログ書き込み $check =1; }else{ $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n");//現行ログ書き込み } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); echo"書き込みました。"; //一覧にもどる $this->back_html("{$my_url}?mode=th_view&id={$sid}"); } //================================================// //□文字チェック // // ◇$get モード判別 // //================================================// function write_check($get,$id=""){ global $name_max,$title_max,$com_max,$pass_max; //名前文字数チェック if(strlen($_POST['name']) > ($name_max*2)){ $error .="名前が全角{$name_max}文字を超えています<br/>"; }elseif($_POST['name'] == ""){ $error .="名前が入力されていません<br/>"; } if($get =="write"){ //タイトル文字数チェック if(strlen($_POST['title']) > ($title_max*2)){ $error .="タイトルが全角{$title_max}文字を超えています<br/>"; }elseif($_POST['title'] == ""){ $error .="タイトルが入力されていません<br/>"; } } //メッセージ文字数チェック if(strlen($_POST['comment']) > ($com_max*2)){ $error .="コメントが全角{$com_max}文字を超えています<br/>"; }elseif($_POST['comment'] == ""){ $error .="メッセージが入力されていません<br/>"; } //メアド形式チェック if($_POST['email'] != "" && !preg_match('/[\w.-]+\@[\w.-]+\.[a-zA-Z]{2,3}/', $_POST['email'])){ $error .="メールアドレスの入力内容が正しくありません<br/>"; $_POST['email'] =""; } //パスワード文字数チェック if(strlen($_POST['pass']) > ($pass_max)){ $error .="パスワードが半角{$com_max}文字を超えています<br/>"; }elseif($_POST['pass'] == "" && $get =="write"){ $error .="パスワードが入力されていません<br/>"; } if($error != ""){ //いらんとこ消す $url = ereg_replace("http://","",$url); //書き込み画面へ $this->write_html($get,$id,$error,$_POST['name'],$_POST['email'],$url,$_POST['title'],$_POST['comment']); exit(); } } //================================================// //□文字修正 function str_change($str){ //\を削除 if(get_magic_quotes_gpc()){ $str = stripslashes($str); } $str = str_replace("&amp;", "&", $str); $str = str_replace("&quot;", '"', $str); return $str; } //□ホストアドレス取得 function get_host(){ $host = getenv("REMOTE_HOST"); $addr = getenv("REMOTE_ADDR"); if($host == "" || $host == $addr){ $host = @gethostbyaddr($addr); } return $host; } //クッキー function set_cookie(){ global $cookie_name; $name =$_POST['name']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $pass = $_POST['pass']; //http://削る $url = ereg_replace("http://","",$url); //クッキーに書き込む内容 $cook_val = array($name,$mail,$url,$color,$pass); //配列を文字列に $cookie_val =implode("<>", $cook_val); //時間 $data =time()+60*60*24*7; //クッキーセット setcookie($cookie_name,$cookie_val,$data); } function back_html($url) { echo "<meta http-equiv=\"refresh\" content=\"0;url='{$url}'\">"; } //================================================// //□削除処理 // // ◇$sid スレッドNo // ◇$id 記事No // ◇$match パスワードチェックor記事があるかないか // ◇$delflg スレッド削除かどうか // //================================================// function delete(){ global $logfile; $sid =$_POST['sid']; $id =$_POST['id']; $pass = md5($_POST['pass']); // echo"スレッドNo $sid 記事No $id"; // ログ読み込み $lines = file($logfile); //パスワードチェック $match=0; for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($id == 0){ //スレッド見つけた if($sid == $b_snum && $pass == $b_pass){ $match=1; break; } }else{ //記事見つけた if($sid == $b_snum && $id == $b_num && $pass == $b_pass){ $match=1; break; } } } if($match==0){ echo"パスワードが違います。"; $dp = new Display(); $dp->footer_html(); exit; } //ログオープン $fp = @fopen($logfile,"w"); //ロック開始 flock($fp, LOCK_EX); //削除する記事検索 $match=0; $delflg =0; for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($sid == $b_snum){ if($id == 0 || $delflg ==1){ //スレッド削除ならレス記事も削除 $delflg= 1; $match=1; continue; } elseif($id == $b_num){ //指定されたNoのみ削除 $match=1; continue; }else{ //親記事削除ないなら他の記事は残す fputs($fp,$lines[$i]); } }else{ fputs($fp,$lines[$i]); } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); if($match==0){ echo"該当記事がありません。"; }else{ echo"削除しました。"; } } } //================================================// //■表示部 // //◇menu_bar() メニューバー //◇thread_view() スレッド表示 //◇view() 記事一覧 //◇page_navi() ページナビ //◇point_get() 現在位置取得 //◇page_count() ページ総数計算 // //================================================// class Display{ var $snum; //スレッドNo var $num; //記事内No var $title; //スレッドタイトル var $time; //時間 var $name; //投稿者名前 var $mail; //投稿者メルアド var $url; //投稿者URL var $com; //コメント var $pass; //パスワード var $cnt; //参照数 var $res; //返信数 var $que; //質問 var $host; //リモートホスト //================================================// //□メニューバー //================================================// function menu_bar(){ global $bbstitle,$homeurl; echo <<<EOM <div align="center"> <p> <a href="$home_url">ホーム</a> | <a href="${_SERVER['PHP_SELF']}">記事一覧</a> | <a href="$PHP_SELF?mode=write-h">新規投稿</a> <a href="$PHP_SELF?mode=serach-h">検索</a> <a href="$PHP_SELF?mode=past">過去ログ</a> </p> </div> <div class="hr"></div> EOM; } //================================================// // スレッド表示 // // $sid スレッド番号 // $match 見つかったかどうかのフラグ // $resflg レスフラグ // $t_cnt 親記事数 // //================================================// function thread_view(){ global $logfile,$default_num,$reslimit; //受け取り $sid =$_GET['id']; //親記事数カウント $page_all = $this->page_count(); //初期化 $match=0; // ログ読み込み $lines = file($logfile); $resflg =0;//レスフラグ //表示 for($i=0; $i<sizeof($lines) && $match ==0; $i++){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($sid == $snum){ //スレッド見つかった if($num==0){ //親記事見つかった $cnt++; $match =1; break; }elseif($num =! 0 && $resflg==0){ //レスがあった場合 $resflg =1; } } } //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //ログオープン $fp = @fopen($logfile,"w"); //ロック開始 flock($fp, LOCK_EX); for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($sid == $b_snum && $b_num == 0){ $line = rtrim($line);//空白削除 fputs($fp,"$line\n"); }else{ $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n"); } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); //見つからなかった場合 if($match ==0){ echo"該当記事が見つかりません。"; } //置き換え if($mail){ $name ="<a href=\"mailto:$mail\">$name</a>"; } if($url){ $urltag ="<a href=\"http://$url\">HP</a>"; }else{ $urltag =""; } //No1から $num++; //親記事表示 echo" <table border=\"1\" align=\"center\" class=\"thread-table\"> <tr> <td>□{$title} <br/> name:{$name} No.{$num} 日付:{$time} $urltag<br/> <br/> <font color=\"$color\">$com</font></td> </tr> </table> "; //レスがある場合 if($resflg ==1){ echo"<table border=\"1\" align=\"center\" class=\"thread-table\">"; $res_view = array(""); $rcnt=0; //レス表示 for($i=0; $i<sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($sid == $snum && $num !=0){ $res_view[$rcnt]="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host"; $rcnt++; } } for($j= $rcnt-1; $j >= 0; $j--){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $res_view[$j]); if($mail){ $name ="<a href=\"mailto:$mail\">$name</a>"; } $num++; echo" <tr> <td>□No.{$num} {$name} 日付:{$time}<br/> <br/> <font color=\"$color\">$com</font></td> </tr> "; } echo"</table>"; } //書き込みフォーム //書き込み数がいっぱいならもう書き込めない if($rcnt < $reslimit-1){ //reswriteでレスモード $rg = new Regist(); $rg->write_html("reswrite",$sid); }else{ echo"もうこれ以上書き込めません。"; } //削除フォーム $this->delete_html($sid,"1001"); } //================================================// //□記事一覧 // // $pagenow 現在ページ // $page_all 総ページ数 // $pn ポインタ位置 // $t_cnt 親記事数 // //================================================// function view(){ global $logfile,$default_num; //テーブル開始 echo "<table border=\"1\" align=\"center\" class=\"view-table\"> <tr> <td class=\"table-no\"></td> <td class=\"table-no\">No.</td> <td class=\"table-title\">タイトル</td> <td class=\"table-name\">投稿者</td> <td class=\"table-count\">参照数</td> <td class=\"table-count\">返信数</td> <td class=\"table-update\">最終更新</td> </tr>"; // 現在のページ取得 if($_GET['page']){ //値を受け取っている場合 $pagenow = $_GET['page']; }else{ //1記事から $pagenow = 1; } //親記事数カウント $page_all = $this->page_count(); // ログ読み込み $lines = file($logfile); //現在位置定義 $t_cnt =0; //親記事数 $pn=0; //ポインタは先頭 //2ページ目以降 if($pagenow != 1){ //ポインタ位置代入 $pn = $this->point_get($pagenow); } $tugi=0; //表示 for($i=$pn; $t_cnt < $default_num && $i< sizeof($lines); $i++){ //代入 list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($tugi != $snum){ $tugi = $snum; $v_res =$res; $v_name=$name; } //親記事発見 if($num== 0){ echo "<tr> <td>$que</td> <td>$snum</td> <td><a href=\"$PHP_SELF?mode=th_view&id={$snum}\">$title</td> <td>$name</td> <td>$cnt</td> <td>$v_res</td> <td>$time<br/>by $v_name</td> </tr>"; //親記事でカウント $t_cnt++; } } echo "</table>"; //ページナビゲーション $this->page_navi($page_all,$pagenow); //削除フォーム $this->delete_html("","0"); } //================================================// //□ページナビゲーション // // // // $page_all ページ総数 // // $pagenow 現在のページ // // $num_remainder 残り件数(最後の残り端数用) // // // //================================================// function page_navi($page_all,$pagenow){ global $default_num; echo"<div align=\"center\">"; //端数があるかないか if($page_all < ($pagenow +1) * $default_num){ $num_remainder = (($pagenow+1)* $default_num) - $page_all; $num_remainder = $default_num - $num_remainder; }else{ $num_remainder = $default_num; } //総ページ数をカウント $page_all = ceil($page_all / $default_num); //前の件数 //1ページ目なら前の件数はリンクなし if($pagenow == 1) { $prev = "前件なし"; }else { //ページが前に戻るので-1 $prevpage = $pagenow - 1; $prev = "<a href=\"$PHP_SELF?page={$prevpage}\">前の{$default_num}件</a>"; } //次の件数 //最後のページ目なら次の件数はリンクなし if($pagenow == $page_all) { $next = "次件なし"; } else { //ページを先に進めるので+1 $nextpage = $pagenow + 1; $next = "<a href=\"$PHP_SELF?page={$nextpage}\">次の{$num_remainder}件</a>"; } echo "<p>$prev | $pagenow / $page_all ページ | $next</p></div>"; } //================================================// //□削除画面 // //================================================// function delete_html($sid,$id){ global $pass_max; // echo"スレッドNo $sid 記事No $id"; //スレッド削除なら if($id == 0){ $idname = "id"; $idvalue = 0; $delname = "sid"; }else{ $idname = "sid"; $idvalue = $sid; $delname = "id"; } echo <<<EOM <div align="right"> <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="delete"> <input type=hidden name="$idname" value="$idvalue"> <table class="delete-table"> <tr> <td nowrap >削除No:<input type=text name="$delname" size=8></td> <td nowrap >パスワード:</b><input type=password name=pass size=8 maxlength="$pass_max"></td> <td nowrap ><input type=submit value="削除する"></td> </tr> </table> </form> </div> EOM; } //================================================// // ヘッダー //================================================// function header_html(){ global $stylesheet,$bbstitle,$charset,$jcode; echo <<<HTML <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=$charset[$jcode]"> <title>$bbstitle</title> <link rel="stylesheet" type="text/css" href="$stylesheet"> </head> <body> <h1>$bbstitle</h1> HTML; } //================================================// // フッター //================================================// function footer_html(){ echo <<<HTML <div class="hr"></div> </body></html> HTML; } //================================================// //□現在位置取得 // // $pagenow 現在ページ // $end 終了位置 // $t_cnt 親記事数 // //================================================// function point_get($pagenow){ global $logfile,$default_num; // ログ読み込み $lines = file($logfile); //終了位置 $end =($pagenow - 1)*$default_num; $t_cnt =0; //親記事数 for($i= 0; $t_cnt<$end && $i< sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); //親記事発見 if($num== 0){ //親記事数でカウント $t_cnt++; } } //現在位置返す return $i; } //================================================// //□記事数計算 // // $t_cnt 親記事数 // //================================================// function page_count(){ global $logfile; // ログ読み込み $lines = file($logfile); $t_cnt = 0; //親記事数カウント for($i=0; $i<sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($num==0){ $t_cnt++; } } //ない場合は1代入 if($t_cnt == 0){ $t_cnt =1; } return $t_cnt; } } class Search{ function serach_html(){ global $bbstitle,$homeurl; echo <<<EOM 検索 <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="serach"> <table class="delete-table"> <tr> <td>検索文字:<input type=text name="$delname" size=20></td> </tr><tr> <td>and:<input type=radio name=flg value="0" checked> or:<input type=radio name=flg value="1"></td> </tr><tr> <td ><input type=submit value="検索"></td> </tr> </table> </form> EOM; } function serach(){ global $bbstitle,$homeurl; echo <<<EOM 検索処理 EOM; } } class Pastlog{ function past_html(){ global $bbstitle,$homeurl; echo <<<EOM 過去ログ EOM; } } ?>
<?php if (phpversion() >= "4.1.0") { extract($_GET); extract($_POST); extract($_SERVER); extract($_COOKIE); } //■基本設定 $masterpass = "0000"; //管理パスワード $bbstitle = "BBS"; //掲示板タイトル $homeurl = 'http://www7.atwiki.jp/chacha/pages/35.html'; //戻る先URL $stylesheet = 'style.css'; //CSSファイル指定 $my_url = $_SERVER{'PHP_SELF'}; $logfile = 'log.txt'; //ログファイル名 $default_num = 10; //ログ表示数 $reslimit = 7; //返信できる最大数 //クッキー名 $cookie_name = "noblogbbs_c"; //■文字数 $name_max = 30; //名前文字数(全角) $title_max = 50; //タイトル文字数(全角) $com_max =2000; //メッセージ文字数(全角) $pass_max = 8; //パスワード文字数(半角) //■文字色 $colorvalue = array('#000000'=>'黒','blue'=>'青','green'=>'緑','yellow'=>'黄','white'=>'白','pink'=>'桃'); // 選択クラス名を定義(クラス名=>選択時表示名 $collen = 6; //折り返しの数 //================================================// //■メイン // //================================================// $dp = new Display(); $rg = new Regist(); $sr = new Search(); $pl = new Pastlog(); if($_SERVER['REQUEST_METHOD'] == "GET"){ $_POST['mode'] = &$_GET['mode']; } if($_POST['mode'] =="write" || $_POST['mode'] =="reswrite"){ $rg->set_cookie(); } $dp->header_html();//ヘッダー $dp->menu_bar();//メニューバー switch($_POST['mode']): case 'write-h': // 書き込みフォーム $rg->write_html("write"); break; case 'write': // 書き込み処理 $rg->write_main(); break; case 'reswrite': // レス処理 $rg->reswrite_main(); break; case 'serach-h': // 検索表示 $sr->serach_html(); break; case 'serach': // 検索表示 $sr->serach(); break; case 'delete': // 削除処理 $rg->delete(); break; case 'past': // 過去ログ $pl->past_html(); break; case 'th_view': // スレッド表示 $dp->thread_view(); break; default: $dp->view();// 一覧表示 break; endswitch; $dp->footer_html();//フッター exit(); //================================================// //■書き込み部 // //◇write_html() 新規投稿画面 //◇write() 書き込み処理 //◇write_check 文字チェック // //================================================// class Regist{ //================================================// //□投稿画面 //================================================// function write_html($mode,$id="",$error ="",$r_name="",$r_mail="",$r_url="",$r_title="",$r_com=""){ global $cookie_name,$colorvalue,$collen,$name_max,$title_max,$com_max,$pass_max; //クッキーがあるか調べる if (isset($_COOKIE["$cookie_name"])) { $cookie = $_COOKIE["$cookie_name"]; } list($c_name,$c_mail,$c_url,$c_col,$c_pass) = split("<>", $cookie); //入力ミスで戻ってきたのじゃなければクッキー if($r_name == ""){ $r_name = $c_name; } if($r_mail == ""){ $r_mail = $c_mail; } if($r_url == ""){ $r_url = $c_url; } //フォントカラー準備 //初期化 $select = array(""); //フォントカラー表示 $i=0; foreach($colorvalue as $key => $value) { //初期値決定 if($c_col == $key){ $checked="checked"; }else{ $checked=""; //クッキーがない場合 if($c_col==""){ $checked = "checked"; //ダミー書き込み $c_col ="true"; } } //折り返し if($i==$collen){ $i=0; array_push($select,"<br/>"); } //格納 array_push($select,"<input type=radio name=color value=\"$key\"$checked>$value"); $i++; } if($mode =="write"){ $titlcom ="<h3>新規スレッド作成フォーム</h3>"; $modeflg ="<span class=\"error\">*</span>"; }else{ $titlcom ="<h3>返信フォーム</h3>"; $modeflg =""; } echo <<<EOM <div align="center" > <table class="write-h-table"> <tr> <td>{$titlcom} <span class="error">$error</span> </td> </tr> </table> <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="$mode"> <input type=hidden name="id" value="$id"> <table class ="write-table"> <tr> <td><span class="error">*</span><b>名前:</b></td> <td><input type=text name=name size=40 value="$r_name" title ="全角{$name_max}文字以内"></td> </tr><tr> <td><b>E-mail:</b></td> <td><input type=text name=mail size=40 value="$r_mail"></td> </tr> EOM; //スレッド作成の場合はタイトル入力 if($mode =="write"){ echo"<tr> <td><span class=\"error\">*</span><b>タイトル:</b></td\> <td><input type=text name=title size=40 value=\"$r_title\" title =\"全角{$title_max}文字以内\"></td> </tr>"; } echo <<<EOM <tr> <td><span class="error">*</span><b>メッセージ:</b></td> <td><textarea rows="7" name="comment" cols="35" "title=全角{$com_max}文字以内">$r_com</textarea></td> </tr><tr> <td><b>URL:</b></td> <td><input type=text name=url size=50 value="http://$r_url"></td> </tr><tr> <td><b>フォントカラー:</b></td> <td> EOM; //配列を文字列で表示(implode) echo implode("\n",$select); echo <<<EOM </td> </tr><tr> <td>{$modeflg}<b>パスワード:</b></td> <td><input type="password" name=pass value="$c_pass" size="10" maxlength="$pass_max" title="半角英数{$pass_max}文字以内"></td> </tr><tr> <td colspan="2" height="40"><input type=submit value="投稿する"><input type=reset value="リセット"><br> *は必須次項<br> メッセージは{$com_max}文字以内</td> </tr> </table> </form> </div> EOM; } //================================================// //□書き込み処理 //================================================// function write_main(){ global $logfile,$my_url; $name =$_POST['name']; $title =$_POST['title']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $com = $_POST['comment']; $pass = $_POST['pass']; $que = 0; //文字数チェック $this->write_check("write"); //時間を取得 $time = gmdate("Y/m/d H:i:s",time()+9*60*60); // パスワードの暗号化 $pass = $this->mod_pass($pass); //ホスト取得 $host =$this->get_host(); //ログ読み込み $lines = file($logfile); //前回の記事読み込み list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[0]); //二重投稿防止 if(($b_name == $name) &&($b_com == $com)){ die("二重投稿は禁止です。"); } //スレッドNO+ $snum =1 + $b_snum; //数初期化 $num = 0;//記事内No $cnt = 0;//参照数 $res = 0;//返信数 //改行用 $com = str_replace("\r\n", "\r", $com); //Win系は\r\n $com = str_replace("\r", "\n", $com); //Mac系は\r $com = str_replace("\n", "<br/>", $com);//<br>に置き換え //特殊文字 $name = $this->str_change($name); $title = $this->str_change($title); $com = $this->str_change($com); //URL置き換え $url = ereg_replace("http://","",$url); //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //書き込み $this->write("write","0",$line); //一覧にもどる $this->back_html($my_url); } //================================================// //□レス処理 //================================================// function reswrite_main(){ global $logfile,$my_url; $name =$_POST['name']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $com = $_POST['comment']; $que = $_POST['question']; $sid = $_POST['id']; //文字数チェック $this->write_check("reswrite",$sid); //時間を取得 $time = gmdate("Y/m/d H:i:s",time()+9*60*60); // パスワードの暗号化 $pass = $this->mod_pass($pass); //ホスト取得 $host =$this->get_host(); //ログ読み込み $lines = file($logfile); //前回の記事読み込み list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[0]); //二重投稿防止 if(($b_name == $name) &&($b_com == $com)){ die("二重投稿は禁止です。\n"); } //親記事探しNO+ for($i=0; $i<sizeof($lines); $i++){ list($o_snum,$o_num, $o_title ,$o_time, $o_name, $o_mail, $o_url, $o_com,$o_color, $o_pass, $o_res, $o_cnt,$o_que,$o_host) = split("<>", $lines[$i]); //見つかった if($sid == $o_snum){ break; } } //値代入 $num =1 + $o_num;//No+ $res = 1+$o_res;//返信数 $snum = $sid;//親記事No $cnt = 0;//参照数 //改行用 $com = str_replace("\r\n", "\r", $com); //Win系は\r\n $com = str_replace("\r", "\n", $com); //Mac系は\r $com = str_replace("\n", "<br/>", $com);//<br>に置き換え //URL置き換え $url = ereg_replace("http://","",$url); //特殊文字 $com = $this->str_change($com); $name = $this->str_change($name); $title = $this->str_change($title); //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //書き込み $this->write("reswrite",$sid,$line); //一覧にもどる $this->back_html("{$my_url}?mode=th_view&id={$sid}"); } //================================================// //■書き込み //================================================// function write($mode,$sid="0",$line){ global $logfile; //ログ読み込み $lines = file($logfile); //ファイルオープン $fp = fopen($logfile,"w")or error("ログファイルを開けません"); //ロック開始 flock($fp, LOCK_EX); if($mode =="reswrite"){ $check = 0; for($i = 0;$i<sizeof($lines); $i++){ list($o_snum,$o_num, $o_title ,$o_time, $o_name, $o_mail, $o_url, $o_com,$o_color, $o_pass, $o_res, $o_cnt,$o_que,$o_host) = split("<>", $lines[$i]); //該当記事かどうか if($check == 0 && $sid == $o_snum){ $line = rtrim($line);//空白削除 fputs($fp,"$line\n");//書き込み $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n");//現行ログ書き込み $check =1; }else{ $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n");//現行ログ書き込み } } }else{ fputs($fp, $line); //先頭に書き込み for($i = 0;$i<sizeof($lines); $i++){ $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp, "$lines[$i]\n"); //現行ログ書き込み } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); echo"書き込みました。"; } //================================================// //□文字チェック // // ◇$get モード判別 // //================================================// function write_check($get,$id=""){ global $name_max,$title_max,$com_max,$pass_max; //名前文字数チェック if(strlen($_POST['name']) > ($name_max*2)){ $error .="名前が全角{$name_max}文字を超えています<br/>"; }elseif($_POST['name'] == ""){ $error .="名前が入力されていません<br/>"; } if($get =="write"){ //タイトル文字数チェック if(strlen($_POST['title']) > ($title_max*2)){ $error .="タイトルが全角{$title_max}文字を超えています<br/>"; }elseif($_POST['title'] == ""){ $error .="タイトルが入力されていません<br/>"; } } //メッセージ文字数チェック if(strlen($_POST['comment']) > ($com_max*2)){ $error .="コメントが全角{$com_max}文字を超えています<br/>"; }elseif($_POST['comment'] == ""){ $error .="メッセージが入力されていません<br/>"; } //メアド形式チェック if($_POST['email'] != "" && !preg_match('/[\w.-]+\@[\w.-]+\.[a-zA-Z]{2,3}/', $_POST['email'])){ $error .="メールアドレスの入力内容が正しくありません<br/>"; $_POST['email'] =""; } //パスワード文字数チェック if(strlen($_POST['pass']) > ($pass_max)){ $error .="パスワードが半角{$com_max}文字を超えています<br/>"; }elseif($_POST['pass'] == "" && $get =="write"){ $error .="パスワードが入力されていません<br/>"; } if($error != ""){ //いらんとこ消す $url = ereg_replace("http://","",$url); //書き込み画面へ $this->write_html($get,$id,$error,$_POST['name'],$_POST['email'],$url,$_POST['title'],$_POST['comment']); exit(); } } //================================================// //□文字修正 function str_change($str){ //\を削除 if(get_magic_quotes_gpc()){ $str = stripslashes($str); } $str = str_replace("&amp;", "&", $str); $str = str_replace("&quot;", '"', $str); return $str; } //□ホストアドレス取得 function get_host(){ $host = getenv("REMOTE_HOST"); $addr = getenv("REMOTE_ADDR"); if($host == "" || $host == $addr){ $host = @gethostbyaddr($addr); } return $host; } //クッキー function set_cookie(){ global $cookie_name; $name =$_POST['name']; $mail =$_POST['mail']; $url =$_POST['url']; $color =$_POST['color']; $pass = $_POST['pass']; //http://削る $url = ereg_replace("http://","",$url); //クッキーに書き込む内容 $cook_val = array($name,$mail,$url,$color,$pass); //配列を文字列に $cookie_val =implode("<>", $cook_val); //時間 $data =time()+60*60*24*7; //クッキーセット setcookie($cookie_name,$cookie_val,$data); } //URLにじゃんぷ function back_html($url) { echo "<meta http-equiv=\"refresh\" content=\"0;url='{$url}'\">"; } //パスワード暗号化 function mod_pass($pass) { if($pass != ""){ $pass = md5($pass); } return $pass; } //================================================// //□削除処理 // // ◇$sid スレッドNo // ◇$id 記事No // ◇$match パスワードチェックor記事があるかないか // ◇$delflg スレッド削除かどうか // //================================================// function delete(){ global $logfile; $sid =$_POST['sid']; $id =$_POST['id']; $pass = md5($_POST['pass']); // echo"スレッドNo $sid 記事No $id"; // ログ読み込み $lines = file($logfile); //パスワードチェック $match=0; for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($id == 0){ //スレッド見つけた if($sid == $b_snum && $pass == $b_pass){ $match=1; break; } }else{ //記事見つけた if($sid == $b_snum && $id == $b_num && $pass == $b_pass){ $match=1; break; } } } if($match==0){ echo"パスワードが違います。"; $dp = new Display(); $dp->footer_html(); exit; } //ログオープン $fp = @fopen($logfile,"w"); //ロック開始 flock($fp, LOCK_EX); //削除する記事検索 $match=0; $delflg =0; for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($sid == $b_snum){ if($id == 0 || $delflg ==1){ //スレッド削除ならレス記事も削除 $delflg= 1; $match=1; continue; } elseif($id == $b_num){ //指定されたNoのみ削除 $match=1; continue; }else{ //親記事削除ないなら他の記事は残す fputs($fp,$lines[$i]); } }else{ fputs($fp,$lines[$i]); } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); if($match==0){ echo"該当記事がありません。"; }else{ echo"削除しました。"; } } } //================================================// //■表示部 // //◇menu_bar() メニューバー //◇thread_view() スレッド表示 //◇view() 記事一覧 //◇page_navi() ページナビ //◇point_get() 現在位置取得 //◇page_count() ページ総数計算 // //================================================// class Display{ var $snum; //スレッドNo var $num; //記事内No var $title; //スレッドタイトル var $time; //時間 var $name; //投稿者名前 var $mail; //投稿者メルアド var $url; //投稿者URL var $com; //コメント var $pass; //パスワード var $cnt; //参照数 var $res; //返信数 var $que; //質問 var $host; //リモートホスト //================================================// //□メニューバー //================================================// function menu_bar(){ global $bbstitle,$homeurl; echo <<<EOM <div align="center"> <p> <a href="$home_url">ホーム</a> | <a href="${_SERVER['PHP_SELF']}">記事一覧</a> | <a href="$PHP_SELF?mode=write-h">新規投稿</a> | <a href="$PHP_SELF?mode=serach-h">検索</a> | <a href="$PHP_SELF?mode=past">過去ログ</a> </p> </div> <div class="hr"></div> EOM; } //================================================// // スレッド表示 // // $sid スレッド番号 // $match 見つかったかどうかのフラグ // $resflg レスフラグ // $t_cnt 親記事数 // //================================================// function thread_view(){ global $logfile,$default_num,$reslimit; //受け取り $sid =$_GET['id']; //親記事数カウント $page_all = $this->page_count(); //初期化 $match=0; // ログ読み込み $lines = file($logfile); $resflg =0;//レスフラグ //表示 for($i=0; $i<sizeof($lines) && $match ==0; $i++){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($sid == $snum){ //スレッド見つかった if($num==0){ //親記事見つかった $cnt++; $match =1; break; }elseif($num =! 0 && $resflg==0){ //レスがあった場合 $resflg =1; } } } //書き込み準備 $line="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host\n"; //ログオープン $fp = @fopen($logfile,"w"); //ロック開始 flock($fp, LOCK_EX); for($i=0; $i<sizeof($lines); $i++){ list($b_snum,$b_num ,$b_title, $b_time, $b_name, $b_mail, $b_url, $b_com,$b_color, $b_pass, $b_res,$b_cnt, $b_que,$b_host) = split("<>", $lines[$i]); //該当記事かどうか if($sid == $b_snum && $b_num == 0){ $line = rtrim($line);//空白削除 fputs($fp,"$line\n"); }else{ $lines[$i] = rtrim($lines[$i]);//空白削除 fputs($fp,"$lines[$i]\n"); } } //ロックを解除する flock($fp, LOCK_UN); //ファイルクローズ fclose($fp); //見つからなかった場合 if($match ==0){ echo"該当記事が見つかりません。"; } //置き換え if($mail){ $name ="<a href=\"mailto:$mail\">$name</a>"; } if($url){ $urltag ="<a href=\"http://$url\">HP</a>"; }else{ $urltag =""; } //No1から $num++; //親記事表示 echo" <table border=\"1\" align=\"center\" class=\"thread-table\"> <tr> <td>□{$title} <br/> name:{$name} No.{$num} 日付:{$time} $urltag<br/> <br/> <font color=\"$color\">$com</font></td> </tr> </table> "; //レスがある場合 if($resflg ==1){ echo"<table border=\"1\" align=\"center\" class=\"thread-table\">"; $res_view = array(""); $rcnt=0; //レス表示 for($i=0; $i<sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($sid == $snum && $num !=0){ $res_view[$rcnt]="$snum<>$num<>$title<>$time<>$name<>$mail<>$url<>$com<>$color<>$pass<>$res<>$cnt<>$que<>$host"; $rcnt++; } } for($j= $rcnt-1; $j >= 0; $j--){ list($snum,$num, $title ,$time, $name, $mail, $url, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $res_view[$j]); if($mail){ $name ="<a href=\"mailto:$mail\">$name</a>"; } $num++; echo" <tr> <td>□No.{$num} {$name} 日付:{$time}<br/> <br/> <font color=\"$color\">$com</font></td> </tr> "; } echo"</table>"; } //書き込みフォーム //書き込み数がいっぱいならもう書き込めない if($rcnt < $reslimit-1){ //reswriteでレスモード $rg = new Regist(); $rg->write_html("reswrite",$sid); }else{ echo"もうこれ以上書き込めません。"; } //削除フォーム $this->delete_html($sid,"1001"); } //================================================// //□記事一覧 // // $pagenow 現在ページ // $page_all 総ページ数 // $pn ポインタ位置 // $t_cnt 親記事数 // //================================================// function view(){ global $logfile,$default_num; //テーブル開始 echo "<table border=\"1\" align=\"center\" class=\"view-table\"> <tr> <td class=\"table-que\"></td> <td class=\"table-no\">No.</td> <td class=\"table-title\">タイトル</td> <td class=\"table-name\">投稿者</td> <td class=\"table-count\">参照数</td> <td class=\"table-count\">返信数</td> <td class=\"table-update\">最終更新</td> </tr>"; // 現在のページ取得 if($_GET['page']){ //値を受け取っている場合 $pagenow = $_GET['page']; }else{ //1記事から $pagenow = 1; } //親記事数カウント $page_all = $this->page_count(); // ログ読み込み $lines = file($logfile); //現在位置定義 $t_cnt =0; //親記事数 $pn=0; //ポインタは先頭 //2ページ目以降 if($pagenow != 1){ //ポインタ位置代入 $pn = $this->point_get($pagenow); } $tugi=0; //表示 for($i=$pn; $t_cnt < $default_num && $i< sizeof($lines); $i++){ //代入 list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($tugi != $snum){ $tugi = $snum; $v_res =$res; $v_name=$name; } if($que==0){ $que ="質問"; }else{ $que ="解決"; } //親記事発見 if($num== 0){ echo "<tr> <td>$que</td> <td>$snum</td> <td><a href=\"$PHP_SELF?mode=th_view&id={$snum}\">$title</td> <td>$name</td> <td>$cnt</td> <td>$v_res</td> <td>$time<br/>by $v_name</td> </tr>"; //親記事でカウント $t_cnt++; } } echo "</table>"; //ページナビゲーション $this->page_navi($page_all,$pagenow); //削除フォーム $this->delete_html("","0"); } //================================================// //□ページナビゲーション // // // // $page_all ページ総数 // // $pagenow 現在のページ // // $num_remainder 残り件数(最後の残り端数用) // // // //================================================// function page_navi($page_all,$pagenow){ global $default_num; echo"<div align=\"center\">"; //端数があるかないか if($page_all < ($pagenow +1) * $default_num){ $num_remainder = (($pagenow+1)* $default_num) - $page_all; $num_remainder = $default_num - $num_remainder; }else{ $num_remainder = $default_num; } //総ページ数をカウント $page_all = ceil($page_all / $default_num); //前の件数 //1ページ目なら前の件数はリンクなし if($pagenow == 1) { $prev = "前件なし"; }else { //ページが前に戻るので-1 $prevpage = $pagenow - 1; $prev = "<a href=\"$PHP_SELF?page={$prevpage}\">前の{$default_num}件</a>"; } //次の件数 //最後のページ目なら次の件数はリンクなし if($pagenow == $page_all) { $next = "次件なし"; } else { //ページを先に進めるので+1 $nextpage = $pagenow + 1; $next = "<a href=\"$PHP_SELF?page={$nextpage}\">次の{$num_remainder}件</a>"; } echo "<p>$prev | $pagenow / $page_all ページ | $next</p></div>"; } //================================================// //□削除画面 // //================================================// function delete_html($sid,$id){ global $pass_max,$cookie_name; //クッキーがあるか調べる if (isset($_COOKIE["$cookie_name"])) { $cookie = $_COOKIE["$cookie_name"]; } list($c_name,$c_mail,$c_url,$c_col,$c_pass) = split("<>", $cookie); // echo"スレッドNo $sid 記事No $id"; //スレッド削除なら if($id == 0){ $idname = "id"; //送信name $idvalue = 0; //送信値 $delname = "sid"; //削除No }else{ $idname = "sid"; //送信name $idvalue = $sid; //送信値 $delname = "id"; //削除No } echo <<<EOM <div align="right"> <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="delete"> <input type=hidden name="$idname" value="$idvalue"> <table class="delete-table"> <tr> <td nowrap >削除No:<input type=text name="$delname" size=8></td> <td nowrap >パスワード:</b><input type=password name=pass size=8 maxlength="$pass_max" value ="$c_pass"></td> <td nowrap ><input type=submit value="削除する"></td> </tr> </table> </form> </div> EOM; } //================================================// // ヘッダー //================================================// function header_html(){ global $stylesheet,$bbstitle,$charset,$jcode; echo <<<HTML <html> <head> <meta http-equiv="Content-Language" content="ja"> <meta http-equiv="Content-Type" content="text/html; charset=$charset[$jcode]"> <title>$bbstitle</title> <link rel="stylesheet" type="text/css" href="$stylesheet"> </head> <body> <h1>$bbstitle</h1> HTML; } //================================================// // フッター //================================================// function footer_html(){ echo <<<HTML <div class="hr"></div> </body></html> HTML; } //================================================// //□現在位置取得 // // $pagenow 現在ページ // $end 終了位置 // $t_cnt 親記事数 // //================================================// function point_get($pagenow){ global $logfile,$default_num; // ログ読み込み $lines = file($logfile); //終了位置 $end =($pagenow - 1)*$default_num; $t_cnt =0; //親記事数 for($i= 0; $t_cnt<$end && $i< sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); //親記事発見 if($num== 0){ //親記事数でカウント $t_cnt++; } } //現在位置返す return $i; } //================================================// //□記事数計算 // // $t_cnt 親記事数 // //================================================// function page_count(){ global $logfile; // ログ読み込み $lines = file($logfile); $t_cnt = 0; //親記事数カウント for($i=0; $i<sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); if($num==0){ $t_cnt++; } } //ない場合は1代入 if($t_cnt == 0){ $t_cnt =1; } return $t_cnt; } } class Search{ function serach_html(){ global $bbstitle,$homeurl; echo <<<EOM 検索 <form action="$PHP_SELF" method="post"> <input type=hidden name="mode" value="serach"> <table class="delete-table"> <tr> <td>検索文字:<input type=text name=serach size=20></td> </tr><tr> <td>and:<input type=radio name=flg value="and" checked> or:<input type=radio name=flg value="or"></td> </tr><tr> <td ><input type=submit value="検索"></td> </tr> </table> </form> EOM; } //検索 function serach(){ global $bbstitle,$homeurl,$logfile; $sword = $_POST['serach']; $flg = $_POST['flg']; //マッチしたNoを配列で取得 $hits = $this->serach_main($sword,$flg); //配列であれば中身あり if(is_array($hits)){ //1行目は空白なので $hit =count($hits) -1; echo "<b>{$sword}</b>の{$flg}検索結果{$hit}件"; }else{ echo"みつかりませんでした。"; exit; } // ログ読み込み $lines = file($logfile); //みつかったスレッド一覧表示 echo "<table border=\"1\" align=\"center\" class=\"view-table\"> <tr> <td class=\"table-que\"></td> <td class=\"table-no\">No.</td> <td class=\"table-title\">タイトル</td> <td class=\"table-name\">投稿者</td> <td class=\"table-count\">参照数</td> <td class=\"table-count\">返信数</td> <td class=\"table-update\">最終更新</td> </tr>"; for($i=0; $i<sizeof($lines); $i++){ list($snum,$num, $title ,$time, $name, $mail, $urll, $com,$color, $pass, $res, $cnt,$que,$host) = split("<>", $lines[$i]); //マッチした記事数だけ foreach($hits as $hit){ if($hit ==$snum){ //Noが一致 if($tugi != $snum){ //スレッドNo切り替わったとき $tugi = $snum; $v_res =$res; $v_name=$name; } if($que==0){ $que ="質問"; }else{ $que ="解決"; } echo" <tr> <td>$que</td> <td>$snum</td> <td><a href=\"$PHP_SELF?mode=th_view&id={$snum}\">$title</td> <td>$name</td> <td>$cnt</td> <td>$v_res</td> <td>$time<br/>by $v_name</td> </tr>"; } } } echo "</table>"; } //照合 function serach_main($sword,$flg){ global $logfile; // ログ読み込み $lines = file($logfile); if(!(isset($sword)) || $sword ==""){ //なにも入力されていない。 return FALSE; }else{ if(get_magic_quotes_gpc()){ $sword = stripslashes($sword); } //配列に切り分け $keys = preg_split("/( | )+/", trim($sword)); $result=array(""); $match =0; $b_snum=0; //検索 foreach($lines as $line){ for($i=0;$i< count($keys); $i++){ if($keys[$i]==""){ //なにもない行はスキップ continue; } if($flg=="or"){ //or検索 if(stristr($line, $keys[$i])){ //みつかったらスレッドNo取得 $match =1; list($snum,)= split("<>", $line); } }else{ //and検索 if(stristr($line, $keys[$i])){ //みつかったらスレッドNo取得 $match =1; list($snum,)= split("<>", $line); }else{ //1個でも違えばそこで終わり $match =0; break; } } //マッチした場合は配列に格納 if($match == 1 &&$b_snum !=$snum){ $b_snum = $snum; array_push($result,$snum); } } } return $result; } } } class Pastlog{ function past_html(){ global $bbstitle,$homeurl; echo <<<EOM 過去ログ EOM; } } ?>

表示オプション

横に並べて表示:
変化行の前後のみ表示:
目安箱バナー