<?php
//=============================================================
// plywood: Version 1.1.9
// Copyright (C) 2000-2001 けんす
// http://www.kensu.com/
// フリーソフト・再配布/改造/流用可能・許可不要
//=============================================================
// $Id: plywood.php,v 1.1.9 2001/03/23 15:30:46 kensu Exp $

// - plywoodの特徴とか
//     o 全ての変数を初期化しているのでエラー通知が厳しくても大丈夫
//     o ログの読み書きに配列を使わず1行ずつ読むのでメモリを食わない
//     o 管理モードによる削除
//     o 名前とEmailを書かないで発言した場合、クッキーを送信しない & 削除する
//     o 二度書き防止
//     o 本文の行頭が > | : のどれかだったら、色が変わる
//     o 本文にURLが含まれていたらリンクする
//     o ソース表示モード
// - TODO
//     o 出力制御関数を使ってContent-Lengthを出力させる。
//     o gzip圧縮送信。
//     o iconv関数で文字コード変換。
//     o flock関数のオペレーションを定数にする。

define('MAX_MESSAGES'500);
define('MESSAGES_PER_PAGE'30);

define('ADMIN_CRYPTED_PASS''fa23758b72ff6c06f35584e3cc2a2268');

define('DOCUMENT_TITLE''PHPを使った掲示板');
define('SCRIPT_TITLE''plywood');

define('LOG_DIR'getenv('DOCUMENT_ROOT'). '/log/');

define('LOG_FILE'LOG_DIRSCRIPT_TITLE'.log');
define('TMP_FILE'LOG_DIRSCRIPT_TITLE'.tmp');
define('LOCK_FILE'LOG_DIRSCRIPT_TITLE'.lock');

define('NL'"\n");


//
// ヘッダー出力。
//
function put_header$title DOCUMENT_TITLE ) {
    echo 
'<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'NL;
    echo 
'<html>'NL;
    echo 
'<head>'NL;
    echo 
'<!--'"\xFD\xFE"'-->'NL;
    echo 
'<title>'$title'</title>'NL;
    echo 
'</head>'NL;
    echo 
'<body>'NL;
}

//
// フッター出力。
//
function put_footer() {
    echo 
'</body>'NL;
    echo 
'</html>'NL;
}

//
// エラー。終了。
//
function error$reason ) {
    
put_header();
    echo 
'<p>'NL;
    echo 
$reasonNL;
    echo 
'</p>'NL;
    
put_footer();
    exit;
}

