sidewalkcafe blog

日々是好日

POTI-boardのDB化1

POTI-boardのログファイルをデータベースに書き込み

こんな幹事のテーブルをつくる

id:コメントid
no:記事no(あとでidと結合削除)
date:日時
name:投稿者名
mail:メールアドレス(or sage)
subject:題名
comment:コメント
url:URL
host:接続ホスト名(ipアドレス)
exid:ユーザーID
pwd:パスワード
ext:画像ファイルの拡張子
img_w:画像幅
img_h:画像高
filename:画像ファイル名
thumbnail:サムネファイル名
cdt:チェックデジット(必要?)
time:お絵描き時間
fontcolor:文字色
tree:親ツリー番号(親はid==treeになる)
parent:親表示順(子はparent=0になる)
invz:記事非表示(invz=1のコメントは表示しない)

img.logの内容に、tree,parent,invzを追加する
tree,parentは、tree.logの内容を1つにまとめるためのもの
invzは削除した記事を表示させないためのもの
(補足)通常、読者が消したコメントを保存しておくことは色々と危うい
ただ、荒らしを通報する場合にipやコメント内容は記録してた方が良いので、管理人削除の場合invz=1として一般からは見えない様にする


ログ呼び出し、テーブル作成、挿入

<?php
//ログファイルの設定
//掲示板のconfigから取って来たのでまわりくどいw
define('LOGFILE', './log/img.log');
define('TREEFILE', './log/tree.log');

//ちゃんと動いてるか確認するための表示
echo("データ更新中");

//データを入れておくための変数
$arrayDATA = array();

//log読み込み
$lines = file(LOGFILE, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);
$treelines = file(TREEFILE, FILE_SKIP_EMPTY_LINES | FILE_IGNORE_NEW_LINES);

//logを各行毎に読み込み
foreach ($lines as $line) {
	//','で分割、それぞれ変数に格納
	list($no, $now, $name, $email, $sub, $com, $url,
		$host, $pwd, $ext, $w, $h, $time, $chk, $ptime, $fcolor)
			= explode(',', $line);
	//$nowにidと日付がくっついて入ってるので分割
	$exnow =  explode(" ID:", $now);
	//ファイル名とサムネイル名作成
	$exfilename = $ext ? $time.$ext : "";
	$thumbnail = $ext ? $time."s.jpg" : "";

	//親子判定
	$ti = 1;
	$mst = 0;
	foreach ($treelines as $treeline){
		$treelist = explode(",", $treeline);
		if(in_array($no, $treelist)){
			$extree = $treelist[0];
			if($extree == $no){
				$mst = $ti ;
			}
			break;
		}//if treelist extree
		$ti++;
	}//foreach treelines
					
	//各項目を配列に格納
	array_push($arrayDATA, array(
		'no' => $no,			// 記事No
		'date' => $exnow[0],	// 投稿日時
		'name' => $name,		// 投稿者名
		'mail' => $email,		// メールアドレス
		'subject' => $sub,		// 記事タイトル
		'comment' => $com,		// コメント内容
		'url' => $url,			// 投稿者URL
		'host' => $host,		// 投稿者ホスト
		'exid' => $exnow[1],	// 投稿者ID
		'pass' => $pwd,			// パスワード
		'ext' => $ext,			// 投稿画像の拡張子
		'img_w' => $w,			// 投稿画像サイズ
		'img_h' => $h,			// 投稿画像サイズ
		'filename' => $exfilename,	// 画像ファイル名
		'thumbnail' => $thumbnail,	// サムネイル
		'check' => $chk,			// 投稿画像のチェックデジット
		'time' => $ptime,	// お絵かきにかかった時間
		'fontcolor' => $fcolor,	// 投稿者の文字色
		'tree' => $extree, //親ツリー
		'parent' => $mst, //親ツリー順番
	));

} //foreach lines

//配列の順序を逆順にする
$arrayDATA = array_reverse($arrayDATA);

