Linux自宅サーバー構築記。PHP4掲示板作成。

WEBプログラミングの世界へようこそ !!
HP制作の入門&手引き


   メニュー
フォーム POST取得
PostgreSQL接続 CSVレコード追加
CSVレコード出力 CSVレコード削除
ページング クッキー
セッション リロード対策

   リンク
PHP入門&TIPS
   phpspot

PHP総合
   PHPの小部屋

質問掲示板
   phppro

用語集
   phppro

   メニュー
apache1.3.xのインストール apache1.3.xの設定
apache1.3.xバーチャルホスト PostgreSQL7.4.xのインストール
PostgreSQL7.4.xの設定 PHP4.3.xのインストール
PHP4.3.xの設定ファイル apache1.3.x, PostgreSQL7.4.x, PHP4稼動確認
Samba telnet
proftpd ntpd
MySQL3.23.xのインストール BIND
postfix  
 TOP  <<PHPホーム  <<PHP4 - CSVファイル掲示板

PHP4


フローチャート

■掲示板の基本の流れ

○投稿がある場合

  (1).POST取得(フォームデータ)
       ↓
  (2).フォームデータの文字列整形
       ↓
  (3).CSVファイルへの書き込み
       ↓

○投稿がない場合

  (4).CSVファイルの読み込み
       ↓
  (5).レコード出力

○機能
 
  ページング …ページ数のリンクから該当するレコードを算出して、出力。
  リロード対策 …POST2重登録を防御。

ソース

<?php
#############################################################
## ■セッション
#############################################################
session_start();
?>

<HTML>
<HEAD>
<TITLE>
掲示板
</TITLE>

<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<META http-equiv="Content-Script-Type" content="text/javascript">

<script language="JavaScript" type="text/javascript">
<!--
function Enter_no() {
return (event.keyCode == 13) ? false : true;
}
-->
</script>
<link rel="stylesheet" href="./css/style.css" type="text/css">
</HEAD>

<BODY>

<?php
#############################################################
## ■初期設定
#############################################################

// 自分自身のファイル名

$myself = './bbs_main.php';

// ログファイル

$logfile = "./log/bbs.csv";

// ページングファイル(外部読み込み)

$paging = './paging/page_link2.php';

// 管理ページ

$config = './config.php';

// ページモード

$page_mode = 'page_new';

// レコード出力変数

$record_start = ""; // レコード出力開始(レコードスタート)

$record_end = ""; // レコード出力末端(レコードエンド)

// Allリンクフラグ

$flag_all = 'no'; // ONの場合、前10件,次10件表示なし

// 変数明記

// $count_record レコードカウント

#############################################################
## ■ログレコード読み込み
#############################################################

$logdata = bbs_load($logfile);

#############################################################
## ■クエリ文字列取得 $_GET[]
#############################################################

if(strtoupper($_SERVER["REQUEST_METHOD"]) == "GET"){

// ページモード

$page_mode = $_GET["page_mode"];

// testing...

if($page_mode == NULL){

$page_mode = 'page_new';
}

// フラグ:Allリンク(前10件,次10件表示なしの為)

$flag_all = $_GET["flag_all"];

// ページ数リンク取得

$page = $_GET["page"];

// モード取得(ページング)

$mode = $_GET["mode"];
}

//print '$flag_all:'. "$flag_all". "<BR>\n";
//print '$page_mode:'. "$page_mode". "<BR>\n";

#############################################################
## ■POST-投稿受付処理 (ログ書き込み)
#############################################################

