ここからは、いよいよPHPによるプログラムのソースを紹介します。
最初に紹介する処理を何にしようかと思いましたが、 「掲示板作成」の処理にすることにしました。 この処理は、「フォームから入力された値を使って、D/Bにレコードを登録する」という、 掲示板に必要な一連の処理を行っている中では、最も簡単な処理だからです。
「掲示板作成」というのは、その名の通り新規の掲示板を作成する機能です。 前に説明したように、 この掲示板では掲示板をWebから簡単に追加することができます。 掲示板作成機能は、Webから入力された値を元に、 ここで説明したboardテーブルに、 レコードをひとつ追加する機能と言えます。
この機能は管理者しか使わない機能なので、 adminというディレクトリを切ってファイルをそこに配置し、 BASIC認証をかけています。
注意!!
掲示板作成の機能については、使うのはどうせ管理者だけだということで、 エラーチェックなども一部簡略化しています。
しかし、「入力についてきちんとしたエラーチェックを行う」ことは、 Webアプリケーションにおけるセキュリティ対策の基本です ( このへんを参照)。
管理者しか使えないようにしているのでなければ、 入力値のチェックはきちんと行うべきです。
具体的な画面はこんな感じです。
これを実現している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」を指定しています。
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()で実行しています。
たとえば「K.Maebashi's BBS」という名前の掲示板を作ろうとしたとき、 この名前にはシングルクォートが含まれますから、そのままSQLを作って データベースに渡しても、掲示板名中のシングルクォートで文字列が終わってしまい、 うまくいかないように見えます。
が、そこらへんがPHPのよくしたところ ---というかおそらくは初心者向けに割り切ったところで、 PHPでは、GETやPOSTでやってきたデータは、設定によっては、 最初からシングルクォート等の文字が勝手にエスケープされる のです。
うちのプロバイダはこの設定がONになっていたので(個別に外すこともできるようですが)、 D/Bに登録する際はそのままでよい代わりに、 普通に表示しているところ(40行目)では、stripslashes()という関数で 元に戻す必要があります。
なんていうか、データベースに突っ込むのにエスケープが必要なら、 そういう処理はその直前にやりゃいいわけで、 最初から取れてくるものが勝手にエスケープされてる、というのは、 私からすると相当乱暴な仕様に思えるんですがねえ。
もっとも、Webからの入力に対しエスケープを怠ると、 SQL Injectionのような深刻なセキュリティーホールを起こすことがあるから、 安全側に振ったということなのでしょうが…
このあたり、私の認識が間違ってましたらご指摘ください。
現時点でうちの掲示板には、掲示板を作成する機能があっても削除する機能がありません。 それどころか投稿の削除機能すらありません。 どうしてもということなら手でSQLを叩けばいいじゃん、と現状では考えています。
そんなら掲示板の作成も、どうせ管理者しかやらないんだし、 そう頻繁にすることでもない、SQLを手で叩けばいいじゃないか、 と思う人もいるかもしれません。
---が、MySQLがEUCで動いているということは、DOS窓つかってちょちょいと insertしようにも、日本語が化けるのでうまくいかないのです。 そこで今回は、練習も兼ねて、あえて掲示板作成用のPHPを作ってみたというわけです。
このページに対してご意見・ご質問・ご感想等をいただいた場合、 公開することがあります。