掲示板作成処理

「掲示板作成処理」とは

ここからは、いよいよPHPによるプログラムのソースを紹介します。

最初に紹介する処理を何にしようかと思いましたが、 「掲示板作成」の処理にすることにしました。 この処理は、「フォームから入力された値を使って、D/Bにレコードを登録する」という、 掲示板に必要な一連の処理を行っている中では、最も簡単な処理だからです。

「掲示板作成」というのは、その名の通り新規の掲示板を作成する機能です。 前に説明したように、 この掲示板では掲示板をWebから簡単に追加することができます。 掲示板作成機能は、Webから入力された値を元に、 ここで説明したboardテーブルに、 レコードをひとつ追加する機能と言えます。

この機能は管理者しか使わない機能なので、 adminというディレクトリを切ってファイルをそこに配置し、 BASIC認証をかけています。

注意!!

掲示板作成の機能については、使うのはどうせ管理者だけだということで、 エラーチェックなども一部簡略化しています。

しかし、「入力についてきちんとしたエラーチェックを行う」ことは、 Webアプリケーションにおけるセキュリティ対策の基本です ( このへんを参照)。

管理者しか使えないようにしているのでなければ、 入力値のチェックはきちんと行うべきです。

画面とHTMLファイル

具体的な画面はこんな感じです。

これを実現しているHTMLファイルはこんな感じ。

  1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
  3: <link rel="STYLESHEET" TITLE="default" TYPE="text/css" href="./admin.css">
  4: <title>新しい掲示板の作成</title>
  5: </head>
  6: <body>
  7: <form action="newbbs.php" method="POST">
  8: <h1>新しい掲示板の作成</h1>
  9: <div align="center">
 10: <table>
 11: <tr>
 12:   <td>掲示板名</td>
 13:   <td><input type="text" name="boardname" size="30">
 14: </tr>
 15: <tr>
 16:   <td>掲示板ID</td>
 17:   <td><input type="text" name="boardid" size="30">
 18: </tr>
 19: <tr>
 20:   <td>ページあたり表示件数</td>
 21:   <td><input type="text" name="defaultrange" size="30">
 22: </tr>
 23: <tr>
 24:   <td>ページあたり表示件数(インデックス)</td>
 25:   <td><input type="text" name="defaultrangeindex" size="30">
 26: </tr>
 27: <tr>
 28:   <td>ページあたり表示件数(スレッド)</td>
 29:   <td><input type="text" name="defaultrangethread" size="30">
 30: </tr>
 31: <tr>
 32:   <td>開設者ホームページ</td>
 33:   <td><input type="text" name="homepage" size="30">
 34: </tr>
 35: <tr>
 36:   <td>スタイルシート</td>
 37:   <td><input type="text" name="css" size="30" value="./bbs.css">
 38: </tr>
 39: <tr>
 40:   <td>メッセージ表示PHP</td>
 41:   <td><input type="text" name="showmessagephp" size="30" value="./showmessage.php">
 42: </tr>
 43: <tr>
 44: </tr>
 45: </table>
 46: <input type="submit" value="送信">
 47: </div>
 48: </form>
 49: </body>

特に説明するほどのものではないと思いますが、 気をつけることといえば、文字コードがEUCになっていることぐらいでしょうか。 PHPの文字コードの扱いについては ここ あたりが参考になるかと思います。 最近のPHPなら、設定次第でS-JISを使うことができるようです。 が、私が使っているプロバイダでは これといった設定をやってないらしい ということで、結局EUCを使うことになります。 うちのプロバイダではMySQLもEUCで動いているようなので、 全てをEUCで統一するのが結局一番楽です。

7行目の、form要素のaction属性で「newbbs.php」を指定しています。

PHP