// 投稿があったときの処理
if(strtoupper($_SERVER["REQUEST_METHOD"]) == "POST"){

###########################################################
## □リロードID取得
###########################################################

$reloader = $_POST["reloader"];


###########################################################
## □リロードIDの比較
###########################################################

// 比較

if($reloader == $_SESSION["ses_reload"]){

// 等しい場合正規POSTフラグ'ON'

$flag_post = 'ON';
}
else{ $flag_post = 'off';}

###########################################################
## ■正規POSTの場合(リロードでない)
###########################################################

if($flag_post == 'ON'){

###########################################################
## □変数取得, 文字列整形
###########################################################

// 変数取得

$formdata = $_POST["formdata"];

###########################################################
## □クッキー保存
###########################################################

// 書き込み

setcookie("COOKIE2", "name=$formdata[1]", time() + 1 * 24 * 60 * 60);

#########################################################
## ・メッセージチェック
#########################################################

// フォームデータチェック関数

$formdata = form_check($formdata);

// 文字列整形

// フォームデータにタブがあった場合削除

$formdata = str_replace("\t", "", $formdata);

// 特殊文字のHTMLエントリー

$formdata = str_replace("<", "&lt;", $formdata);
$formdata = str_replace(">", "&gt;", $formdata);

// CSVファイル使用の為、カンマ削除

for($i=0; $i < count($formdata); $i++){

$formdata[$i] = str_replace(",", "", $formdata[$i]);
}

// 改行を含むテキスト処理

// nl2br関数により、文字列内の改行コード「\r \n」の前に<br />挿入

$formdata[4] = nl2br($formdata[4]);

// nl2br関数処理後、改行コード削除

$formdata[4] = str_replace("\n", "", $formdata[4]);

$formdata[4] = str_replace("\r", "", $formdata[4]);

// CSVファイル使用の為、改行を含むテキストは、""(ダブルクォーテーション)で囲む。

$formdata[4] = "\"". "$formdata[4]". "\"";

// フォーム配列エンコード

foreach($formdata as $key => $value){

$get_data_args[] = mb_convert_encoding($value, "SJIS", "auto");
}

###########################################################
## □保存用に文字列整形
###########################################################

$formstring = implode(",", $get_data_args) ;

###########################################################
## □タイムスタンプ
###########################################################

// 日付

$yy = date('Y');
$mm = date('m');
$dd = date('d');

// 曜日

$ww = date('w');

$ww = youbi($ww);

// 時間

$HH = date('H');
$ii = date('i');
$ss = date('s');

$date_str = "$yy". "/". "$mm". "/". "$dd". "/". "(". "$ww". ")". "$HH". ":". "$ii". ":". "$ss";

###########################################################
## □保存用に文字列整形(最終形態)
###########################################################

$formstring = $formstring . ",". "$date_str". "\n";

// testing.....

//print_r($formstring);

###########################################################
## □同一レコードがある場合ログデータに書き込まない
###########################################################

// ファイルオープン

$file_args = @file("$logfile") or die("ファイルが開けません。");

// フォームのレコードとファイルのレコードが等しいかをチェック

foreach($file_args as $value){

// チェック

if($formstring == $value){

$flag_double = 'ON';
}
}

###########################################################
## □同一レコードがない場合正規書き込み
###########################################################

if($flag_double !== 'ON'){

#######################################################
## ・投稿データをログデータに追加
#######################################################

array_push($logdata, $formstring);

#######################################################
## ・重複するレコード内容を削除
#######################################################

$logdata = array_unique($logdata);

#######################################################
## ・ログ書き込み
#######################################################

bbs_save($logfile, $logdata);
}
}
}
?>
<CENTER>
<hr width="600">
<?php

###########################################################
## ■リロードID発行
###########################################################

if(!session_is_registered("ses_reload")){

session_register("ses_reload");
}

$reload_id = $_SESSION["ses_reload"] + 1;

//print '$reload_id:'. "$reload_id". "<BR>\n";

###########################################################
## ■リロードIDセッション登録(現在のリロードID)
###########################################################

$_SESSION["ses_reload"] = $reload_id;

//print '$_SESSION["ses_reload"]:'. $_SESSION["ses_reload"]. "<BR>\n";

###########################################################
## ■POST用リロードID保存(前ページのリロードID)
###########################################################

$reload = $_SESSION["ses_reload"];

//print '$get_reload:'. "$reload". "<BR>\n";

###########################################################
## ■クッキー読み込み
###########################################################

parse_str($_COOKIE["COOKIE2"]);

###########################################################
## ■記事件数取得・クエリリンク・掲示板タイトル:出力
###########################################################

