フレームチャット
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);
//ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。
$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();
}メッセージを書き込む為の関数PostMessage( )を作ります。
最初にグローバル変数を設定している点に注意して下さい。
後は、掲示板スクリプトに見られる処理と一緒です。詳しくは、「超簡単掲示板」のページをご参照下さい。
一連の処理が済んだ後、関数OutputPage( )を呼び出している点に注意して下さい。Perlでのリロード処理と同じです。//==================メイン処理=====================
if($mode == ""){ MakeFrame(); }
elseif($mode == "input") { InputPage(); }
elseif($mode == "output") { OutputPage(); }
elseif($mode == "post") { PostMessage(); }
else { }ここが今回のメインの処理部分になります。PHP3では、関数群は呼び出す前に定義していなくてはいけません。ここで条件分岐しています。 ?> PHP終了の合図。 *上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。