 |













|
 |





 |
|
Web上では、既に当たり前のものとなっているBBS(掲示板)をPHPで作成してみましょう。BBSには、PHPに関する基本的な技が広く網羅されています。
|
 |
BBSのファイル構成
作成スクリプトファイルと、ログを保存するためのファイルの2つから構成しています。練習用スクリプトなので、PHPの様々な処理を網羅しつつ機能はシンプルにおさえています。細かい機能を付けてしまうと本質以外の説明が長くなってしまいますので、実用的な機能はあまり実装しておりません。
| 適当なディレクトリを作り、2つのファイルを作成 |
| index.php |
BBS本体のスクリプトファイル |
ソースを表示 |
| bbs.log |
ログを保存するファイル (パーミッションを606に設定) |
|
このスクリプトは、フォームの送信後に以下のような処理を行っています。
| フォーム送信時の処理の流れ |
| 送信(投稿) |
|
|
| ↓ |
|
|
| 入力内容のエラーチェック(未入力等) |
NG
→
|
エラー表示(終了) |
| ↓ |
|
|
タグの無効化やデータを
ログ書き込み用に変換 |
|
|
| ↓ |
|
|
| 既存のログを取得 |
|
|
| ↓ |
|
|
クッキーを発行
(再訪問時に名前等が保存されている) |
|
|
| ↓ |
|
|
| ログの保存 |
|
|
| ↓ |
|
|
| スクリプトのデフォルト(送信前)に戻る |
|
|
送信後の流れは、スクリプトの上部に記述しております。スクリプト中ほどにあるHTMLの記述内容から下が、通常の画面表示部分となっております。
このスクリプトの解説
サンプルソースの中に /*----- ※1 -----*/ といったコメントを入れております。以下の説明は、この番号に基づいております。
※1 初期化処理
変数を利用して、ログの最大保存件数と、ログファイル名を指定しています。
最大保存件数は50になっておりますが、サーバーのディスク領域や快適性を考えた上で、自由に設定できます。
また、ログファイル名は、「bbs.log」となっておりますが、この値を変更するれば変更できます。
このように、スクリプト中に頻繁に使われる値や、差し替える可能性の高いものは、スクリプト上部に記述すると便利です。
※2 エラーチェック
フォームから入力された後の処理で、その入力内容に関してエラーがあるかどうかを調べています。「名前」「メールアドレス」「題名」「メッセージ」が未入力だった場合や、各項目にあまりにも長い記述をされた時に、変数$errMsgに代入しています。
※3 投稿内容のログ書きこみ用に最適化・日付の取得
掲示板を運用する際には、セキュリティ上、HTMLのタグを無効にしたり、プログラムの誤動作の原因になるような文字列を排除する必要があります。ここでは、その処理をユーザー定義関数「convString()」によって行っています。
また、投稿日時をdate関数により取得し、ログに書きこむためのデータとして用意しています。
convStringの処理の説明
●stripslashes関数
PHPの設定よって異なりますがは、文字列の中に「"」「'」などが含まれている場合、その文字の前に自動的に「\」が付加えられることがあります。「\"」「\'」のような文字列に含まれている「\」の削除を行います。
●htmlspecialchars関数
タグを無効化する関数です。「"」を「"」や「<」を「<」といったHTML上で特殊な意味を持つ文字列を置換します。
掲示板にタグを書きこめるというのは、意図しない画像やJavaScript等を書き込まれる可能性があるため、好ましくありません。
●ereg_replace関数
正規表現を使用し、「半角のカンマを全角に置換」と「改行を<br>に変換」という処理を行っております。正規表現とは、文字列のパターンを特殊な記号を使って表す方法で、複雑なパターンでも文字列の検索や置換を行うことができます。
「半角のカンマを全角に置換」する理由は、このBBSのログのデータを半角のカンマ区切りで保存しているため、入力文字に半角のカンマを使われると不整合が生じるからです。
また、「改行<br>に変換」する理由は、このログは、投稿記事1つごとに1行ずつ追加されていくものです。そのため、不本意な位置に改行があると、ログの読み込み時に不整合が生じます。また、ユーザーが書き込んだ改行と同じように表示されるように、HTML出力時を考慮して<br>に置換しています。
ここで指定しているパターンである「\n|\r|\r\n|」は、UNIX系、MacOS系、Windows系のいずれかの改行コードを示しています。ユーザーの環境により、どのような改行コードで入力されるかも変わるため、それを考慮しています。
正規表現は非常に奥が深いため、専門書籍や解説サイトもありますので、そちらをご覧ください(当サイトでもいずれ取り扱っていく予定です)。
※4 クッキーを発行
掲示板に投稿をしたことがある方ならお分かりだと思いますが、1度投稿をした後に再びそのサイトを訪問すると、既に入力欄に以前記入した名前などが残っている場合があります。クッキーについての詳しい説明は、クッキーとセッション管理をご覧ください。
※5 ファイルを開く
ログの書き込み処理をする前に、ファイルを開きます。dieはメッセージを出力してスクリプトを終了する関数です。また、fopenの頭に「@」が入っているのは、エラー制御演算子によってPHPのエラーを出力しないようにしているからです。その代わりにオリジナルのエラーメッセージを表示するようにしています。
その他のファイル操作に関してはアクセスカウンターの説明でしております。
※6 ログを1行ずつ取得し、配列に格納
fgets関数で、データを取得しています。この関数は、指定したバイト数か、改行文字が見つかるまでデータを読みこみます。つまり、この関数を1回実行しただけでは、ログを1行しか読みこむことができません。
そのため、while文でループの処理を行うことによって、複数行を取得し1行ずつ配列に格納しています。
※7 ログの最終書き込み番号を取得
このBBSの書き込みには、すべて連番をつけています。また、このBBSはログのフォーマットを
「書き込み番号,書き込み日,書き込み時間,名前,メール,題名,メッセージ,URL」
というカンマ区切りのものにしています。そこで、先程取得したログのデータ(配列)の最新記事にあたるものから、書き込み番号を示す「行の最初の数字」を正規表現によって取得しています。
※8 ログの書き込み
ログの書き込み段階に入ります。ここで、$dateというログのデータが格納されている配列の最初に、今回書き込まれたデータを挿入しています($date[0])
次に上書き処理を行うためにファイルポインタを先頭に置き、forを使ったループ処理にて、全データを保存します。
※9 転送処理
この記述がなくても、このスクリプトは表示や書き込みを問題なく行えますが、その場合は書き込み処理を行った後、ブラウザで再読み込みを行うと同じデータが2重送信されてしまいます。
そのような現象を防ぐために、書き込み処理を行った後、投稿されたデータを消す意味も含めて、あえて元のスクリプト自身に転送しています。
※10 フォームの送信先
フォームの送信先は、このスクリプト自身です。つまり、表示と書き込みの2つの処理を1つのスクリプトにて完結させています。
※11 エラーメッセージの表示
投稿内容にエラーがあった場合、変数$errMsgにエラーメッセージが格納されています。(※2参照) このエラーメッセージが含まれている場合のみ、それを表示し、スクリプトを中断させています。
※12 フォームのHTML
フォームのHTMLの表示です。1度発行したクッキーの情報がデフォルトで入るように記述しています。
※13 書き込み内容の表示
ここでは、fgetcsv関数を使用します。fgets関数で行ごとにデータを取得し、split関数で配列に格納していく方法もありますが、csv状のファイルを取得するには、こちらの方が自動的に配列に格納してくれるので便利です。
また、このBBSでは省略していますが、表示件数に制限を持たせる場合は、この部分を操作します。
オススメ!PHPが使える格安レンタルサーバーのご紹介
| PHPが利用可能で値段が月々833円という格安のレンタルサーバーです。SSHでのアクセスも可能な上、MySQLも使えるので、ちょっとしたデータベース系のサイトの構築も可能です。充実したコントロールパネルや、無制限のPOP3アカウントなど、レンタルサーバーとして基本的な機能も揃っています。 |
 |
| 本格的なWebサイトの運用を考えている方や法人の方には、専用サーバーがお勧めです。専用サーバーとは、1台のサーバーを1人のユーザーのみで運用が出来るサービスで、100人前後で切り分けて利用するレンタルサーバーに比べて安定した運用が可能になります。ページビューが多いサイトや、プログラムを使った高負荷なサイトに最適です。
(2003/06現在) |
|
オススメ!分かりやすいPHP関連書籍を最短24時間でお届け!

|
|
 |