DB連携掲示板

 PostgreSQLのデータベースと連携させた、PHP掲示板スクリプトを作りました。データベースと連携させると、各書き込み記事の管理や操作が簡単になりますかね?!PHPスクリプト内のコード内容も、結構簡略化できますし…(^^ゞまあ、中身を一度見てやって下さいませ_(._.)_

テーブル構造

 PostgreSQLで作った掲示板用のデータテーブル「komobbs」の構造を見てみましょう。今回は最初と言う事もあり、結構手抜きのテーブル構造となっております(^^ゞテーブル作成は、以下のSQL文で行いました。尚、Primary Keyは「num」に設定しています。

[テーブル作成文]

create table komobbs (num int,date varchar,name varchar,email varchar,hp varchar,subject varchar,comment varchar,host varchar,agent varchar,primary key (num));

インデックス番号

列名

データ型

0 num int
1 date varchar
2 name varchar
3 email varchar
4 hp varchar
5 subject varchar
6 comment varchar
7 host varchar
8 agent varchar

*varchar・・・可変長文字列

プログラム内容

 次はPHPスクリプトのコード内容を見てみましょう。今回は最初なので、記事の最大記録数とかは設定していません。何しろデータベースと連携した掲示板ですから、かなりの数の記事が保存可能なはずです。記事の表示は10件ずつにしていますので、表示速度も低下しないでしょうし…(^^ゞ

<HTML>
<HEAD>
<TITLE>PostgreSQL掲示板</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFBF0" LINK="red" VLINK="red">
<FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST">
<INPUT TYPE="HIDDEN" NAME="action" VALUE="regist">
<DIV ALIGN="CENTER">
<P><FONT SIZE="6" COLOR="green">PostgreSQL掲示板</FONT></P>
<P>
<TABLE BORDER="0" CELLSPACING="1" WIDTH="71%">
<TR>
<TD WIDTH="17%">
<P ALIGN="RIGHT">お名前:
</TD>
<TD WIDTH="83%"><INPUT TYPE="TEXT" NAME="name" SIZE="19"></TD>
</TR>
<TR>
<TD WIDTH="17%">
<P ALIGN="RIGHT">E-mail:
</TD>
<TD WIDTH="83%"><INPUT TYPE="TEXT" NAME="email" SIZE="30"></TD>
</TR>
<TR>
<TD WIDTH="17%">
<P ALIGN="RIGHT">HomePage:
</TD>
<TD WIDTH="83%"><INPUT TYPE="TEXT" NAME="hp" SIZE="30"></TD>
</TR>
<TR>
<TD WIDTH="17%">
<P ALIGN="RIGHT">題目:
</TD>
<TD WIDTH="83%"><INPUT TYPE="TEXT" NAME="subject" SIZE="40"></TD>
</TR>
<TR>
<TD WIDTH="17%">
<P ALIGN="RIGHT">コメント:
</TD>
<TD WIDTH="83%"><TEXTAREA NAME="comment" ROWS="5" COLS="52"></TEXTAREA></TD>
</TR>
<TR>
<TD WIDTH="17%">&nbsp;</TD>
<TD WIDTH="83%"><INPUT TYPE="SUBMIT" NAME="Submit" VALUE="書き込み/更新"> <INPUT TYPE="RESET" NAME="Reset" VALUE="リセット"></TD>
</TR>
</TABLE>
</P>
<P>
<FONT SIZE="2" COLOR="red">*記事削除希望者は、記事番号を申告の上、その旨お申し出下さい。こちらで削除させて頂きます。</FONT>
</P>
</DIV>
<HR>
</FORM>
通常のHTML部分です。別段難しい所はないと思います。
<?php PHPの開始
//==============初期設定================
$password = '****'; //管理者パスワード
$homegif = './home.gif';
$page_view = 10; //1ページの記事表示件数
初期設定部分です。基本的な設定のみ。
//==============処理本体================
$d_base = pg_connect("user=***** dbname=*****");
まずデータベースと接続しましょう。

★int pg_connect ( string conn_string )関数・・・コネクションを開きます。成功すると接続インデックスを返し、コネクションが生成できなかった場合はfalseを返します。
if($action == regist){
 if($name && $comment){
  $num = time(); //アクセス時の秒数
  $today = date("Y/m/d H:i:s"); //アクセス時の時間データ
  //ホスト名を取得
  $host = getenv("REMOTE_HOST");
  $addr = getenv("REMOTE_ADDR");
  if($host == "" || $host == $addr){
   $host = gethostbyaddr($addr);
  }
  //訪問者のブラウザを取得
  $agent = getenv("HTTP_USER_AGENT");
  //コメントの文字列処理
  $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 komobbs values ($num,'$today','$name','$email','$hp','$subject','$comment','$host','$agent')");
 }
}
フォームデータ$actionが書き込み「regist」なら、フォームから送られて来たデータをデータベースに書き込みます。データ書き込みの為のSQL文は、insert文を使います。

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

他の処理内容については、「PHPの小部屋」サイトをご参照下さい。

★int time ( void )関数・・・現在時刻をUnix epoch(1970年1月1日00:00:00GMT)からの通算秒として返します。
if($action == delete){
 if($nu && $pass){
  if($pass == $password){
   pg_exec($d_base, "delete from komobbs where num=$nu");
  }
 }
}
フォームデータ$actionが書き込み「delete」なら、指定の記事をデータベースから削除します。データ削除の為のSQL文は、delete文を使います。
if($result = pg_exec($d_base, "select * from komobbs order by num DESC")){
 $row = pg_numrows($result); //検索結果の行数を取得
 if($pline == "")
  $p_line = 0;
 else
  $p_line = $pline;
 $end_data = $row - 1;
 $page_end = $p_line + ($page_view - 1);
 if($page_end >= $end_data)
  $page_end = $end_data;
 for($i=$p_line; $i<=$page_end; $i++){
  $arr = pg_fetch_row($result, $i); //検索結果の一行分を配列に格納
  echo "[" . $arr[0] . "]";
  echo " <font size=4 color='blue'><b>$arr[5]</b></font><br>";
  if($arr[3]){
   echo " <a href=mailto:$arr[3]><strong>$arr[2]</strong></a>";
  } else {
   echo " <strong>$arr[2]</strong>";
  }
  if($arr[4]){
   echo " <a href=$arr[4] target=_blank><img src=$homegif border=0></a>\n";
  }
  echo " $arr[1] <font size=2 color='green'>[" . $arr[7] . "] $arr[8]</font>\n";
  echo "<blockquote>$arr[6]</blockquote>\n";
  echo "<hr>\n";
 }
 echo "<FORM ACTION=$PHP_SELF METHOD=POST>\n";
 echo "<INPUT TYPE=hidden NAME=action VALUE=delete>\n";
 echo "記事番号:<INPUT TYPE=text NAME=nu SIZE=10> 管理パスワード:<INPUT TYPE=password NAME=pass SIZE=10>";
 echo " <INPUT TYPE=SUBMIT NAME=Submit VALUE=削除></FORM>\n";
 $next_line = $page_end + 1;
 if($page_end != $end_data){
  echo "<form method=Post action=$PHP_SELF>\n";
  echo "<input type=hidden name=pline value=$next_line>\n";
  echo "<input type=submit value=次のページ>\n";
  echo "</form>\n";
 }
}
書き込み記事の表示処理部分です。最初にif構文でデータがあるかどうか確かめているのは、データがない時の為のエラー処理です。

データをテーブルからセレクトする際に「
order by num DESC」と言う条件を付けているのは、通常の掲示板と同じように、新しい記事から順に表示する為です。「DESC」は降順の意味です。

処理の流れとしては、まずテーブルにある全データを、列「num」の値を基に降順に並べ替えてから取得し、それらを行単位に分けながら、各要素を一覧表示して行きます。ここでは
pg_fetch_rowを使っているので、数字をインデックスとして配列変数$arrの各要素を取得する事ができます。

1ページ当たりの記事表示件数を10件に設定しているのは、通常の掲示板の処理と同じ処理内容です。

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

★array pg_fetch_row ( int result, int row )関数・・・数字をインデックスとする配列として行を取得します。行がもうない場合にfalseを返します。
?> PHPの終了
<DIV ALIGN="right"><FONT SIZE="-1">Powered by <A HREF="http://www.komonet.ne.jp/">KOMONET</A></FONT></DIV>
</BODY>
</HTML>
HTMLの終わり。

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

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

 

HOME

次へ DB連携チャット