WebプログラミングU PHP

 目次へ 前へ 次へ

2011/8/22 久米

 

4 掲示板作成

4.1 データベースの作成

最も基本的な情報だけのデータベースを作ります。

  1. phpMyAdminにアクセス
  2. 自分のデータベースを選択
  3. 現在のDBに新しいテーブルを作成します。を実行。
     名前:bbs 、フィールド(列数のこと):4
  4. CREATE TABLE bbs (
    id INT NOT NULL AUTO_INCREMENT ,
    name VARCHAR(32) NOT NULL ,
    message TEXT NOT NULL,
    regidate DATETIME NOT NULL,
    PRIMARY KEY (id)
    ); つまり下記図のように入力すればOK

 

以下phpスクリプトは/web2/bbs/の中に保存

4.2 掲示板表示

  1. どうやって表示したいかをまず考える
  2. select文発行スクリプトを参考にphpファイルを作成する。

 

4.3 掲示板投稿

  1. どうやって投稿させたいかをまず考える
  2. insert文発行スクリプトを参考にphpファイルを作成する。

 

4.4 TIP

投稿時に現在時刻を入れる方法

INSERT文のところで、MySQL関数のnow()関数を使用する

INSERT INTO bbs (name, message, regidate)
VALUES ('$name', '$message', now())

 

読み取る行数を指定方法

MySQLのLIMIT句を使用する

SELECT * FROM bbs LIMIT 0, 30

LIMITの1番目の数字は、読み取る最初の行番号(0が最新の行番号)
2番目の数字は、読み取る件数

 

1枚で投稿と表示を兼ねる方法

自分自身を読み出す方法を使用する

if(isset($_POST['sub'])){
//ここに投稿処理を入れればよい
}

フォームタグは、次のようにしておくと、ファイル名を変えても使えるので便利

<form name="f" method="post" action="<?php print htmlspecialchars($_SERVER['PHP_SELF']); ?>">

 

二重投稿防止方法

1枚で投稿と表示を兼ねる場合、再読み込みで二重投稿されてしまう。
これを避けるには、phpのheader関数を使用する

投稿処理が終了したところでheader関数で、わざわざ自分自身のページへ飛ばせばよい。
投稿処理がなく読み取り処理だけが実行されるので、それを再読み込みしても二重投稿にならない。

if($rst) {
header("Location: http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
exit();
}else {
header('Content-Type: text/plain; charset=UTF-8');//保守中ですを文字化けさせないため
exit("保守中です。しばらくしてから投稿ください。");
}

 

コラム 内部エラーの非表示

インターネットに公開する段階では、内部的なエラーメッセージは表示しないようにしましょう。

例 下記のような内部エラーの表示はセキュリティホールになりうる可能性もあります。
Warning: mysqli_connect(): Can't connect to MySQL server on 'localhost' (10061)
in C:\Program Files\Apache Group\Apache2\htdocs\bbs\board.php on line 6

このようなエラーを表示させないようにするには、下記の1行をスクリプトの最初に書いておけばいいです。

error_reporting(0);

なお、error_reporting(E_ALL); は全てのエラーを表示させる意味で、デフォルトではこの設定になっています。
開発している時は、エラーが表示されたほうがいいので、デフォルトのままにしておきます。