多機能チャット

 フレームチャットを色々と機能強化しました(^。^)エントリーページとメッセージの書き込みページを分けたので、一旦エントリーしてからの書き込み操作の手間が、大幅に省けてます。(カーソル位置が移動しない!)リフレッシュ時間も選択出来るようにしました。また、ついでに「管理者」の挨拶も表示出来るようにしました。

<?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";
書き込み者の表示色を、変数$ncolorvalue=$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);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $name = str_replace(",", "&#44;",$name);
  $message = str_replace(",", "&#44;",$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終了の合図。

 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。

HOME