DB連携チャット

 PostgreSQLのデータベースと連携させた、PHPチャットスクリプトを作りました。掲示板スクリプトよりも更に簡単です。処理速度もかなり速いのかな?

テーブル構造

 PostgreSQLで作ったチャット用のデータテーブル「komochat」の構造を見てみましょう。掲示板に比べて項目数が極少なくて済むのがGOODかな?

[テーブル作成文]

create table komochat (num int,today char(30),name varchar,comment varchar);

インデックス番号

列名

データ型

0 num int
1 today char(30)
2 name varchar
3 comment varchar

*varchar・・・可変長文字列

プログラム内容

 次はスクリプト本体のコード内容を見てみましょう。今回はチャットなので、記事の最大記録数を設定しなくてはいけません。

<HTML>

<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=x-sjis">
<META HTTP-EQUIV="refresh" CONTENT="60" URL="<?php echo $PHP_SELF; ?>">
<TITLE>データベース連携チャット</TITLE>
</HEAD>

<BODY BGCOLOR="#CCCCFF">

<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="action" VALUE="regist">
<P><FONT SIZE="5" COLOR="#990066">データベース連携チャット</FONT></P>

<P>
<TABLE BORDER="0" CELLSPACING="1" WIDTH="97%">
<TR>
<TD WIDTH="10%">
<P ALIGN="RIGHT">お名前:
</TD>
<TD WIDTH="90%"><INPUT TYPE="TEXT" NAME="name" SIZE="21" VALUE=<?php echo $name; ?>> <FONT SIZE="2" COLOR="red">*コメントの最大記録数は50件です。</FONT></TD>
</TR>
<TR>
<TD WIDTH="10%">
<P ALIGN="RIGHT">コメント:
</TD>
<TD WIDTH="90%"><INPUT TYPE="TEXT" NAME="comment" SIZE="58"> <INPUT TYPE="SUBMIT" NAME="Submit" VALUE="書き込み"> リフレッシュ:60秒
</TD>
</TR>
</TABLE>
</P>

<P>
<HR ALIGN="CENTER">

</FORM>
通常のHTML部分です。別段難しい所はないと思います。

頭の部分で<META>タグにてリフレッシュ時間を45秒に設定しています。
<?php PHPの開始
//==============初期設定================
$max_view = 50; //コメント最大記録件数
初期設定部分です。チャットなので、コメントの最大記録件数は30にします。
//==============処理本体================
$d_base = pg_connect("user=***** password=***** dbname=*****");
まずデータベースと接続しましょう。

★int pg_connect ( string conn_string )関数・・・コネクションを開きます。成功すると接続インデックスを返し、コネクションが生成できなかった場合はfalseを返します。
if($action == regist){
 if($name && $comment){
  $num = time(); //アクセス時の秒数
  $today = date("Y/m/d(D) H:i:s"); //アクセス時の時間データ
  //名前とコメントの文字列処理
  $name = htmlspecialchars($name);
  $name = nl2br($name);
  $name = str_replace("\r", "", $name);
  $name = str_replace("\n", "", $name);
  $comment = htmlspecialchars($comment);
  $comment = nl2br($comment);
  $comment = str_replace("\r", "", $comment);
  $comment = str_replace("\n", "", $comment);
  //ログファイルの区切文字(",")と区別するために文字コード(&#44)に書き換える。
  $comment = str_replace(",", "&#44;",$comment);
  pg_exec($d_base, "insert into komochat values ($num,'$today','$name','$comment')");
 }
フォームデータ$actionが書き込み「regist」なら、フォームから送られて来たデータをデータベースに書き込みます。データ書き込みの為のSQL文は、insert文を使います。

記事番号にはユニークな番号を当てる必要がある為、アクセス時のUNIXタイムスタンプを使います。

★int time ( void )関数・・・現在時刻をUnix epoch(1970年1月1日00:00:00GMT)からの通算秒として返します。
 if($result = pg_exec($d_base, "select * from komochat order by num DESC")){
  $row = pg_numrows($result); //検索結果の行数を取得
  if($row > $max_view){
   $arr = pg_fetch_row($result, $max_view);
   $max_arr = $arr[0];
   pg_exec($d_base, "delete from komochat where num <= $max_arr");
  }
 }
}
次に、コメントの最大記録件数の処理を行います。最初にif構文でデータがあるかどうか確かめているのは、データがない時の為のエラー処理です。

データをテーブルからセレクトする際に「
order by num DESC」と言う条件を付けているのは、新しいコメントから順に表示する為です。「DESC」は降順の意味です。

処理の流れとしては、まずテーブルにある全データを、列「num」の値を基に降順に並べ替えてから取得し、それらの行数
$rowを取得します。次にpg_fetch_rowを使って、最大記録数$max_viewに当る配列データ$arrを取得します。そして、この配列の最初のデータ(numに当る)$arr[0]を変数$max_arrに格納し、これを基準に最大記録数を超えたコメントを削除します。

★int pg_numrows ( int result_id )関数・・・引数 result_id で指定されたPostgreSQLの結果IDにおける行数を返します。

★array pg_fetch_row ( int result, int row )関数・・・数字をインデックスとする配列として行を取得します。行がもうない場合にfalseを返します。
if($result = pg_exec($d_base, "select * from komochat order by num DESC")){
 $row = pg_numrows($result);
 for($i=0; $i<$row; $i++){
  $arr = pg_fetch_row($result, $i);
  echo "<font color='blue'><strong>$arr[2]</strong></font>\n";
  echo " $arr[3] <font size=2 color='green'>$arr[1]</font><br>\n";
 }
}
書き込み記事の表示処理部分です。最初にif構文でデータがあるかどうか確かめているのは、データがない時の為のエラー処理です。

後は、上の処理と同じ関数を使って、それぞれの要素を順番に表示して行きます。
?> PHPの終了
<DIV ALIGN="right"><FONT SIZE="-1">Powered by <A HREF="http://www.komonet.ne.jp/">KOMONET</A></FONT></DIV>
</BODY>
</HTML>
HTMLの終わり。

ここにKOMONETへのリンク表示をしています。

<サンプルだよ!>

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

DB連携掲示板 前へ

HOME

次へ DB連携掲示板U