シンプルな掲示板作成
目的
機能をシンプルにしてPHPの基礎をしっかりみにつける
自分のHPにも活用する
コードの1行1行をしっかり理解する
メッセージデータを受け取る
var_dump($_POST);
$_POSTにデータが代入されると次のように表示される。
array(3) { ["view_name"]=> string(6) "太郎" ["message"]=> string(27) "おいしかったです。" ["btn_submit"]=> string(12) "書き込む" }
データが渡された確認する
if(!empty($_POST['btn_submit']))
入力したデータが「ある」→メッセージを書き込む
入力したデータが「ない」→掲示板を表示する
empty関数は変数が空であればtrueを返す関数
今回は「空じゃなければtrue」にしたいので関数の前に「!」をつける。
受けっとったデータをファイルに保存する
メッセージを保存するファイルは「message.txt」として設置する。
//メッセージを保存するファイルのパス設定define('FILENAME','./message.txt');
変更することがないので定数を使用する。
defineは閲覧者に表示するメッセージなどを定義するときに便利。
PHPから「message.txt」にアクセスして、受け取ったデータを書き込む
fopen関数を使用してファイルにアクセスする。
if($file_handle=fopen(FILENAME,"a"))
1つ目のパラメータはファイル名を含めたパスを指定する。
(今回defineで宣言した「FILENAME」)
2つ目のパラメータは
ファイルを読み書き(入出力)するのに必要な情報で
「ファイルポンターリソース」と呼ばれる
読み込みだけを行うなら「r」、
書き込みを行うなら「w」「a」がある。
「w」はファイル内容を一旦リセットして書き込む。
「a」は末端から追記する形で書き込む。
今回は「a」を選択。
ファイルを開くと「$file_handle」に「ファイルポインターリソース」と呼ばれるファイルへアクセス情報が代入される。
「ファイルポンターリソース」とは
ファイルを読み書き(入出力)するのに必要な情報のことで、
アクセスするファイルの目印、位置
今回では「a」のことだと思う。
この段階で実行すると「msessage.txt」が作成される。
開いたファイルにデータを書き込む
//タイムゾーン設定date_default_timezone_set('Asia/Tokyo');
date_default_timezone_set関数は、メッセージが投稿された時間を日本のタイムゾーンで取得して書き込むために実行している。
//書き込み日時を取得$now_date=date("Y-m-d H:i:s");
メッセージを書き込まれた日時を取得して「$now_date」に代入する。
ファイルに書き込むデータを作成します。
'太郎','おいしかったです。','2020-05-12 10:58:08'
の形式で書き込む。
//書き込むデータを作成$data="'".$_POST['view_name']."','".$_POST['message']."','".$now_date."'\n";
それぞれのテキストを「’(シングルクォーテーション)」で囲み、「表示名」「メッセージ」「投稿日時」をそれぞれ「,(コンマ)」で区切る。
「\n(改行)」で区切る。
途中の「.(ドット)」は文字列連結子と呼ばれるもので、前後の文字列をくっつける役割を持つ。
fwrite関数でファイルへ書き込み
//書き込みfwrite($file_handle,$data);
「fwrite」関数でファイルへの書き込みを行う。
書き込み対象となるファイルを判別するために
1つ目のパラメータに「file_handle」これはfopen関数で指定した「ファイル名を含めたパス」と「ファイルポンターリソース」
2つ目のパラメータは書き込むデータを作成した際の
「$_data」を指定することで、先ほど作成したデータが「message.txt」に追記保存される。
メッセージは新しいものをファイルの未尾にどんどん追記するため、上から古い順に並ぶ。(fopen関数で「a」を指定してる)
'太郎','おいしかったです。','2020-05-12 11:56:14'
'次郎','まずかった','2020-05-12 11:56:41'
ファイルからデータを読み込んで、掲示板にメッセージを表示しする
メッセージのデータをファイルから取得する
fopen関数を使用してファイルにアクセスします。
if($file_handle=fopen(FILENAME,"r"))
今回は読み込みなのでパラメータは「r」にする。
while文の条件式の中で「fgets」関数を呼び出す。
while($data=fgets($file_handle))
コードをを実行すると、「message.txt」のデータが読み込まれて次のように表示される。
「fgets関数」とはファイルから1行ずつデータを取得する関数
fgets関数は1度実行して1行読み込むと、ファイルポインターリソースの位置はそのたびに更新され、ファイルが終わるまで1行づつデータを読み込むとができる。(while文を使用)
読み込んだデータを配列に格納する
$split_data=preg_split('/\'/',$data);var_dump($split_data);
「preg_split関数」は文字列を特定の文字で分割する関数。
実行すると
array(7) { [0]=> string(0) "" [1]=> string(6) "太郎" [2]=> string(1) "," [3]=> string(27) "おいしかったです。" [4]=> string(1) "," [5]=> string(19) "2020-05-12 11:56:14" [6]=> string(1) " " } '太郎','おいしかったです。','2020-05-12 11:56:14'
👆
読み込まれたデータは配列に分割されます。
分かりやすく整理
array(7) {
[0]=> string(0) ""
[1]=> string(6) "太郎"
[2]=> string(1) ","
[3]=> string(27) "おいしかったです。"
[4]=> string(1) ","
[5]=> string(19) "2020-05-12 11:56:14"
[6]=> string(1) " "
}
表示名[1]、メッセージ[3]、投稿日時[5]
からアクセスできることがわかる。
$messageに連想配列の形で取得したデータを格納する。
$message=array('view_name'=>$split_data[1],'message'=>$split_data[3],'post_date'=>$split_data[5]);var_dump($message);echo"<br>";
👆実行すると
array(3) { ["view_name"]=> string(6) "太郎" ["message"]=> string(27) "おいしかったです。" ["post_date"]=> string(19) "2020-05-12 11:56:14" }
分かりやすく整理
array(3) {
["view_name"]=> string(6) "太郎"
["message"]=> string(27) "おいしかったです。"
["post_date"]=> string(19) "2020-05-12 11:56:14"
}
message_arrayにmessageごと格納します。
array_unshift($message_array,$message);
👆
この操作を投稿されたメッセージの数だけ繰り返すと、$message_arrayに全てのメッセージのデータが入る。
らしい・・・??
HTMLにメッセージを出力する
つづく