DB連携掲示板スペシャル

 返信機能付きの「DB連携掲示板U」を更にパワーアップしました。記事の最大記録数の設定を可能にし、インラインリンク機能も付け、更には今まで不完全だった親記事と返信記事との連携も完全なものにしました。では、ソースをじっくりご覧下さい。

テーブル構造

 今までのと同じ構造です。念の為再度掲載します。

[テーブル作成文]

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

インデックス番号

列名

データ型

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

*varchar・・・可変長文字列

プログラム内容

<HTML>
<HEAD>
<TITLE>DB連携掲示板スペシャル</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">DB連携掲示板スペシャル</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%">
<?php
if ($flags == 'return') {
echo "<input type=submit value=[" . $return . "]に返信>\n";
echo "<input type=hidden name=ress value=$code>\n";
} else {
echo "<input type=submit name=submit value=書き込み/更新> <input type=reset name=reset value=リセット>\n";
}
?></TD>
</TR>
</TABLE>
</P>
<P>
<FONT SIZE="2" COLOR="red">*記事削除希望者は、記事番号を申告の上、その旨お申し出下さい。こちらで削除させて頂きます。</FONT>
</P>
</DIV>
<HR>
</FORM>
従来と同じ。題名だけ変えています。
<?php PHPの開始
//==============初期設定================
$password = '****'; //管理者パスワード
$homegif = './home.gif';
$page_view = 10; //1ページの記事表示件数
$max_data = 100; //記事最大記録件数
新たに記事の最大記録件数を設定しました。
//===============インライン関数===================
function inline_link($link){
 $link = ereg_replace("(https?|ftp|news)(://[[:alnum:]\+\$\;\?\.%,!#~*/:@&=_-]+)","<a href=\"\\1\\2\" target=\"_blank\">\\1\\2</a>",$link);
 return $link;
}
//================================================
新たにインラインリンク機能を付けました。ただし、URL対応のみです。
$d_base = pg_connect("user=***** dbname=*****");
if($action == regist){
 if($name && $comment){
  $num = time(); //アクセス時の秒数
  if($ress == ""){
   $ress = 0;
  }
  $today = date("Y/m/d(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);
  //インラインリンクを実現(URLのみ)
  $comment = inline_link($comment);

  pg_exec($d_base, "insert into komobbs2 values ($num,$ress,'$today','$name','$email','$hp','$subject','$comment','$host','$agent')");
 }
コメント内にURLリンクがあれば、自動的にリンクを貼れるよう処理しました。
 if($result = pg_exec($d_base, "select * from komobbs2 order by num DESC")){
  $row = pg_numrows($result); //検索結果の行数を取得
  if($row > $max_data){
   $arr = pg_fetch_row($result, $max_data);
   $max_arr = $arr[0];
   pg_exec($d_base, "delete from komochat where num <= $max_arr");
  }
 }

}
記事の最大記録件数を制限する為の処理を付け加えました。記事番号を使って、制限数を超えた記事を、SQL文で一括削除します。
if($action == delete){
 if($nu && $pass){
  if($pass == $password){
   pg_exec($d_base, "delete from komobbs2 where num=$nu or ress=$nu");
  }
 }
}
if($result = pg_exec($d_base, "select * from komobbs2 order by num DESC")){
 $row = pg_numrows($result); //検索結果の行数を取得
従来と同じ。
 for($i=0; $i<$row; $i++){
  $arr = pg_fetch_row($result, $i); //検索結果の一行分を配列に格納
  if($arr[1] == 0){
   $input_data = implode(",", array($arr[0],$arr[1],$arr[2],$arr[3],$arr[4],$arr[5],$arr[6],$arr[7],$arr[8],$arr[9]));
   $PARENT[] = $input_data;
  }
 }
親記事だけを抜き出して、配列$PARENT[ ]に格納します。ここの処理はちょっと苦労しました。実際に色々と試行錯誤の結果、inplode()関数を使う事になった次第です。
 $row2 = count($PARENT);
 if($pline == "")
  $p_line = 0;
 else
  $p_line = $pline;
 $end_data = $row2 - 1;
 $page_end = $p_line + ($page_view - 1);
 if($page_end >= $end_data)
  $page_end = $end_data;
親記事だけを格納した配列$PARENTの行数を数え、変数$row2に格納します。親記事の表示は、配列$PARENTの中身を基に展開します。
 for($i=$p_line; $i<=$page_end; $i++){
  list($num2,$ress2,$today2,$name2,$email2,$hp2,$subject2,$comment2,$host2,$agent2) = split(",", $PARENT[$i]);
  //親記事の表示
  echo "<form method=POST action=$PHP_SELF>\n";
  echo "<input type=radio name=delcode value=$num2>\n";
  echo "[" . $num2 . "]\n";
  echo " <font size=4 color='blue'><b>$subject2</b></font>";
  if($email2){
   echo " <a href=mailto:$email2><strong>$name2</strong></a>";
  } else {
   echo " <strong>$name2</strong>";
  }
  if($hp2){
   echo " <a href=$hp2 target=_blank><img src=$homegif border=0></a>\n";
  }
  echo " <font size=2>$today2</font>\n";
  echo "<input type=hidden name=action value=delete>\n";
  echo "<input type=hidden name=nu value=$num2>\n";
  echo "<font size=2> 削除キー:</font><input type=password size=7 name=pass>\n";
  echo "<input type=submit value=削除></form>\n";
  echo "<blockquote>$comment2<br><br>\n";
  echo "<font size=2 color='green'>[" . $host2 . "] $agent2</font>\n";
  echo "<form method=POST action=$PHP_SELF>\n";
  echo "<input type=submit value=返信>\n";
  echo "<input type=hidden name=code value=" . $num2 . ">\n";
  echo "<input type=hidden name=return value=" . $subject2 . ">\n";
  echo "<input type=hidden name=flags value=return>\n";
  echo "</blockquote></form>\n";
親記事の表示部分は、通常の掲示板と同じようなコード内容になります。親記事だけを格納した配列$PARENTからそれぞれの要素を抜き出して、記事一つずつを表示して行きます。

処理内容自体は基本的に一緒ですが、それぞれ使用している各要素の変数名が異なっています。
  //返信記事の表示
  for($j=0; $j<$row; $j++){
   $arr2 = pg_fetch_row($result, $j); //検索結果の一行分を配列に格納
   if ($num2 == $arr2[1]) {
    echo "<blockquote>\n";
    echo "<form method=POST action=$PHP_SELF>\n";
    echo "<input type=radio name=delcode value=$arr2[0]>\n";
    echo "[" . $arr2[0] . "]\n";
    echo "RE:<font color='blue'><b>$arr2[6]</b></font>\n";
    if ($arr2[4] != "") {
     echo " <a href=mailto:$arr2[4]><strong>$arr2[3]</strong></a>\n";
    } else { echo " <strong>$arr2[3]</strong>\n"; }
    if($arr2[5]){
     echo " <a href=$arr2[5] target=_blank><img src=$homegif border=0></a>\n";
    }
    echo " <font size=2>$arr2[2]</font>\n";
    echo "<input type=hidden name=action value=delete>\n";
    echo "<input type=hidden name=nu value=$arr2[0]>\n";
    echo "<font size=2> 削除キー:</font><input type=password size=7 name=pass>\n";
    echo "<input type=submit value=削除></form>\n";
    echo "<blockquote>$arr2[7]<br><br>\n";
    echo "<font size=2 color='green'>[" . $arr[8] . "] $arr[9]</font>\n";
    echo "</form></blockquote></blockquote>\n";
   }
  }
  echo "<hr>\n";
 }
親記事に対応した返信記事を抜き出す時の条件指定文の中で使っている変数名に、一部変更があります。親記事の方の記事番号は、今回変数$num2に格納されています。

後は従来と全く同じです。
 $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";
 }
}
従来と同じ。
?> PHPの終了
<DIV ALIGN="right"><FONT SIZE="-1">Powered by <A HREF="http://www.komonet.ne.jp/">KOMONET</A></FONT></DIV>
</BODY>
</HTML>
HTMLの終わり。

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

DB連携掲示板U 前へ

HOME

次へ DB連携ダイアリー