フレームチャット

 Perl版のフレームチャット・スクリプトをPHPに移植しました。フレーム版にする事で、オートリロード後、「お名前」の値が消えないように出来ました。ただ今回は、構造上HTMLにPHP文を埋め込むと言う訳には行かなくなってしまいました。ファイル全体をPHP文にして、中でHTMLを呼び出しています。

 処理の流れとしては、まず中で使う関数群を定義して、最後に条件分岐によって、各関数を呼び出して処理を行っています。

<?php PHP開始の合図。
//===================初期設定====================
$data_file = './chat.dat'; //データファイル名
$title = 'フレームチャット'; //タイトル名
$data_max = 20; //データ最大記録数
$refresh = 45; //リフレッシュ時間
Perlのように、まずは初期設定をします。
//==================フレーム生成関数==================
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";
}
フレームを生成する為の関数MakeFrame( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

$PHP_SELFは、このスクリプト自身を指します。
//================入力フォーム生成関数===================
function InputPage() {
 global $title,$name,$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 "<TABLE BORDER=0 CELLSPACING=1 WIDTH=100%>\n";
 print "<TR><TD WIDTH=17%><H3>$title</H3></TD>\n";
 print "<TD WIDTH=11%><P ALIGN=RIGHT>お名前:</TD>\n";
 print "<TD WIDTH=72%><INPUT type=text name=name size=20 value=$name>\n";
 print "<input type=radio name=ncolor value=#0000ff checked><font color=#0000ff><b>青</b></font>\n";
 print " <input type=radio name=ncolor value=#ff0000><font color=#ff0000><b>赤</b></font>\n";
 print " <input type=radio name=ncolor value=#008000><font color=#008000><b>緑</b></font>\n";
 print " <input type=radio name=ncolor value=#800000><font color=#800000><b>茶</b></font>\n";
 print " <input type=radio name=ncolor value=#800080><font color=#800080><b>紫</b></font></TD></TR>\n";
 print "<TR><TD WIDTH=17%></TD><TD WIDTH=11%><P ALIGN=RIGHT>メッセージ:</TD>\n";
 print "<TD WIDTH=72%><INPUT type=text name=message size=50>\n";
 print "<INPUT type=submit value=送信> リロード: $refresh 秒\n";
 print "</TD></TR>\n";
 print "</FORM></BODY></HTML>\n";
}
入力フォームを生成する為の関数InputPage( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

「お名前」のテキストボックスのvalueに、変数
$nameを設定して、フォームデータを取り込むようにしています。
//===================メッセージ表示関数=====================
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";
}
メッセージを表示する為の関数OutputPage( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

METAタグで、リフレッシュ時間を設定しています。

JavaScriptを使っている点にも注意して下さい。フレーム上部のmessageのvalueが空である事を表しています。

後は、定番の記事一覧表示処理です。データを1行ずつ読み込んで各要素に分割し、それぞれ表示して行きます。
//=================メッセージ書き込み関数==================
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();
}
メッセージを書き込む為の関数PostMessage( )を作ります。

最初に
グローバル変数を設定している点に注意して下さい。

後は、掲示板スクリプトに見られる処理と一緒です。詳しくは、「超簡単掲示板」のページをご参照下さい。

一連の処理が済んだ後、関数
OutputPage( )を呼び出している点に注意して下さい。Perlでのリロード処理と同じです。
//==================メイン処理=====================
if($mode == ""){ MakeFrame(); }
elseif($mode == "input") { InputPage(); }
elseif($mode == "output") { OutputPage(); }
elseif($mode == "post") { PostMessage(); }
else { }
ここが今回のメインの処理部分になります。PHP3では、関数群は呼び出す前に定義していなくてはいけません。ここで条件分岐しています。
?> PHP終了の合図。

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

HOME