PHPでのフォーム入力データ処理を試すために、名前と1行の本文のみのチャット風簡易掲示板を作ってみます。
入力フォームとPOSTの処理
今回作る掲示板では、投稿時に「名前」と「本文」を各1行入力します。そこで、その投稿用フォームを以下のようにしてみました。
登録時には、このフォームにhiddenでmode=regという項目を付加し、POSTするようにしましょう。
PHPの方では、まず最初にフォームがPOSTされてきているか(modeにregが設定されているか)確認し、POSTされて来ていたら、登録処理を行います。
登録処理は、nameに入っている名前とbodyに入っている本文をファイルに追記する処理になりますね。POSTされて来た内容は、$_POSTに入ってくるので、$_POST['name']と$_POST['body']に入っている名前と本文の登録処理を行うことになります。ただ、登録する文字列は念のためhtmlspecialchars()で<>を置換してタグを無効化し、サイズが大きすぎるときは登録を中止するようにしました。
記録するファイルの形式は、名前<br>本文\nとし、1行ずつ読み込んでそのまま表示できるようにしておきます。
掲示板の表示
フォームと記録処理ができたら、記録したファイルを読み込んで表示する処理です。といっても、記録時にすでに行単位ではそのまま表示できる形で記録するようにしたので、表示処理は単にファイルから1行ずつ読み込んで出力するだけですが。
ただ、ファイルを書き込み順に全部出すのも芸がないので、表示する行は「最新10件」にしましょう。PHPには「配列の順序逆転」を行うarray_reverse()がありますから、まずfile()でファイルを配列に読み込んで要素の順序を逆転します。続いて、foreach内で配列の各要素を最大10件を表示するようにしました。
フォームと掲示板処理スクリプト |
<form action="chatbbs.php" method="post">
<table border="1" align="center">
<tr><td>お名前:<input type="text" name="name" size="24" maxlength="24"></td></tr>
<tr><td>本文:<input type="text" name="body" size="50" maxlength="50"></td></tr>
<tr><td align="center"><input type="hidden" name="mode" value="reg"><input type="submit" value="登録"></td></tr>
</table>
</form>
<?php
// 登録処理
if ($_POST['mode'] == 'reg' &&
strlen($_POST['name']) > 0 && strlen($_POST['name']) < 25 &&
strlen($_POST['body']) > 0 && strlen($_POST['body']) < 51) {
$name = $_POST['name'];
$body = $_POST['body'];
// <>&を置換
$name = htmlspecialchars($name);
$body = htmlspecialchars($body);
$f = fopen('chatbbs.log', 'a');
// ログファイルに名前と本文記録
fputs($f, "$name<br>$body\n");
fclose($f);
print "<p>書き込みました。</p>\n";
}
// ログファイルの内容を取得
$log = file('chatbbs.log');
// 逆転
$log = array_reverse($log);
$i = 0;
// ログの各行を出力
foreach ($log as $line) {
print $line;
print "<hr>\n";
// 10行に達したら終了
if (++$i == 10) {
break;
}
}
?>
|
スクリプトの実行結果は、以下のようになります。
お名前と本文に適当な文字列を入れ、登録ボタンをクリックしてみてください。
掲示板 |
あああ あああ
卵焼き えふぇ
え えふぇ
たろう みー
テスト名前 テスト本文
あ あ
2 2
あああ ああああああ
za za
あいうえお 本文
|
これで、一通り簡易掲示板の完成です。リロード機能を入れれば、チャットとしても使えそうですね。ただ実際に実用化する際は、文字コードの統一処理やファイルロックなども入れる必要があるでしょう。
|