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);
}
}
};
?>