掲示板の作り方について
<?php
// ---
//
$msg_file = "msg.dat";
$jnl_file = "jnlmsg.dat";
$flg = False;
?>
<!DOCTYPE HTML PUBLIC "-//IBM//DTD HPB HTML//EN">
<HTML>
<HEAD>
<TITLE>我的BB_v03</TITLE>
</HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-euc-jp">
<BODY text="#000000" link="#0000FF" bgproperties=fixed>
<B><Font size="+3">phpのお勉強用 掲示板</FONT></B> Version 03
<FORM ACTION=<?php echo $PHP_SELF ?> METHOD="POST">
<DIV align="left">
<TABLE>
<TR>
<TD></TD>
<TD></TD></TR>
<TR>
<TD>お名前</TD>
<TD><INPUT name="b_name" size="25"></TD></TR>
<TR>
<TD>タイトル</TD>
<TD><INPUT name="b_title" size="55"></TD></TR>
<TR>
<TD valign="top">本文</TD>
<TD>
<TEXTAREA name="b_honbun" rows="10" cols="54">
</TEXTAREA>
</TD></TR>
</TABLE>
</DIV>
<TABLE>
<TR>
<TD><INPUT type="submit" name="b_send" value=" 送信 "></TD>
<TD><INPUT type="reset" name="b_reset" value=" リセット"></TD>
<TD> </TD>
<TD><INPUT type="PASSWORD" name="b_password" size="10">
削除キー</TD>
</TR>
<TR>
<TD></TD><TD></TD><TD></TD>
<TD><FONT size="-1" Color=RED>
↑削除キーを設定しておくと、ご自分で記事を削除することが出来ます。
</FONT></TD>
</TR>
</TABLE>
<INPUT type="HIDDEN" name="b_mode" value="insert">
</FORM>
<HR noshade size="3">
<?php
//
//---- 挿入モード
//
if ($_POST['b_mode'] == "insert"){
if ($_POST['b_name'] != ""){ //名前が入っていれば
$rec_dat = one_rec_format(); //POSTデーターをレコード形式に
$rec_line = implode(",",$rec_dat); //レコード行にまとめる。
//
//---- fileを読み込む
//
$msg_dat = file($msg_file); //msg.dat から読み込み
$count = count($msg_dat);
//
// ---- 書き込み
add_journal($jnl_file,$rec_line); //ジャーナルに書き込み
$fp = fopen($msg_file,"w"); //書き込みモードで open
fputs($fp,"$rec_line\n");
for($i = 0;$i < $count ;$i++){
fputs($fp,"$msg_dat[$i]");
}
fclose($fp);
}
}
//
//---- 削除モードの場合
//
if ($_POST['b_mode'] == "delete"){
//
//---- パスワードが入っていれば
//
if ($_POST['d_password'] != ""){
//
//---- fileを読み込む
//
$msg_dat = file($msg_file); //msg.dat から読み込み
$count = count($msg_dat);
$i = 0;
$flg = false;
while ($i < $count and ! $flg ){
$one_msg = set_field_format($msg_dat[$i]);
if ($_POST['del_ID'] == $one_msg['r_ID'] and
$_POST['d_password'] == $one_msg['r_PASSWORD']){
$flg = TRUE;
$one_msg['r_DEL_FLG'] = $flg;
$rec_line = implode(",",$one_msg); //レコード行にまとめる。
add_journal($jnl_file,$rec_line); //ジャーナルに書き込み
unset($msg_dat[$i]); //配列から削除
}
$i++;
}
if ($flg){
$msg_dat = array_values($msg_dat); //添え字の付け替え
$count = count($msg_dat);
$fp = fopen($msg_file,"w"); //書き込みモードで open
for($i = 0;$i < $count ;$i++){
fputs($fp,"$msg_dat[$i]");
}
fclose($fp);
}
}
}
if (! $flg ){
$msg_dat = file($msg_file); //msg.dat から読み込み
$count = count($msg_dat);
}
for($i = 0;$i < $count;$i++ ){
disp_msg(set_field_format($msg_dat[$i]));
}
?>
<HR noshade size="3">
</BODY>
</HTML>
<?php
/*********************************************
** メッセージデーターの表示
**
**
**********************************************/
function disp_msg($post_arr){
global $PHP_SELF;
echo <<<EOT
<FORM ACTION={$PHP_SELF} METHOD="POST">
<TABLE border = 0>
<TR>
<TD>お名前</TD>
<TD>{$post_arr['r_NAME']}</TD>
<TD>日時</TD>
<TD>{$post_arr['r_ac_date']}</TD>
<TD><INPUT type="PASSWORD" name="d_password" size="10">
<INPUT type="submit" name="b_send" value="削除">
</TD>
</TR>
<TR>
<TD>タイトル</TD>
<TD>{$post_arr['r_TITLE']}</TD>
<TD><INPUT type="HIDDEN" name="del_ID" value={$post_arr['r_ID']}></TD>
<TD><INPUT type="HIDDEN" name="b_mode" value="delete"></TD>
<TD></TD>
</TR>
</TABLE>
本文
<table border = 0 WIDTH="50%">
<TR>
<TD BGCOLOR = #d0e2a5>{$post_arr['r_COMMENT']}</TD>
</TR>
</TABLE>
</FORM>
<HR>\n
EOT;
}
/************************************************
** HTML 文章の改行に変換する。
** <BR> の挿入
** CRLF の削除
**
*************************************************/
function crlf_convert($textmsg){
$bufmsg = nl2br($textmsg); //<br /> の挿入
$bufmsg = str_replace("\r","",$bufmsg); //\r を取り除く
$bufmsg = str_replace("\n","",$bufmsg); //\n
return($bufmsg);
}
/*************************************************
** POST Data をファイルフォーマットを作る。
** 入力は POST 出力は 1 レコードの配列
**
**************************************************/
function one_rec_format(){
//
//----html 特殊文字の変換
//
$a_name = htmlspecialchars($_POST['b_name']); //特殊文字の変換
$a_title = htmlspecialchars($_POST['b_title']);
$a_bun = crlf_convert(htmlspecialchars($_POST['b_honbun']));
//
//--- HOST ADDRESS AGENT の取得
//
$a_host = getenv('REMOTE_HOST'); //HOST 名
$a_addr = getenv('REMOTE_ADDR'); //ADDRESS
if ( $a_host == "" || $a_host == $a_addr )
$a_host = gethostbyaddr($a_addr);
$a_agent = getenv('HTTP_USER_AGENT');
//
//--- Record Foemat 配列に設定する。
//
$rec_f = array("r_ID" => time(),
"r_PASSWORD" => $_POST['b_password'],
"r_DEL_FLG" => FALSE,
"r_NAME" => $a_name,
"r_MAIL_ADDR" => "mail", //ここはダミー
"r_TITLE" => $a_title,
"r_COMMENT" => $a_bun,
"r_ac_date" => date("Y/m/d H:i:s ",time()),
"r_HOST" => $a_host,
"r_ADDR" => $a_addr,
"r_AGENT" => $a_agent
);
return($rec_f);
}
/**********************************************
** recode を 配列にする。
** 入力は一行分のカンマ区切りレコードフォーマット
** 出力は一行の record line
***********************************************/
function set_field_format($msg_arr){
//
//---- 配列の復元 カンマ区切りを変数に読み出す。
//
list($r_ID,$r_PASSWORD,$r_DEL_FLG,$r_NAME,$r_MAIL_ADDR,
$r_TITLE,$r_COMMENT,$r_ac_date,$r_HOST,
$r_ADDR,$r_AGENT) = split(",",$msg_arr);
//---- 連想配列へ
$rec_f = array("r_ID" => $r_ID,
"r_PASSWORD" => $r_PASSWORD,
"r_DEL_FLG" => $r_DEL_FLG,
"r_NAME" => $r_NAME,
"r_MAIL_ADDR" => r_MAIL_ADDR, //ここはダミー
"r_TITLE" => $r_TITLE,
"r_COMMENT" => $r_COMMENT,
"r_ac_date" => $r_ac_date,
"r_HOST" => $r_HOST,
"r_ADDR" => $r_ADDR, //未表示
"r_AGENT" => $r_AGENT //未表示
);
return($rec_f);
}
/**************************************************
** journal file へ出力する。
**
** 入力 file名,一行データー
** 出力 ジャーナルファイルへ一行追加
***************************************************/
function add_journal($f_name,$add_line){
$fp = fopen($f_name,"a");
fputs($fp,"$add_line\n");
fclose($fp);
}
?>
|
msg.dat 表示データーの格納ファイル
jnlmsg.dat ジャーナルデーター
削除機能を追加する。
我的BBS V03
パスワード入力追加する。 V03
メッセージを追加する。
送信ボタンが押されたとき は insert mode
開始時はなにもない筈
削除機能を追加する。 V03
ID と Passwaord が一致すれば
削除フラグを True にする。結果1 が入る。
ジャーナル出力の準備
unset( ) だけでは数字添え字が抜けている
だけなので array_values()で付け替える
msg.dat に出力する。
$flg が True になるのは削除モードで
該当レコードがあった場合のみでそのときは
mag.dat は既に読み込まれているので
なにもしない。
|
| | 一つ前に戻る | |
2005/06/30 start ********* Last Update 2006/11/13 15:24 JST
| その他、お気づきの点がありましたら連絡先はこちらから |