多機能チャット
フレームチャットを色々と機能強化しました(^。^)エントリーページとメッセージの書き込みページを分けたので、一旦エントリーしてからの書き込み操作の手間が、大幅に省けてます。(カーソル位置が移動しない!)リフレッシュ時間も選択出来るようにしました。また、ついでに「管理者」の挨拶も表示出来るようにしました。
<?php | PHP開始の合図。 |
//===================初期設定==================== $data_file = './chat.dat'; //データファイル名 $title = '多機能チャット'; //タイトル名 $data_max = 20; //データ最大記録数 |
リフレッシュ時間は、メッセージ書き込み時に選択出来るようにしました。 |
//==================フレーム生成関数================== function MakeFrame() { global $title,$PHP_SELF; print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n"; print "<FRAMESET rows=22%,78%>\n"; print "<FRAME src=$PHP_SELF?mode=input name=up>\n"; print "<FRAME src=$PHP_SELF?mode=output name=bottom>\n"; print "</FRAMESET></HTML>\n"; } |
従来と同じ。 |
//=================エントリーフォーム生成関数=============== function EntryPage() { global $title,$PHP_SELF; print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n"; print "<BODY text=#000000 bgcolor=#ffffee>\n"; print "<FORM method=POST action=$PHP_SELF target=up>\n"; print "<INPUT type=hidden name=mode value=input>\n"; print "<H3>$title</H3>\n"; print "<BLOCKQUOTE>\n"; print "<TABLE BORDER=0 CELLSPACING=1 WIDTH=80%>\n"; print "<TR><TD WIDTH=11%><P ALIGN=RIGHT>お名前:</TD>\n"; print "<TD WIDTH=89%><INPUT type=text name=ename size=20>\n"; print "<input type=radio name=ecolor value=#0000ff checked><font color=#0000ff><b>青</b></font>\n"; print " <input type=radio name=ecolor value=#ff0000><font color=#ff0000><b>赤</b></font>\n"; print " <input type=radio name=ecolor value=#008000><font color=#008000><b>緑</b></font>\n"; print " <input type=radio name=ecolor value=#800000><font color=#800000><b>茶</b></font>\n"; print " <input type=radio name=ecolor value=#800080><font color=#800080><b>紫</b></font>\n"; print "<INPUT type=submit value=エントリー></TD></TR></TABLE></BLOCKQUOTE>\n"; print "</FORM></BODY></HTML>\n"; } |
新たに、エントリーフォームを生成する為の関数EntryPage( )を作りました。 最初にグローバル変数を設定している点に注意して下さい。 ここで送信するフォームデータは、$modeと$enameと$ecolorです。 |
//=================入力フォーム生成関数================= function InputPage() { global $title,$ename,$ecolor,$refresh,$PHP_SELF; print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n"; print "<BODY text=#000000 bgcolor=#ffffee>\n"; print "<FORM name=form1 method=POST action=$PHP_SELF target=bottom>\n"; print "<INPUT type=hidden name=mode value=post>\n"; print "<BLOCKQUOTE>\n"; print "<TABLE BORDER=0 CELLSPACING=1 WIDTH=88%>\n"; |
入力フォームを生成する為の関数InputPage( )を作ります。 最初にグローバル変数を設定している点に注意して下さい。 |
if($ename != ""){ print "<TR><TD>$ename :<INPUT type=hidden name=name value=$ename>\n"; } else { print "<TR><TD>身元不明人:<INPUT type=hidden name=name value=身元不明人>\n"; } |
エントリーフォームから送られて来たデータを元に、書き込み者の表示を振り分けています。 |
print "<INPUT type=hidden name=ncolor value=$ecolor>\n"; print "<INPUT type=text name=message size=50>\n"; |
書き込み者の表示色を、変数$ncolorのvalue=$ecolorで引き継いでいます。 |
print " リフレッシュ:<SELECT NAME=refresh><OPTION>30</OPTION><OPTION>45</OPTION><OPTION>60</OPTION></SELECT> 秒\n"; | リフレッシュ時間を選択して設定出来るようにしました。余り短いのは困るので、一応30秒から…(^^ゞ |
print " <INPUT type=submit value=送信></TD></TR></FORM>\n"; | |
print "<TR><TD><FORM method=POST action=$PHP_SELF target=up>\n"; print "<INPUT type=hidden name=mode value=return>\n"; if($ename != ""){ print "<INPUT type=hidden name=bname value=$ename>\n"; } else { print "<INPUT type=hidden name=bname value=身元不明人>\n"; } print "<INPUT type=submit value=エントリーページへ戻る></TD></TR></FORM>\n"; print "</TABLE></BLOCKQUOTE></BODY></HTML>\n"; } |
エントリーフォームに戻る為の送信ボタンを作成しています。 「管理者」の挨拶を表示する為に、変数$bnameにそれぞれの値を持たせて送信します。 |
//===================メッセージ表示関数===================== function OutputPage() { global $title,$data_file,$refresh,$PHP_SELF; print "<HTML><HEAD><TITLE>$title</TITLE></HEAD>\n"; print "<META HTTP-EQUIV=refresh CONTENT=$refresh;URL=$PHP_SELF?mode=output>\n"; print "<BODY text=#000000 bgcolor=#ffffee link=#ff0000 vlink=#ff0000>\n"; print "<SCRIPT language=JavaScript>\n"; print "parent.up.document.form1.message.value=\"\";\n"; print "</SCRIPT>\n"; $datalog = file($data_file); $msg_count = count($datalog); for($i = 0; $i < $msg_count; $i++){ list($name2,$ncolor2,$message2,$now2) = split( ",", $datalog[$i]); //記事表示部を生成 print "<font color=$ncolor2><b>$name2</b></font>"; print " $message2"; print "<font size=2 color='green'> $now2</font>\n"; print "<hr>\n"; } print "</BODY></HTML>\n"; } |
従来と同じ。 |
//=================メッセージ書き込み関数================== function PostMessage() { global $name,$ncolor,$message,$data_file,$data_max; if(($name != "") && ($message != "")){ //現在時刻の取得 $now = date("Y/m/d H:i:s"); //ここから書き込みデータの調整 $name = htmlspecialchars($name); //特殊文字のHTMLエントリへの変換 $name = nl2br($name); //HTML改行文字の挿入 $name = str_replace("\r", "", $name); //文字列の置換 $name = str_replace("\n", "", $name); $ncolor = htmlspecialchars($ncolor); $ncolor = nl2br($ncolor); $ncolor = str_replace("\r", "", $ncolor); $ncolor = str_replace("\n", "", $ncolor); $message = htmlspecialchars($message); $message = nl2br($message); $message = str_replace("\r", "", $message); $message = str_replace("\n", "", $message); //ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。 $name = str_replace(",", ",",$name); $message = str_replace(",", ",",$message); //配列要素を文字列により連結 $input_msg = implode(",", array($name,$ncolor,$message,$now)); $datalog = file($data_file); $fp = fopen($data_file, "w"); rewind($fp); fputs($fp, "$input_msg\n"); //最大記録数の調整 if($data_max < sizeof($datalog)) $msg_num = $data_max - 1; else $msg_num = sizeof($datalog); for($i = 0; $i < $msg_num; $i++){ fputs($fp, $datalog[$i]); } fclose($fp); unset($datalog); } OutputPage(); } |
従来と同じ。 |
//================管理者メッセージ生成関数================ function Greeting() { global $data_file,$ename,$bname,$data_max,$mode; //現在時刻の取得 $now = date("Y/m/d H:i:s"); $ename = htmlspecialchars($ename); //特殊文字のHTMLエントリへの変換 $bname = htmlspecialchars($bname); $ncolor = 'black'; $master = '管理者'; if($mode == "input"){ if($ename != ""){ $gmessage = "$ename" . "さん、いらっしゃいなりー(^。^)"; } else { $gmessage = "身元不明人さん、いらっしゃいなりー(^。^)"; } } if($mode == "return"){ if($bname != ""){ $gmessage = "$bname" . "さん、さようなりー(^。^)"; } else { $gmessage = "身元不明人さん、さようなりー(^。^)"; } } //配列要素を文字列により連結 $input_msg = implode(",", array($master,$ncolor,$gmessage,$now)); $datalog = file($data_file); $fp = fopen($data_file, "w"); rewind($fp); fputs($fp, "$input_msg\n"); //最大記録数の調整 if($data_max < sizeof($datalog)) $msg_num = $data_max - 1; else $msg_num = sizeof($datalog); for($i = 0; $i < $msg_num; $i++){ fputs($fp, $datalog[$i]); } fclose($fp); unset($datalog); } |
新たに、管理者メッセージを生成する為の関数Greeting( )を作りました。 最初にグローバル変数を設定している点に注意して下さい。 変数$modeの値によって、表示するメッセージの種類を分けています。 後の処理は、メッセージ書き込み関数PostMessage( )と同じです。 |
//==================メイン処理===================== if($mode == ""){ MakeFrame(); } elseif($mode == "entry") { EntryPage(); } elseif($mode == "output") { OutputPage(); } elseif($mode == "input") { InputPage(); Greeting(); } elseif($mode == "post") { PostMessage(); } elseif($mode == "return") { EntryPage(); Greeting(); } else { } |
新たに増えた処理に合わせて、条件分岐も増えました。 |
?> | PHP終了の合図。 |
*上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。