掲示板プログラムの中核、記事の書き込みを行なうスクリプトです。
<?php require_once('login.php'); require_once('function.php'); $bbs_target = target_set(); $bbs_janame = enname2janame($bbs_target); $myself = './bbs.php?target='.$bbs_target; if($bbs_target == 'history') { $title = 'koi-chan\'s BBS Program 更新履歴'; } else { $title = "掲示板 -${bbs_janame}-"; } ?> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title><?php echo("$title");?></title> <link rel="stylesheet" type="text/css" href="./auth.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./basic.css" media="screen,print" /> <link rel="stylesheet" type="text/css" href="./bbs.css" media="screen,print" /> <?php #ユーザーのアクセス権を取得 if($Auth_data['username'] == 'admin') { if($bbs_target == 'history') { $usermod = 2; } else { #管理者は基本的に読み込みだけ $usermod = 1; } } elseif($bbs_target == 'main') { #mainスレッドはだれでも読み書き可能 $usermod = 2; } else { $result_get_usermod = get_usermod($Auth_data['username'], $bbs_target); if($result_get_usermod[0]) { $usermod = $result_get_usermod[1]; } else { echo 'get_usermod: '.$result_get_usermod[1]; } } if($usermod == 0) { echo '<meta http-equiv="refresh" content="5; ./index.php" />'."\n"; echo '</head><body>'; echo "<div style=\"color: #FF0000\">このスレッドにアクセスする権利を持っていません。5秒後にスレッド選択ページに転送します。</div>\n"; echo '</body></html>'; exit; } ?> </head> <body> <div class="header"> <?php echo($Auth_data['script']); ?> <h2><?php echo("$title");?></h2> </div> <?php if($usermod == 1) { echo "<div style=\"color: #FF0000\">このスレッドに書き込む権利を持っていません。書き込んでも保存されることはありません。</div>\n"; } ?> <!--フォーム--> <table class="form-table"><form method="POST" action="./write.php" accept-charset="utf8"> <tr><th>名前:</th><td><input tabindex=1 type="text" name="user" value="<?php echo($Auth_data['username']); ?>" readonly="readonly" size="50" /></td><td rowspan="2"> <label><input type="checkbox" name="monospace-font" value="true" tabindex=4 />固定幅フォント有効</label><br />アスキーアート入力時にはチェックを入れてください。</td></tr> <tr><th>件名:</th><td><input tabindex=2 type="text" name="sub" size="50" /></td></tr> <tr> <td colspan="2" rowspan="2"><textarea tabindex=3 onkeypress="return (this.calue.length < 16777215)" style="ime-mode:active" cols="50" rows="5" name="data"></textarea></td> <td class="table_notice">最大入力文字数: 全角半角問わず16777215文字<br /><br /> 最新<?php echo($load_max); ?>件のみ表示<br /> <a tabindex=7 href="./readonly.php?target=<?php echo($bbs_target); ?>">全ての投稿を見る(書き込みはできません)</a></td> </tr> <tr><td class="table_notice"> <input type="hidden" name="target" value="<?php echo($bbs_target); ?>" /> <input tabindex=5 class="submit" type="submit" value="書き込む" /> <input tabindex=6 class="submit" type="reset" value="リセット" /> <a tabindex=7 href="<?php echo($myself); ?>">手動更新</a></td></tr> </form></table></div> <div class="footer"> <!--インラインフレーム--> <iframe src="./load.php?target=<?php echo($bbs_target); ?>&load_max=<?php echo($load_max); ?>" width="100%" height="400px"> このページはインラインフレームを使用しています。<br /> インラインフレームに対応したブラウザをご利用ください。<br /> 読むだけなら<a href="./readonly.php?target=<?php echo($bbs_target); ?>" target="_top">インラインフレーム非対応ページ</a>を用意しています。<br /> どうぞご利用ください。<br /> </iframe> </div> </body> </html>
4~11行目
フォームで送られてきた対象スレッドを変数に代入し、日本語名を取得してページのタイトルを作成します。
historyスレッドは特殊なスレッドで、更新履歴などを記録しておきます。これは管理者のみ書き込みが可能で、一般ユーザーは閲覧だけ許されています。
16・53行目
作成したページタイトルをHTMLの必要な部分で出力します。
22~39行目
ユーザーのアクセス権を取得します。変数$usermodに代入している数字がそれです。
0は読み書き不可、1は読み込み可、2は読み書き可です。
管理者であるadminに、historyスレッドのみ書き込み可能、他は書き込み不可、という例外処理を行います。
mainスレッドにも参加者誰でも読み書き可能、という例外処理を行います。
それ以外の通常の処理は認証ユーザー名と対象スレッド名からデータベースに保存されたアクセス権を取得します。
40~46行目
変数$usermodに格納された値を参照し0、つまりアクセス権がない場合、エラーメッセージを出力して終了します。
自動的にページを移動させるため、HTMLの<head>タグを48行目で閉じる前にこのメッセージを出力します。
52行目
Auth.phpが用意するヘッドバーを出力します。
53行目
用意しておいたページタイトルを本文にも出力します。
56~58行目
変数$usermodに格納された値を参照し1、つまりアクセス権が読み込みのみの場合、書き込んでも意味がない旨を出力します。style属性で文字を赤(RGB: #FF0000)にしています。
61~77行目
テーブルで成形したフォームを出力します。本当はスタイルシートで2段組みにしたいのですが、横着をしてしまいました(笑)。そのうちCSSを使った2段組みレイアウトにしたいと思います。
テーブルで成形しながら、Tabキーでそれぞれのフォームパーツを移動できるよう、tabindex属性を使って任意の移動順を指定します。ユーザー名、件名、本文、固定幅フォント、投稿、リセット、READONLYへのリンク、の順になっています。数字の小さいほうから大きいほうにカーソルが動いていきます。
フォームデータはPOSTを使いデータベースへの書き込みを担当するwrite.phpに送信します。GETだと送信データの大きさに制限があるので(POSTにもありますがこれはPHPの設定ファイルを編集すれば変更可能)GETは使いません。
投稿者名はログインに使ったユーザー名で固定とし、フォームデータの内容を変更されないようにロックします。readonly属性は入力されている文字列の選択はできるが変更できないようにする機能を持ちます。
件名は空にして送信するとwrite.phpが自動的に <無題> を補完します。
固定幅フォントは、アスキーアートを投稿するときに使います。指定された記事にだけスタイルシートでmonospaceを指定します。
本文はデータベースに保存できる限界、16777215文字目を入力した時点でエラーが出るようになっています。ただし、コピー&ペーストされた時にはエラーは出ません。400字詰め原稿用紙4万枚以上のデータを入力することはないと思われますが。また、自動的に日本語入力モードに切り替えます。
最近の過去ログを何件表示するかを示します。
全ての過去ログを閲覧するためのリンクには、対象掲示板をGETで指定してやります。
最後に書き込み対象のスレッドを指定し、書き込むボタンとフォームをリセットするボタンを描いて、手動交信用のリンクを作成します。
81~86行目
最新のログを閲覧するためのインラインフレームを作成します。
インラインフレーム非対応ブラウザの利用者のためのメッセージを<iframe>タグの中に記述します。
非対応ブラウザでもフォームは使えるはずなので、読み込み専用ページのリンクを併記しておきます。
Posted in PHPで動く掲示板プログラム |