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 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%"> </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);
//ログファイルの区切文字(",")と区別するために文字コード(,)に書き換える。
$comment = str_replace(",", ",",$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へのリンク表示をしています。*上の内容をこのまま複写しても動きません。何故なら、表示を見やすくする為コード中に全角スペースが入っているからです。実際にお使いになる時は、この点を修正してからサーバにアップして下さい。
次へ DB連携チャット