//
// デフォルトの動作
//
function put_default() {
    global 
$name$email$msg;

    list(
$c_name$c_email) = isset($GLOBALS['HTTP_COOKIE_VARS'][strtoupper(SCRIPT_TITLE)]) ?
        
explode('<>'$GLOBALS['HTTP_COOKIE_VARS'][strtoupper(SCRIPT_TITLE)]) :
        
'';

    list(
$c_name$c_email) = ! empty($name) || ! empty($email) ?
        array(
$name$email) :
        array(
$c_name$c_email);

    
put_header();
    echo 
'<h2>'DOCUMENT_TITLE'</h2>'NL;
    echo 
'<a href="./">[トップページへ戻る]</a>'NL;
    echo 
'<a href="'getenv('SCRIPT_NAME'), '?s">[このスクリプトのそーす]</a>'NL;
    echo 
'<hr>'NL;
    echo 
'<form method="POST" action="'getenv('SCRIPT_NAME'), '">'NL;
    echo 
'<input type="hidden" name="action" value="add_new_message">'NL;
    echo 
'<p>'NL;
    echo 
'名前'NL;
    echo 
'<input type="text" size="20" name="name" value="'$c_name'"><br>'NL;
    echo 
'Email'NL;
    echo 
'<input type="text" size="30" name="email" value="'$c_email'">'NL;
    echo 
'<input type="submit" value="送信 / 再読み込み">'NL;
    echo 
'<input type="reset" value="リセット"><br>'NL;
    echo 
'<br>'NL;
    echo 
'本文'NL;
    echo 
'<em>(記入通りに表示するので適当に改行を入れてください。)</em><br>'NL;
    echo 
'<textarea name="msg" cols="80" rows="5"></textarea>'NL;
    echo 
'</p>'NL;
    echo 
'</form>'NL;
    echo 
'<hr>'NL;

    if ( ! isset(
$GLOBALS['start']) )
        
$GLOBALS['start'] = 1;

    
$count 1;
    
$next_page_exist 0;

    
$in fopen(LOG_FILE'r');

    while ( ! 
feof($in) ) {
        
$line fgets($in1024 100);
        
$line trim($line);

        if ( empty(
$line) )
            break;

        if ( 
$count >= $GLOBALS['start'] ) {
            list(
$num$time$name$email$msg$host) = explode('<>'$line);

            
// 2000/01/01 (土) 00:00:00
            
$week = array('日''月''火''水''木''金''土');
            
$caln getdate($time);
            
$date sprintf('%04d/%02d/%02d (%s) %02d:%02d:%02d',
                    
$caln['year'], $caln['mon'], $caln['mday'], $week[$caln['wday']], $caln['hours'], $caln['minutes'], $caln['seconds']);

            
$msg str_replace('<br>'NL$msg);
            
$msg ereg_replace('(s?https?|ftp)://[-_.!~*\'()a-zA-Z0-9;/?:@&=+$,%#]+''<a href="\\0">\\0</a>'$msg);
            
$msg preg_replace('/(^|\n)((&gt;|\||:)[^\n]*)/''\\1<font color="#7777DD">\\2</font>'$msg);
            
$msg str_replace(NL'<br>'NL$msg);

            if ( empty(
$name) )
                
$name '名無しさん';

            if ( ! empty(
$email) )
                
$name '<a href="mailto:'$email'">'$name'</a>';

            echo 
'<font color="#666666">No. '$num' <font color="#FF0000">'$name'</font> '$date'</font><br>'NL;
            echo 
$msg'<br>'NL;
            echo 
'<hr>'NL;

            if ( 
$count == $GLOBALS['start'] + MESSAGES_PER_PAGE ) {
                
$next_page_exist 1;
                break;
            }
        }

        
$count ++;
    }

    
fclose($in);

    echo 
'<p>'NL;

    if ( 
$GLOBALS['start'] - MESSAGES_PER_PAGE >= )
        echo 
'<a href="'getenv('SCRIPT_NAME'), '?start='$GLOBALS['start'] - MESSAGES_PER_PAGE'">前</a>&lt;&lt;'NL;

    echo 
'以上、新着順 '$GLOBALS['start'], ' 番目から '$count 1' 番目の発言です。'NL;

    if ( 
$next_page_exist == )
        echo 
'&gt;&gt;<a href="'getenv('SCRIPT_NAME'), '?start='$GLOBALS['start'] + MESSAGES_PER_PAGE'">次</a>'NL;

    echo 
'</p>'NL;
    
put_footer();
}

