画面表示部分を作成する
まずは、画面に表示される個所を作成していきます。<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="utf-8">
<title>PHP簡易掲示板</title>
</head>
<body>
<h1>PHP簡易掲示板</h1>
<!--ここで投稿内容を送信する-->
<form action="" method="post">
メッセージ:<input type="text" name="message">
ユーザー名:<input type="text" name="user_name">
<input type="submit" name="send_message" value="投稿">
</form>
<h2>投稿一覧</h2>
<ul>
<li><!--ここに投稿が表示される--></li>
</ul>
</body>
</html>
ここまでは、ほぼほぼHTMLの内容ですので理解できると思います。
また。formの送信先はformタグのaction属性で指定しますが、今回は同じファイルに向けて送信を行うため空欄で大丈夫です。
今後の簡単な流れを説明すると、HTMLのformタグで投稿内容を送信し、PHP側で送信された内容を受け取り、再度HTMLで投稿を表示できるように渡してあげるといった流れになります。
投稿内容を受け取る
次は送られてきた投稿内容をPHP側で受け取り編集する箇所を説明していきます。<?php
// ファイルの指定
$dataFile = 'datafile.dat';
//name="send_message"のPOST送信があった時
if(isset($_POST["send_message"])){
//送信されたname="message"とname="user_name"の値を取得する
$message = trim($_POST['message']);
$user = trim($_POST['user_name']);
//messageが空じゃなかったら
if(!empty($message)){
//userが空の場合、名無しにする
if(empty($user)){
$user = "名無し";
}
//日付を取得する
$postDate = date('Y-m-d H:i:s');
//ファイルに書き込むメッセージを作成する
$newData = $message." / ".$user." / ".$postDate."\n";
//ファイルを開く
$fp = fopen($dataFile,'a');
//ファイルに書き込む
fwrite($fp,$newData);
//ファイルを閉じる
fclose($fp);
}
}
?>
<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="utf-8">
<title>PHP簡易掲示板</title>
</head>
<body>
<h1>PHP簡易掲示板</h1>
<!--ここで投稿内容を送信する-->
<form action="" method="post">
メッセージ:<input type="text" name="message">
ユーザー名:<input type="text" name="user_name">
<input type="submit" name="send_message" value="投稿">
</form>
<h2>投稿一覧</h2>
<ul>
<li><!--ここに投稿が表示される--></li>
</ul>
</body>
</html>
まず、データを書き込むファイルを指定しています。
そしてformからデータがpost送信された場合に、メッセージおよびユーザー名を受け取ります。
また、日付も掲示板に表示させたいので、投稿された日付の取得も行います。
その後、指定したファイルに書き込むためのデータを作成し、ファイルを開き・書き込み・ファイルを閉じる作業を行っています。
データを取得し表示させる
<?php
// ファイルの指定
$dataFile = 'datafile.dat';
//エスケープする関数
function h($s){
return htmlspecialchars($s,ENT_QUOTES,'UTF-8');
}
//name="send_message"のPOST送信があった時
if(isset($_POST["send_message"])){
//送信されたname="message"とname="user_name"の値を取得する
$message = trim($_POST['message']);
$user = trim($_POST['user_name']);
//messageが空じゃなかったら
if(!empty($message)){
//userが空の場合、名無しにする
if(empty($user)){
$user = "名無し";
}
//日付を取得する
$postDate = date('Y-m-d H:i:s');
//ファイルに書き込むメッセージを作成する
$newData = $message." / ".$user." / ".$postDate."\n";
//ファイルを開く
$fp = fopen($dataFile,'a');
//ファイルに書き込む
fwrite($fp,$newData);
//ファイルを閉じる
fclose($fp);
}
}
//一行ずつデータを取り出して配列に入れる
$post_list = file($dataFile,FILE_IGNORE_NEW_LINES);
//逆順に並べ替える
$post_list = array_reverse($post_list);
?>
<!DOCTYPE html>
<html>
<head lang="ja">
<meta charset="utf-8">
<title>PHP簡易掲示板</title>
</head>
<body>
<h1>PHP簡易掲示板</h1>
<!--ここで投稿内容を送信する-->
<form action="" method="post">
メッセージ:<input type="text" name="message">
ユーザー名:<input type="text" name="user_name">
<input type="submit" name="send_message" value="投稿">
</form>
<h2>投稿一覧</h2>
<ul>
<!--post_listがある場合-->
<?php if (!empty($post_list)){ ?>
<!--post_listの中身をひとつづつ取り出し表示する-->
<?php foreach ($post_list as $post){ ?>
<li><?php echo h($post); ?></li>
<?php } ?>
<?php }else { ?>
<li>まだ投稿はありません。</li>
<?php } ?>
</ul>
</body>
</html>
まず、データを表示する際のエスケープ処理を独自関数として定義しています。function h($s)の部分です。
また、前回まででファイルにデータを書き込むことができているので、その書き込まれたファイルを取り出し、変数に格納してあげます。
ファイルのデータは昇順になっているので、降順にしたい場合はreverse関数を用いて逆に並べ替えることができます。
その次に、HTML部分でデータの表示を行います。
まず、条件分岐でファイルから取得したpost_listがあるかどうかのif文を書いています。
ある場合はその内容を表示し、ない場合は投稿はありませんというメッセージを表示します。
また、post_listがある場合は、リストとして送られてくるので、foreach文でループ処理を行い、1行ずつ表示してあげます。(先ほど定義したエスケープ処理の関数も使います。)
こんな感じで簡易的ではありますが、掲示板を作成することができます。