// ファイルオープン

$args = @file("$logfile") or die("ファイルが開けません。");

// 件数カウント

$record_line = count($args);

// ページ数リンク

// ページ数取得

$page_count = $record_line / 10;

// 出力

echo "<TABLE border=\"0\" width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n";

echo "<TR><TD align=\"center\">掲示板(CSV)</TD></TR>\n";

echo "<TR><TD align=\"left\">\n";

// ページリンク

// Allリンクフラグが'ON'でない場合にリンク出力

if($flag_all !== 'ON'){

echo "<a href=\"$myself?page_mode=all&flag_all=ON\">[All]</a>\n";
echo "<a href=\"$myself?page_mode=page_new\">[最新10件]</a>\n";
}
else{
echo "<a href=\"$myself?page_mode=page_new\">[掲示板に戻る]</a>\n";
}

// 記事件数

echo "記事件数:". "$record_line". "件\n";

// ページ数リンク出力

require("$paging");

echo "</TD></TR>\n";

echo "</TABLE>\n";

###########################################################
## ■レコード出力変数:$record_start, $record_end取得
###########################################################

#########################################################
## □All:$record_start, $record_end取得
#########################################################

if($page_mode == 'all'){

$record_start = 1;

$record_end = $record_line;

// $record_start, $record_end出力

if($mode !== 'pin' AND $mode !== 'next' AND $mode !== 'back'){

echo "<TABLE border=\"0\" width=\"600\"cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<TR><TD align=\"left\">\n";
echo '表示範囲:'. "\n";
echo "(". "$record_start". "〜". "$record_end". ")". "\n";
echo "<hr width=\"600\">\n";
echo "</TD></TR></TABLE>\n";
}
}

#########################################################
## □最新10件:$record_start, $record_end取得
#########################################################

if($page_mode == 'page_new'){

$record_end = (int)$record_line -10;

$record_start = (int)$record_end + 1;

$record_end = ((int)$record_start + 10) -1;

// $record_start, $record_end出力

if($mode !== 'pin' AND $mode !== 'next' AND $mode !== 'back'){

echo "<TABLE border=\"0\" width=\"600\"cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<TR><TD align=\"left\">\n";
echo '表示範囲:'. "\n";
echo "(". "$record_start". "〜". "$record_end". ")". "\n";
echo "<hr width=\"600\">\n";
echo "</TD></TR></TABLE>\n";
}

#####################################################
## ・セッション変数登録
#####################################################

if(!session_is_registered("ses_record_end")){

session_register("ses_record_end");

$_SESSION["ses_record_end"] = $record_end;
}
else{

$_SESSION["ses_record_end"] = $record_end;
}

}

#########################################################
## □ページ数リンクから:$record_start, $record_end取得
#########################################################

//if($page !== "" AND $page_mode !== 'page_new' AND $page_mode !== 'all'
// AND $page_mode !== 'back' AND $page_mode !== 'next'){

if($mode == 'pin'){

$record_end = $page * 10;

$record_start = $record_end -9;

// $record_start, $record_end出力

echo "<TABLE border=\"0\" width=\"600\"cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<TR><TD align=\"left\">\n";
echo '表示範囲:'. "\n";
echo "(". "$record_start". "〜". "$record_end". ")". "\n";
echo "<hr width=\"600\">\n";
echo "</TD></TR></TABLE>\n";
}
?>
</CENTER>
<BR>
<?php

#############################################################
## ■ログレコード出力
#############################################################

echo "<CENTER>\n";

echo "<TABLE border=\"2\" cellspacing=\"0\" cellpadding=\"2\" width=\"600\">\n";

###########################################################
## □出力処理
###########################################################

// ファイルオープン

$args = @file($logfile) or die("ファイルが開けません。");

// レコードカウント

$count_record = 0;

// レコード配列から1レコード読み込む