//データベース宣言
try {
    $db = new PDO('sqlite:log/boardlog.db' );

    // テーブル作成
    $db->exec("CREATE TABLE IF NOT EXISTS oekakibbs(id integer primary key,no integer,date text,name text,mail text,subject text,comment text,url text,host text,exid text,pwd text,ext text,img_w text,img_h text,filename text,thumbnail text,cdt text,time text,fontcolor text,tree integer,parent integer,invz integer)");


    // 挿入(プリペアドステートメント)
    $s = $db->prepare("INSERT INTO oekakibbs(no ,date ,name ,mail ,subject ,comment ,url ,host ,exid ,pwd ,ext ,img_w ,img_h ,filename ,thumbnail ,cdt ,time ,fontcolor ,tree ,parent ,invz)
	 VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
    
      $s->bindParam(1, $db1);
      $s->bindParam(2, $db2);
      $s->bindParam(3, $db3);
      $s->bindParam(4, $db4);
      $s->bindParam(5, $db5);
      $s->bindParam(6, $db6);
      $s->bindParam(7, $db7);
      $s->bindParam(8, $db8);
      $s->bindParam(9, $db9);
      $s->bindParam(10, $db10);
      $s->bindParam(11, $db11);
      $s->bindParam(12, $db12);
      $s->bindParam(13, $db13);
      $s->bindParam(14, $db14);
      $s->bindParam(15, $db15);
      $s->bindParam(16, $db16);
      $s->bindParam(17, $db17);
      $s->bindParam(18, $db18);
      $s->bindParam(19, $db19);
      $s->bindParam(20, $db20);
      $s->bindParam(21, $db21);

//削除があると記事NOが飛ぶので空白追加ルーチンを入れる
$i =1;
foreach ($arrayDATA as $data){
$db1 = $data['no'];
//idとnoが合わなければ空白行を追加
if($db1 > $i ){ 
	$db2 = $db4 = $db7 = $db9 = $db11 = $db12 = $db13 = $db14 = $db15 = $db16 = $db17 = $db18 = '';
	$db3 = $db5 = $db6 = $db8 = $db10 = 'delete';
	$db19 = $db20 = 0;
	$db21 =1;
	for ($j = $i; $j <= $data['no']; $j++) {
		if($data['no'] == $i ){break;}
		$db1 = $i;
		$s->execute();
		$i++;
	}
}
$invz = 0;


$db1 = $data['no'];
$db2 = $data['date'];
$db3 = $data['name'];
$db4 = $data['mail'];
$db5 = $data['subject'];
$db6 = $data['comment'];
$db7 = $data['url'];
$db8 = $data['host'];
$db9 = $data['exid'];
$db10 = $data['pass'];
$db11 = $data['ext'];
$db12 = $data['img_w'];
$db13 = $data['img_h'];
$db14 = $data['filename'];
$db15 = $data['thumbnail'];
$db16 = $data['check'];
$db17 = $data['time'];
$db18 = $data['fontcolor'];
$db19 = $data['tree'];
$db20 = $data['parent'];
$db21 = $invz;

//dbに追加
      $s->execute()
        or die("<p>書き込みに失敗しました</p>");//失敗処理
	$i ++;
}//追加処理おわり

//追加したデータを表示
//sql呼び出し
$sql = "select * from oekakibbs order by id desc";

//テーブル作成
echo "<table border=\"1\">\n";
echo "<tr><th>DBid</th><th>番号</th><th>日時</th><th>Mail</th><th>題名</th><th>コメント</th><th>URL</th><th>host</th><th>USERID</th><th>Pass</th><th>拡張子</th><th>画像幅</th><th>画像高</th><th>ファイル名</th><th>サムネ</th><th>check</th><th>時間</th><th>カラー</th><th>ツリー</th><th>記事順</th><th>削除</th></tr>\n";

//各コメントデータ表示
foreach ($db->query($sql) as $a) {
      echo "<tr><td>", $a['id'], "</td><td>", $a['no'], "</td><td>",$a['date'], "</td><td>",$a['mail'], "</td><td>",$a['subject'], "</td><td>", mb_strimwidth($a['comment'], 0, 20, "…"), "</td><td>",mb_strimwidth($a['url'], 0, 20, "…"), "</td><td>",mb_strimwidth($a['host'], 0, 20, "…"), "</td><td>",$a['exid'], "</td><td>",$a['pwd'], "</td><td>",$a['ext'], "</td><td>",$a['img_w'], "</td><td>",$a['img_h'], "</td><td>",$a['filename'], "</td><td>",$a['thumbnail'], "</td><td>",$a['cdt'], "</td><td>",$a['time'], "</td><td>",$a['fontcolor'], "</td><td>", htmlspecialchars($a['tree']), "</td><td>",$a['parent'], "</td><td>",$a['invz'], "</td></tr>\n";
    }
//テーブルおわり
echo "</table>\n";

//db切断
   $db = null;
  } catch (PDOException $e) {
    echo "<p>エラー:", $e->getMessage(), "</p>";
  }

echo("作業おわり");
exit;

ログデータに削除記事があった場合、primary idと記事NOが合わなくなるので一応並列記憶
回避ルーチンを入れてるので確認できたらnoの方は消す


なんかプリペアドステートメントが美しくないw
適当すぎるw