newbbs.phpの中身は以下の通りです。

  1: <?php
  2: require '../connect_db.php';
  3: ?>
  4: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  5: <html>
  6: <head>
  7: <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
  8: <link rel="STYLESHEET" TITLE="default" TYPE="text/css" href="./admin.css">
  9: <title>新しい掲示板の作成</title>
 10: </head>
 11: <body>
 12: <?php
 13: if ($_POST["boardname"] == ""
 14:     || $_POST["boardid"] == ""
 15:     || $_POST["defaultrange"] == ""
 16:     || $_POST["defaultrangeindex"] == ""
 17:     || $_POST["defaultrangethread"] == ""
 18:     || $_POST["homepage"] == ""
 19:     || $_POST["css"] == ""
 20:     || $_POST["showmessagephp"] == "" ) {
 21:   die("全ての項目を入力してください");
 22: }
 23: $sql_str = "insert into board (name, boardid, defaultrange, defaultrangeindex, "
 24:            . "defaultrangethread, "
 25:            . "homepage, css, showmessagephp) ";
 26: $sql_str .= sprintf("values ('%s', '%s', %d, %d, %d, '%s', '%s', '%s')",
 27:                     $_POST["boardname"],
 28:                     $_POST["boardid"],
 29:                     $_POST["defaultrange"],
 30:                     $_POST["defaultrangeindex"],
 31:                     $_POST["defaultrangethread"],
 32:                     $_POST["homepage"],
 33:                     $_POST["css"],
 34:                     $_POST["showmessagephp"]);
 35: mysql_query($sql_str, $dbh)
 36:   or die('SQLエラー..'.$sql_str);
 37: ?>
 38: <p>
 39: 掲示板「
 40: <?= htmlspecialchars(stripslashes($_POST["boardname"]))?>
 41: 」の作成が終了しました。
 42: </p>
 43: </body>
 44: </html>

PHPの文法その他については、 日本語公式サイト が参考になると思います。

先頭で「require '../connect_db.php';」としています。 ここで取り込んでいるconnect_db.phpの中身は、以下の通りです。

  1: <?php
  2: $dbh=mysql_connect("localhost", "ユーザ名", 'パスワード')
  3:   or die('I cannot connect to the database because: ' . mysql_error());
  4: mysql_select_db ("データベース名");
  5: ?>

ユーザ名やパスワードは、当然ですが、教えてあげません(^^:

この処理で、MySQLとの接続が取得できます。 あとは、23〜34行目でSQL文を生成し、 35行目のmysql_query()で実行しています。

magic quote

たとえば「K.Maebashi's BBS」という名前の掲示板を作ろうとしたとき、 この名前にはシングルクォートが含まれますから、そのままSQLを作って データベースに渡しても、掲示板名中のシングルクォートで文字列が終わってしまい、 うまくいかないように見えます。

が、そこらへんがPHPのよくしたところ ---というかおそらくは初心者向けに割り切ったところで、 PHPでは、GETやPOSTでやってきたデータは、設定によっては、 最初からシングルクォート等の文字が勝手にエスケープされる のです。

うちのプロバイダはこの設定がONになっていたので(個別に外すこともできるようですが)、 D/Bに登録する際はそのままでよい代わりに、 普通に表示しているところ(40行目)では、stripslashes()という関数で 元に戻す必要があります。

なんていうか、データベースに突っ込むのにエスケープが必要なら、 そういう処理はその直前にやりゃいいわけで、 最初から取れてくるものが勝手にエスケープされてる、というのは、 私からすると相当乱暴な仕様に思えるんですがねえ。

もっとも、Webからの入力に対しエスケープを怠ると、 SQL Injectionのような深刻なセキュリティーホールを起こすことがあるから、 安全側に振ったということなのでしょうが…

このあたり、私の認識が間違ってましたらご指摘ください。

2006/11/29追記:
やはりmagic quoteは「考え方からしてそもそも変なのでOFFにしておくべきだろう」 とその後思い直したので、 こちらに記事を書きました。 参照してください。

そもそもこの機能はどうしても必要だったのか?

現時点でうちの掲示板には、掲示板を作成する機能があっても削除する機能がありません。 それどころか投稿の削除機能すらありません。 どうしてもということなら手でSQLを叩けばいいじゃん、と現状では考えています。

そんなら掲示板の作成も、どうせ管理者しかやらないんだし、 そう頻繁にすることでもない、SQLを手で叩けばいいじゃないか、 と思う人もいるかもしれません。

---が、MySQLがEUCで動いているということは、DOS窓つかってちょちょいと insertしようにも、日本語が化けるのでうまくいかないのです。 そこで今回は、練習も兼ねて、あえて掲示板作成用のPHPを作ってみたというわけです。


ひとつ上のページに戻る | ひとつ前のページ | ひとつ後のページ | トップページに戻る
mailto:PXU00211@nifty.ne.jp

このページに対してご意見・ご質問・ご感想等をいただいた場合、 公開することがあります。