foreach($args as $value){

// レコードカウント加算

$count_record++;

if($count_record > $record_end){

break;
}

if($count_record >= $record_start AND $count_recored <= $record_end){

// カンマ区切りで分解後、配列格納

$columns = explode(",", $value);


// 先頭及び末尾の空白文字列を取り除く

trim($columns);

// 出力

echo "<TR>\n";

echo "<TD width=\"600\" align=\"left\" valign=\"top\" bgcolor=\"palegoldenrod\">\n";

echo "<font size=\"2\">$count_record</font>&nbsp;\n";

echo "<font size=\"2\">◆タイトル:$columns[0]</font>\n";

echo "<font size=\"2\">名前:$columns[1]</font>\n";

echo "<font size=\"2\">&nbsp;$columns[5]</font>";

echo "<font size=\"1\">\n";

if($columns[2] !== ""){

echo ' <a href="mailto:' . $columns[2] . '">[ MAIL ]</a>';
}

if($columns[3] !== ""){

print ' <a href="' . $columns[3] . '" target="_blank">[ HOME ]</a>';
}

echo "</font>\n";

echo "</TD>\n";

echo "</TR>\n";

echo "<TR><TD colspan=\"4\" bgcolor=\"cornsilk\">\n";

// 改行を含むテキスト処理

// メッセージテキストの""(ダブルクォーテーション)を取り除く

$columns[4] = str_replace('"', '', $columns[4]);

echo "$columns[4]\n";

echo "</TD></TR>\n";

echo "<TR><TD colspan=\"4\">\n";

echo "&nbsp;\n";

echo "</TD></TR>\n";
}
}

echo "</TABLE>\n";

echo "</CENTER>\n";
echo "<CENTER>\n";

###########################################################
## ■レコードエンド($record_end)0以下の場合メッセージ
###########################################################

if($record_end < 1){

print '対象記事がありません。'. "<BR>\n";
}

###########################################################
## ■レコードスタート($record_start)が全件数超過の場合
###########################################################

if($record_start > $record_line){

print '対象記事がありません。'. "<BR>\n";
}

###########################################################
## ■記事件数取得・クエリリンク:出力
###########################################################

// ファイルオープン

$args = @file("$logfile") or die("ファイルが開けません。");

// 件数カウント

$record_line = count($args);

// 出力

echo "<TABLE border=\"0\" width=\"600\" cellspacing=\"0\" cellpadding=\"2\">\n";

echo "<TR><TD align=\"left\">\n";

// ページリンク

// Allリンクフラグが'ON'でない場合にリンク出力

if($flag_all !== 'ON'){

echo "<a href=\"$myself?page_mode=all&flag_all=ON\">[All]</a>\n";
echo "<a href=\"$myself?page_mode=page_new\">[最新10件]</a>\n";
}
else{
echo "<a href=\"$myself?page_mode=page_new\">[掲示板に戻る]</a>\n";
}

// 記事件数

echo "記事件数:". "$record_line". "件\n";
for($i=0; $i<45; $i++){ echo "&nbsp;\n";}
echo "<a href=\"#top\">Page Top</a>". "\n";
echo "</TD></TR>\n";

echo "</TABLE>\n";
?>
<hr width="600">
<!--######################################################-->
<!--## ■投稿フォーム
<!--######################################################-->

<CENTER>
<?php

