22.簡易チャットを作ってみる。
   チャットは、リアルタイムにコミュニケーションが可能なシステムでブラウザ上にメッセージの発言画面とメッセージ表示画面の両方を表示させるものである。
 1)データベースの構造
    ・データベース名:chat_db
    ・テーブル名:chat_tbl
    ・フィールドの構造
      ・第一フィールド フィールド名:id データ型:INT アンサインド オートインクリメント 主キー NOT NULL
      ・第二フィールド フィールド名:handle データ型:VACHER(200) NOT NULL
      ・第三フィールド フィールド名:message データ型 TEXT NOT NULL
      ・第四フィールド フィールド名:dateTime データ型 TIMESTAMP

 2)最も簡単なチャットを作る
  ①チャットにログオンするページ(ファイル名:chat.html)
    チャットの基本機能である、メッセージの発言とメッセージの表示だけに注目してもっとも簡単なチャットシステムを作ってみる。
    チャットは、ハンドル名(ニックネーム)を中心に発言を繰り返すために常にハンドル名の送信を行う必要がある。

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>チャットの超基本形</title>
</head>
<body>
チャットの超基本形<br>
<form name="form1" method="post" action="chat.php">
ハンドル名:<input name="fHandle" type="text">
<input name="fIn" type="hidden" value="logIn"> <!-- 最初のログインの情報を送信している。 -->
<input type="submit" name="Submit" value="入室">
<input type="reset" name="Submit2" value="クリア">
</form>
</body>
</html>
  ②チャット本体のプログラム(ファイル名:chat.php)
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<titleチャットの超基本形</title>
</head>
<body>
<?php
if(isset($_POST['fHandle'])) $sHandle=$_POST['fHandle']; else $sHandle=""; //ハンドルネームを受け取る。
if(isset($_POST['fMsg'])) $sMsg=$_POST['fMsg']; else $sMsg=""; //メッセージを受け取る。
if(isset($_POST['fIn'])) $sIn=$_POST['fIn']; else $sIn=""; //最初のログイン時のパラメータ「logIn」を受け取る。
if(isset($_POST['fSub2'])) $sSub2=$_POST['fSub2']; else $sSub2=""; //退室ボタンの情報を受け取る。
?>
<div>チャットの超基本形
<form name="form1" method="post" action="chat.php">
メッセージ:<input name="fMsg" type="text" size="100">
<input name="fHandle" type="hidden" value=<?= $sHandle ?>> <!-- 発言のたびにハンドルネームを送信しています。 -->
<input type="submit" name="fSub1" value="発言">
<input type="submit" name="fSub2" value="退室">
</form>
</div>
<div style="color:blue;">メッセージ:</div>
<hr>
<?php
$conn=mysqli_connect('localhost','******','******') or die("データベース接続に失敗しました。");
mysqli_select_db($conn,'chat_db') or die("指定されたデータベースは存在しません。"); //入室時のメッセージを設定しています。
if($sIn=="logIn"){
$sMsg="{$sHandle}さんが入室されました。";
} //退室時のメッセージを設定しています。
if($sSub2=="退室"){
$sMsg="{$sHandle}さんが退室されました。";
} //チャットデータの書き込み
$sql="insert into chat_tbl values(null,'{$sHandle}','{$sMsg}',null);";
if(!mysqli_query($conn,$sql)){
echo "チャットデータの書き込みに失敗しました。<br>\n";
exit();
}

//メッセージの表示。
$sql="select * from chat_tbl order by dateTime desc;"; //データベースのレコードを後ろから前に向かって読み込んでいます。
if($result=mysqli_query($conn,$sql)){
while($row=mysqli_fetch_array($result,MYSQL_ASSOC)){
echo "<span style=\"color:pink;\">{$row['handle']}</span><span style=\"color:red;\">></span>\n
<span style=\"color:black;\">{$row['message']}</span><span style=\"color:red;\">:</span>\n
<span style=\"color:yellow;\">{$row['dateTime']}</span>\n
<hr>\n";
}
}
else{
echo "チャットデータの抽出に失敗しました<br>\n"; }
mysqli_close($conn);
?>
</body>
</html>
 3)フレーム版チャットを作る。
 4)フレーム版チャット(ダミーページでキャッシュさせない)を作る。
 5)Ajax版チャットを作る。

<課題1>ハンドル名が、未入力の場合、再入力を促すようにしてください。

<課題2>更新ボタンが押されたときの処理は、すべてのレコードに同じハンドルネームとメッセージがあれば、
         書き込めないようにしている。このままだと数回前と同じメッセージを発言してもデータベースに書き込まれないので
         少し不都合が発生する。この部分を最新(一つ前の書き込み)のみチェックしてハンドルネームとメッセージが同じなら
         書き込みができないようにしなさい。

<課題3>入室画面と同じように、退室ボタンを押すと退室画面になりようにしなさい。
       <ヒント>header("Location:・・・・・");を使う。

<課題4>このままだと自動更新できない。自動更新の設定をするとメッセージ入力中に更新されるとメッセージがクリアされてしまうからである。
         これを解決するためには、上下にフレームを分けて上のフレームを「チャット入室画面」、「チャット発言画面」、「チャット退室画面」にして
         下のフレームをメッセージ表示にして、下のフレームのみ自動更新のプログラムをつければよい。
         フレームに分かれたチャットを作りなさい。

<課題1~4の答え>

<課題5>ここのチャットは、ハンドルネームやメッセージの色が気変えれるようになっています。
       色を変えれるようにしなさい。
       <ヒント>HTMLごとデータベースに保存してやればよい。
              ハンドル名・・・"<div style="color:#665544;">yamada</div>"
              メッセージ ・・・"<div style="color:#665544;">今日は、いい天気だね。</div>"

<課題5までの答え>

<課題6>会員制のチャットにしなさい。
       chat_dbのデータベースの中にuserId_tblテーブルを作ってください。
         ・第一フィールド フィールド名:id データ型:INT アンサインド オートインクリメント 主キー NOT NULL
         ・第二フィールド フィールド名:userName データ型:VARCHER(30) NOT NULL
         ・第三フィールド フィールド名:passWd データ型:VARCHER(30) NOT NULL