掲示板を作る 誤りの指摘やご意見はこちらへ ご意見板
BBS

PHP Top
項目
シンプルな掲示板を作る ↑項目に戻る
この掲示板のPostgresバージョンをshin様よりご提供いただいております
Postgres+PHP掲示板


それでは、掲示板を作りましょう。
まずはとってもシンプルな掲示板です。
以下の内容で、それぞれのファイルを作成してください。

bbs1.php
write1.php
show_contents1.php

(今回より、プログラムが長くなってきますので、このような表示形式にさせていただきます)
(また、文字コードは全てEUCで保存してください)

試してみる

今回はファイルをいくつかに分けています。
上手に分けると、ロジックとデザインの部分を分離することができます。
これにより、ロジックはプログラマが、デザインはデザイナが担当する、というように分業が可能になります。
(実際には完全に分離することは難しいですが。)
データベース名は[bbs]、テーブルも[bbs]という名前で次のような項目で作成してください。

フィールド名 フィールド型 属性
number int(5) PRIMARY KEY, AUTO_INCREMENT
parent_number int(5)  
title varchar(255)  
contents text  
name varchar(255)  
datetime datetime  
IP varchar(255)  
mail varchar(255)  

■解説--------

各ファイルは
bbs1.php・・・メインプログラム
write1.php・・・書き込みフォーム表示
show_contents1.php ・・・投稿内容表示

という内容になっています。

bbs1.phpの処理の流れは
1.DB接続
2.書き込みボタンが押されているなら書き込み処理
3.投稿内容表示なら表示
4.いずれでもないなら投稿一覧表示

となっています.
書き込みフォーム、投稿内容表示部分を別ファイルにして、include命令により組み込んでいます。

print $result ? "書き込みました ": "書き込みに失敗しました ";

この部分は、3項演算子というものを使っています。
$resultの内容が真なら"書き込みました"を、偽なら"書き込みに失敗しました"を表示します。

function Show_Titles(){
  print ("<b>投稿一覧</b><br><br> ");
  $result = mysql_query("select * from bbs");
  while ($row = mysql_fetch_array($result)) {
    $number = $row[number];
    $title = $row[title];
    $name = $row[name];
    print ("$number: <a href=\"bbs1.php?print_number=$number\">$title : $name</a><br> ");
    }
}

functionは、「関数」の定義宣言です。
ここでは、Show_Titlesという関数を定義しています。
プログラム内から、Show_Titlesという名前で呼び出すと、この関数が実行されます。
Show_Titles関数は、DBより投稿タイトル等の情報を呼び出し、表示します。

ツリー型掲示板を作る ↑項目に戻る
次は、ツリー型掲示板を作りましょう。
ツリー型掲示板は、親記事と子記事の関係をとり、木構造をとります。

以下の内容で、それぞれのファイルを作成してください。

bbs2.php
write2.php
show_contents2.php

試してみる

■解説--------
一つ目のプログラムと変わったのは、記事の親-子関係を記録、表示するようになった事です。
show_contents2.phpは、記事を表示するとともに、その記事に対する子記事を投稿できるようになりました。
write2.phpは、書き込み時に親記事の番号をデータとして持ちます。
bbs2.php のShow_Titles関数は、Show_Itself_And_Call_Children関数を呼び出します。

function Show_Itself_And_Call_Children($number, $indent){
//表示
  if ($number != 0){
    $result = mysql_query("select * from bbs where number=$number");
    $row = mysql_fetch_array($result);
    $title = $row[title];
    $name = $row[name];
    //print("親:[$row[parent_number]]");
    print str_repeat("-",$indent);
    print ("$number: <a href=\"bbs2.php?print_number=$number\">$title : $name</a><br>");
  }
  //子供呼び出し
  $result = mysql_query("select * from bbs where parent_number=$number");
  while ($row=mysql_fetch_array($result)) Show_Itself_And_Call_Children($row[number], $indent+1);
}

Show_Itself_And_Call_Children関数は、記事番号とインデント幅を引数にとり、 記事番号の記事を表示した後、その番号を親記事にもつ記事を呼び出します。
このときに自分自身(Show_Itself_And_Call_Children関数)を 呼び出します。 これを「再帰呼び出し」と呼びます。
プログラムがシンプルに書けるので、とても気に入っています。(私が。)
この再帰呼び出しにより、親子関係が再現され、記事ツリーが生成されます。

掲示板をアレンジする ↑項目に戻る
さらにアレンジし、機能を付け足しましょう。
メール・・・投稿者のメールアドレスを記録
IP・・・投稿者のIPアドレスを記録
日時・・・投稿日時を記録
引用 ・・・記事に子記事を投稿する際に、親記事を引用する

以下の内容で、それぞれのファイルを作成してください。
bbs3.php
write3.php
show_contents3.php

試してみる

デザインとロジックを分離する ↑項目に戻る
掲示板の処理を行う部分と、デザインの部分(HTML)を切り離しましょう
以下の内容で、それぞれのファイルを作成してください。。

メール・・・投稿者のメールアドレスを記録
IP・・・投稿者のIPアドレスを記録
日時・・・投稿日時を記録
引用 ・・・記事に子記事を投稿する際に、親記事を引用する

以下の内容で、それぞれのファイルを作成してください。
bbs4.php
write4.php
show_contents4.php
write4.ihtml
show_contents4.ihtml

試してみる

HTMLの部分は各.ihtmlファイルとして分離しました。
対応しているHTMLエディタ(某DreamWeaver等)を使い各.ihtmlファイルを編集することにより、
簡単にデザインができます。

これにより、デザインはHTMLデザイナが、ロジックはプログラマが行う、というように作業の分離がしやすくなります。
bbs4.phpをさらにbbs4.phpとbbs4.ihtmlに分けても良いでしょう。

大分掲示板らしくなってきましたね。
本サイトの掲示板も、上記のプログラムを少し変更したものを使っています。

さあ、あなたもサイトの掲示板をPHPのものに変更しましょう!
そして友人たちをPHPに洗脳するのです!むんむん!


↑項目に戻る

PHP Top