echo "<FORM method=\"POST\" action=\"$myself\">\n";
echo "<TABLE border=\"0\" cellspacing=\"0\" cellpadding=\"2\">\n";
echo "<TR>\n";
echo "<TD>タイトル</TD>\n";
echo "<TD>\n";
echo "<input type=\"text\" name=\"formdata[]\" size=\"40\" maxlength=\"40\" onkeydown=\"return Enter_no();\">\n";
echo "</TD>\n";
echo "</TR>\n";
echo "<TR>\n";
echo"<TD>名 前</TD>\n";
echo "<TD>\n";
echo "<input type=\"text\" name=\"formdata[]\" size=\"40\" maxlength=\"40\" onkeydown=\"return Enter_no();\" value=\"$name\">\n";
echo "</TD>\n";
echo"</TR>\n";
echo"<TR>\n";
echo"<TD>メール</TD>\n";
echo"<TD>\n";
echo"<input type=\"text\" name=\"formdata[]\" size=\"40\" maxlength=\"40\" onkeydown=\"return Enter_no();\">\n";
echo"</TD>\n";
echo"</TR>\n";
echo"<TR>\n";
echo"<TD>URL</TD>\n";
echo"<TD>\n";
echo"<input type=\"text\" name=\"formdata[]\" size=\"40\" maxlength=\"100\" onkeydown=\"return Enter_no();\">\n";
echo"</TD>\n";
echo"</TR>\n";
echo"<TR>\n";
echo"<TD colspan=\"2\">メッセージ</TD>\n";
echo"</TR>\n";
echo"<TR>\n";
echo"<TD colspan=\"2\"><textarea name=\"formdata[]\" cols=\"50\" rows=\"8\"></textarea>\n";
echo"</TD>\n";
echo"</TR>\n";
echo"<TR>\n";
echo"<TD colspan=\"2\" align=\"center\">\n";
echo"<input type=\"submit\" value=\"投稿する\">\n";
echo"<input type=\"reset\" value=\"取り消し\">\n";

echo "<input type=\"hidden\" name=\"reloader\" value=\"$reload\">\n";

echo"</TD>\n";
echo"</TR>\n";
echo"</TABLE>\n";
echo"</FORM>\n";
?>
</CENTER>

<?php

#############################################################
## ■関数lib                       
#############################################################

###########################################################
## □ログレコード読み込み関数
###########################################################

function bbs_load($get_file){

$data = @file($get_file);

return($data);
}

###########################################################
## □ログ書き込み関数
###########################################################

function bbs_save($file, $data){

// 書き込み

// ファイルオープン

$fp = @fopen($file, "w") or die("ファイルが開けません。");

// 排他ロック(2重書き込みロック)

flock($fp, LOCK_EX);

// ログデータ配列を1レコードずつ読み込み、1レコードの長さ分書き込む

foreach($data as $value){

fputs($fp, $value, strlen($value));
}

// ロック解除

flock($fp, LOCK_UN);

// ファイルクローズ

fclose($fp);
}

###########################################################
## □曜日取得
###########################################################

function youbi($get_ww){

switch($get_ww){

case 0:

$youbi_str = '日';
break;

case 1:

$youbi_str = '月';
break;

case 2:

$youbi_str = '火';
break;

case 3:

$youbi_str = '水';
break;

case 4:

$youbi_str = '木';
break;

case 5:

$youbi_str = '金';
break;

case 6:

$youbi_str = '土';
break;
}

return($youbi_str);
}
###########################################################
## □フォームデータチェック
###########################################################

function form_check($get_formdata){

// メッセージ欄が空欄の場合

if($get_formdata[4] == ""){

echo '入力確認:'. "<BR>\n";
echo 'メッセージを入力してください。'. "<BR>\n";
echo"<a href=\"./bbs_main.php\">前に戻る</a>\n";
exit();
}

// タイトルがない場合は「無題」に

if($get_formdata[0] == ""){

$get_formdata[0] = '無題';
}

// 名前がない場合は「名無しさん」に

if($get_formdata[1] == ""){

$get_formdata[1] = '名無しさん';
}

// リターン

return $get_formdata;
}
?>
<CENTER>
<hr width="600">
<TABLE border="0" width="600">
<TR>
<TD align="right">
<font size="2" color="gray">Copyright (C) 2007 projectz All Rights Reserved.&nbsp;</font>
</TD>
<TD>
<!-- ▼管理
<FORM action="" method="POST">
<input type="password" name="pass" size="6" maxlength="12">
<input type="submit" value="管理" style="background-color:gainsboro;color:black;border-color:gray;font-size:13">
</FORM>
▲管理 --->
</TD>
</TR>
</TABLE>
</CENTER>
</BODY>
</HTML>



実行画面

 

 

 

PHP4 - CSVファイル掲示板
PHP4 - MySQL掲示板

 

Copyright (C) 2007-2008 projectz All Rights Reserved.  Page Top▲