//
// 新規発言を追加。
//
function add_new_message() {
    global 
$name$email$msg;

    if ( 
getenv('CONTENT_LENGTH') > 1024 50 )
        
error('データの量が多すぎます。内容を削ってください。');

    
$name trim($name);    // 先頭、末尾の空白を削除
    
$email trim($email);
    
$msg trim($msg);
    
$name htmlspecialchars($name);    // & " < > を置換
    
$email htmlspecialchars($email);
    
$msg htmlspecialchars($msg);
    
$name ereg_replace("[\x0D\x0A]"''$name);    // 改行を削除
    
$email ereg_replace("[\x0D\x0A]"''$email);
    
$msg ereg_replace("\x0D\x0A|[\x0D\x0A]"'<br>'$msg);    // 改行を <br> に置換

    
$lock fopen(LOCK_FILE'w') or error('ロックファイルを作成できませんでした。');
    
flock($lock2) or error('ロックできませんでした。');
    
$in fopen(LOG_FILE'r');
    
$out fopen(TMP_FILE'w');
    
$line fgets($in1024 100);
    list(
$_num$_time$_name$_email$_msg$_host) = explode('<>'$line);

    if ( 
$name == $_name && $msg == $_msg ) {
        
unlink(TMP_FILE);
        
unlink(LOCK_FILE);
        
error('二度書きはダメよ。');
    }

    
$num $_num 1;
    
$host gethostbyaddr(getenv('REMOTE_ADDR'));
    
fwrite($outimplode('<>', array($numtime(), $name$email$msg$host)). NL$line);

    for ( 
$i 0; ! feof($in); $i ++ ) {
        if ( 
$i MAX_MESSAGES )
            break;

        
$line fgets($in1024 100);
        
fwrite($out$line);
    }

    
fclose($out);
    
fclose($in);

    
chmod(TMP_FILE0666);
    
rename(TMP_FILELOG_FILE);
    
fclose($lock);
    
unlink(LOCK_FILE);

    ! empty(
$name) || ! empty($email) ?
        
setcookie(strtoupper(SCRIPT_TITLE), implode('<>', array($name$email)), time() + 60 60 24 60'/''.kensu.com'0) :
        
setcookie(strtoupper(SCRIPT_TITLE), ''time() + 60 60'/''.kensu.com'0);
}

