5000 //----- 11/10/2002:ファイル属性666にする処理追加 //----- 11/01/2002:構文チェック判定をeregに変更 //----- 10/31/2002:pocketmes.incをベースに作成 //簡易メッセージシステム //ポケットメッセージより汎用性を持たせた. // //テンプレートで使用できる変数は以下のもの //"%_ip_%" :IPアドレス //"%_time_%" :時間 //"%pal?%" :投稿内容("?"には1から始まる記録した順番が入る) //"#pal?if#" :次行はデータがあったときのみ表示 //"#pal?else#" :次行はデータがなかったときのみ表示 /* usage $pmes2 = new pocketmes2_base(Datafilename,ViewMaxNum,Exchangefilename); $pmes2 -> write(Data_array); $pmes2 -> view(); properties datetype : 時刻表示形式を指定(既定値:"Y/m/d H:i:s") errormessage : エラー時のメッセージ保持 */ class pocketmes2_base { var $datafilename; var $maxcount; var $overcount; var $overfilename; var $lockfilename; var $exchangefilename; var $exchangedata; var $datetype; var $flagautolink = false; var $errormessage; //----- constructor function pocketmes2_base( $_datafilename = "./data/pmes2.dat",$_maxcount = 10,$_exchangefilename = "") { $this -> datafilename = $_datafilename; $this -> maxcount = $_maxcount -1; $this -> overcount = $_maxcount +9; $this -> overfilename = $_datafilename.".over"; $this -> lockfilename = $_datafilename.".pmes2.lock"; $this -> exchangefilename = $_exchangefilename; $this -> exchangedata = ""; $this -> datetype = "Y/m/d H:i:s"; $this -> errormessage = ""; } //----- 標準出力 function output($_printstr = ""){ if($_printstr != "") print $_printstr; } //----- 禁則処理 function decode($_pal){ foreach($_pal as $_val){ $_val = str_replace("%%2C",",",$_val); $_val = str_replace("\\","",$_val); $_val = str_replace("%%5C","\\",$_val); $ret_data[] = $_val; } return $ret_data; } function encode($_pal){ foreach($_pal as $_val){ $_val = str_replace("\n","
",$_val); $_val = str_replace("\r","",$_val); $_val = str_replace(",","%%2C",$_val); $_val = str_replace("\\\\","%%5C",$_val); $ret_data[] = $_val; } return $ret_data; } //----- テンプレートファイルの読み込み function readtemplate(){ if (file_exists($this -> exchangefilename)) { $_fdata = file($this -> exchangefilename); unset($this -> exchangedata); foreach($_fdata as $_val){ $_val = str_replace("\n","",$_val); $_val = str_replace("\r","",$_val); $this -> exchangedata[] = $_val; } unset($_fdata); } else { $this -> errormessage = "テンプレートファイルがありません."; $this -> exchangefilename = ""; return false; } return true; } //----- 投稿内容の表示 function view(){ $this -> errormessage = ""; if (file_exists($this -> datafilename)) { $fp = fopen($this -> datafilename,"r"); } else { $fp = fopen($this -> datafilename,"w+"); } if($this -> exchangefilename != "") $this -> readtemplate(); $i = 0; while ($data = fgetcsv($fp,5000)){ $_cnt = count($data); unset($_str); for($j=2;$j<$_cnt;$j++) $_str[] = $data[$j]; $this -> template($data[0],gmdate($this -> datetype,$data[1]+9*60*60),$_str); ++$i; if ($i > $this -> maxcount) break; } fclose($fp); } //----- 投稿内容の保存 function write($_pal) { if($_pal[0] != "") { //----- ファイルのロック $lockfp = fopen($this -> lockfilename,"w"); flock($lockfp, LOCK_EX); //----- 禁則処理 $_pal = $this -> encode($_pal); //----- 投稿内容のデータ化 $_wstr = getenv("REMOTE_ADDR").",".time(); foreach($_pal as $_val) $_wstr = $_wstr.",".$_val; $i = 0; $data[$i] = $_wstr."\n"; $_eof = 0; //----- 既存内容の読込 if(!file_exists($this->datafilename)){ } else { $fp = fopen($this -> datafilename,"r"); while ($sss = fgets($fp,5000)){ ++$i; $data[$i] = $sss; if ($i >= $this -> overcount) { $_eof = 1; break; } } //----- オーバーフロー部分の別ファイル保存 if ($_eof == 1) { $fpo = fopen($this -> overfilename, "a"); while ($sss = fgets($fp,5000)){ fputs($fpo,$sss); } fclose($fpo); @chmod($this->overfilename,0666); } fclose($fp); } //----- 最新内容の保存 $fp = fopen($this -> datafilename, "w"); for ($c=0;$c<=$i;$c++) { fputs($fp,$data[$c]); } fclose($fp); @chmod($this->datafilename,0666); //----- ロックの解除 flock($lockfp, LOCK_UN); fclose($lockfp); unlink($this -> lockfilename); } } //----- 投稿内容表示の為のテンプレート function template($_ip,$_time,$_pal){ //----- 禁則処理 $_pal = $this -> decode($_pal); if($this -> exchangedata == ""){ //----- データのみ表示 $this -> output("DATA : $_time"); foreach($_pal as $_val) $this -> output(": ".$_val); $this -> output("
\n"); } else { //----- テンプレートファイルによる表示 $_wdat = $this -> exchangedata; $_cdat = count($_wdat); for($i=0;$i<$_cdat;$i++){ $_wdat[$i] = str_replace("%_ip_%","$_ip",$_wdat[$i]); $_wdat[$i] = str_replace("%_time_%","$_time",$_wdat[$i]); } $_palnum = 1; foreach($_pal as $_val) { $_palif = "#pal".$_palnum."if#"; $_palelse = "#pal".$_palnum."else#"; $_palx = "%pal".$_palnum."%"; if($_val == "") { $_valflag = false;} else { //----- オートリンク処理 if(is_array($this->flagautolink)){ if(in_array($_palnum,$this->flagautolink)){ $_val = ereg_replace('[[:alpha:]]+://[^<>[:space:]]+[[:alnum:]/[:alnum:]]',"\\0",$_val); } } $_valflag = true; } $_chkflag = true; for($i=0;$i<$_cdat;$i++){ //----- 構文チェック if($_chkflag){ if(ereg($_palif,$_wdat[$i])){ unset($_wdat[$i]); if(!$_valflag) $_chkflag = false; } elseif(ereg($_palelse,$_wdat[$i])){ unset($_wdat[$i]); if($_valflag) $_chkflag = false; } else { $_wdat[$i] = str_replace($_palx,$_val,$_wdat[$i]); } } else { unset($_wdat[$i]); $_chkflag = true; } } ++$_palnum; } foreach( $_wdat as $_val) $this -> output("$_val"); $this -> output("\n"); unset($_wdat); } } }; ?>