//
// 管理モード。
//
function admin() {
    if ( isset(
$GLOBALS['admin_pass']) && md5($GLOBALS['admin_pass']) != ADMIN_CRYPTED_PASS )
        
error('パスワードをよーく確認してね。');

    
put_header(DOCUMENT_TITLE' / 管理モード');

    if ( ! isset(
$GLOBALS['admin_pass']) ) {
        echo 
'<form method="POST" action="'getenv('SCRIPT_NAME'), '">'NL;
        echo 
'<input type="hidden" name="action" value="admin">'NL;
        echo 
'<p>'NL;
        echo 
'<input type="password" size="10" name="admin_pass" value="">'NL;
        echo 
'<input type="submit" value="管理モード">'NL;
        echo 
'</p>'NL;
        echo 
'</form>'NL;
    } else {
        if ( isset(
$GLOBALS['del']) ) {
            
$lock fopen(LOCK_FILE'w') or error('ロックファイルを作成できませんでした。');
            
flock($lock2) or error('ロックできませんでした。');
            
$in fopen(LOG_FILE'r');
            
$out fopen(TMP_FILE'w');

            while ( ! 
feof($in) ) {
                
$line fgets($in1024 100);

                if ( empty(
$line) )
                    break;

                list(
$num$dummy) = explode('<>'$line);

                
$flag 0;
                for ( 
$i 0$i count($GLOBALS['del']); $i ++ ) {
                    if ( 
$num == $GLOBALS['del'][$i] ) {
                        
$flag 1;
                        break;
                    }
                }

                if ( empty(
$flag) )
                    
fwrite($out$line);
            }

            
fclose($out);
            
fclose($in);

            
chmod(TMP_FILE0666);
            
rename(TMP_FILELOG_FILE);
            
fclose($lock);
            
unlink(LOCK_FILE);
        }

        echo 
'<h2>'DOCUMENT_TITLE' / 管理モード</h2>'NL;
        echo 
'<a href="'getenv('SCRIPT_NAME'), '">[デフォルト画面に戻る]</a>'NL;
        echo 
'<hr>'NL;
        echo 
'<h2>発言の削除</h2>'NL;
        echo 
'<p>'NL;
        echo 
'削除したい発言のチェックボックスにチェックを入れ、実行ボタンを押してください。'NL;
        echo 
'</p>'NL;
        echo 
'<form method="POST" action="'getenv('SCRIPT_NAME'), '">'NL;
        echo 
'<p>'NL;
        echo 
'<input type="hidden" name="action" value="admin">'NL;
        echo 
'<input type="hidden" name="admin_pass" value="'$GLOBALS['admin_pass'], '">'NL;
        echo 
'<input type="submit" value="  実行  ">'NL;
        echo 
'<input type="reset" value="リセット">'NL;
        echo 
'</p>'NL;
        echo 
'<table width="100%" border="0">'NL;
        echo 
'<tr>'NL;
        echo 
'<th></th>'NL;
        echo 
'<th></th>'NL;
        echo 
'<th><small>日付</small></th>'NL;
        echo 
'<th><small>名前</small></th>'NL;
        echo 
'<th><small>メッセージ</small></th>'NL;
        echo 
'<th><small>ホスト名</small></th>'NL;
        echo 
'</tr>'NL;
        echo 
'<tr>'NL;
        echo 
'<td colspan="6"><hr size="1"></td>'NL;
        echo 
'</tr>'NL;

        
$in fopen(LOG_FILE'r');

        while ( ! 
feof($in) ) {
            
$line fgetss($in1024 100'<>');
            
$line trim($line);

            if ( empty(
$line) )
                break;

            list(
$num$time$name$email$msg$host) = explode('<>'$line);

            
// 2000/01/01 (土) 00:00:00
            
$week = array('日''月''火''水''木''金''土');
            
$caln getdate($time);
            
$date sprintf('%04d/%02d/%02d (%s) %02d:%02d:%02d',
                    
$caln['year'], $caln['mon'], $caln['mday'], $week[$caln['wday']], $caln['hours'], $caln['minutes'], $caln['seconds']);

            if ( 
strlen($name) > 20 )
                
$name substr($name020). '...';

            if ( 
strlen($msg) > 50 )
                
$msg substr($msg050). '...';

            if ( empty(
$name) )
                
$name '名無しさん';

            if ( ! empty(
$email) )
                
$name '<a href="mailto:'$email'">'$name'</a>';

            echo 
'<tr>'NL;
            echo 
'<td><small>'$num'</small></td>'NL;
            echo 
'<td><input type="checkbox" name="del[]" value="'$num'"></td>'NL;
            echo 
'<td nowrap><small>'$date'</small></td>'NL;
            echo 
'<td><small>'$name'</small></td>'NL;
            echo 
'<td><small>'$msg'</small></td>'NL;
            echo 
'<td><small>'$host'</small></td>'NL;
            echo 
'</tr>'NL;
        }

        
fclose($in);

        echo 
'<tr>'NL;
        echo 
'<td colspan="6"><hr size="1"></td>'NL;
        echo 
'</tr>'NL;
        echo 
'<tr>'NL;
        echo 
'<th></th>'NL;
        echo 
'<th></th>'NL;
        echo 
'<th><small>日付</small></th>'NL;
        echo 
'<th><small>名前</small></th>'NL;
        echo 
'<th><small>メッセージ</small></th>'NL;
        echo 
'<th><small>ホスト名</small></th>'NL;
        echo 
'</tr>'NL;
        echo 
'</table>'NL;
        echo 
'<p>'NL;
        echo 
'<input type="submit" value="  実行  ">'NL;
        echo 
'<input type="reset" value="リセット">'NL;
        echo 
'</p>'NL;
        echo 
'</form>'NL;
    }

    
put_footer();
}

//
// main:
//
if ( getenv('QUERY_STRING') == 's' ) {
    
highlight_file(getenv('SCRIPT_FILENAME'));
    exit;
}

if ( 
getenv('QUERY_STRING') == 'sp' ) {
    echo 
'<code>'NL;
    echo 
'<pre>'NL;
    
$fp fopen(getenv('SCRIPT_FILENAME'), 'r');

    while ( ! 
feof($fp) ) {
        
$buffer fread($fp1024);
        
$buffer htmlspecialchars($buffer);
        echo 
$buffer;
        
flush();
    }

    
fclose($fp);
    echo 
'</pre>'NL;
    echo 
'</code>'NL;
    exit;
}

if ( ! isset(
$action) )
    
$action '';

if ( 
$action == 'admin' ) {
    
admin();
    exit;
}

if ( 
$action == 'add_new_message' && ! empty($msg) )
    
add_new_message();

put_default();
exit;
?>

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル