PHPで掲示板を作る

#はじめに
プログラミングに興味があったのでudemyでweb開発のコースを購入し、3日間ぐらいハンズオンで勉強したのでとりあえず掲示板を作ってみようと思い、せっかくなので記事としてもアウトプットしようと思い立ちました。
私の初めてのプログラミングなので優しい方ご教授いただければ幸いです。m(_ _)m

#環境
PHP 7.2.1
MAMP 
参考サイト
https://dotinstall.com/lessons/bbs_php_v2

#作業
#####1.MAMPのhtdocsにphpファイルの作成
#####2.HTMLで画面の作成
<img width="366" alt="index.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/b7a6ce3f-d9ac-1081-3321-b9356713e1fe.jpeg">
ローカル環境で表示すると
<img width="389" alt="bbs.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/c01e5a60-2e1c-5624-ea7f-a0a0aecfef94.jpeg">

はい、そのままです。

#####3.htdocsにデータファイル(bbs.dat)の作成
#####4.phpで実装
<img width="320" alt="index1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/db14688a-e070-86c0-dc44-1fd500a02476.jpeg">
<img width="320" alt="index2.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/c0d6cff1-1b76-5b72-758b-2859201ccd12.jpeg">

実装したはいいもののPHPの文法が全くわからないので順番にみていきます。

・`$`は変数。

・`$_SERVER['REQUEST_METHOD']`はページにアクセスする際に使用されたリクエストのメソッド名で'GET', 'HEAD', 'POST', 'PUT' などがある

・`$_POST`はスーパーグローバル変数(なんやそれ？なんかすごそうな変数やな。連想配列ってなんやって感じ)

・`\t`と`\n`はタブと改行(なんで必要なんや？？)

・`fopen($dataFile, 'a')`　はfopen 関数でファイルを開く。引数に「開きたいファイル」と「モード」をそれぞれ指定する。モードにはそれぞれ'a','r','w'があり追記、読み込み、書き込みモードを指す。

・`fwrite($fp, $newData)` はファイルをバイナリ・モードで書き込む。(つまり`$fp`に`$newData`を書き込むということね)

・ `fclose($fp);` fopenとセット。開けたら閉じる。じゃないと親に怒られるぞ

・formタグのaction属性はフォームの送信ボタンを押して送信されるデータの送信先を指定する。

・method属性は送信するときの転送方法を指定する。

なおpostとgetがあり、postは入力したフォーム内容はURLとは別の場所に保管されてデータが送信される。安全的な？
getは入力したフォーム内容のデータがURLにくっついて送信される。google的な？

#####5.書き込みできるか確認
<img width="397" alt="bbs1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/f3a4826f-7515-25fc-56ef-36d674b1249d.jpeg">

すると、、、表示されない。しかしbbs.datファイルをみると
<img width="194" alt="data.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/1d9cc181-7e1a-8fe8-2932-a09e9fcf2d2d.jpeg">
ちゃんと書き込みされていました。

#####6.さらに編集
<img width="378" alt="index3.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/fe1e71fd-8af7-8628-054d-6fe82408442e.jpeg">

・isset　は変数がセットされていること、そして NULL でないことを検査する関数。

・trim　はトリミング。例えば「顔をトリミングしたい」って時に使う。

・ `if($message !== '')`　はメッセージが空でない場合、という意味

・ `$user = ($user === '') ? 'anonymous' : $user;`　これ意味は分かるんですけどなんていう文法？関数？ですか。教えてください。

#####7.時刻を表示
<img width="451" alt="index4.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/b4be1b8c-bd5b-b085-3f8d-095191e42de5.jpeg">

・`date_default_timezone_set('Asia/Tokyo');` は現在の時刻を取得。

・ `$postedAt = date('Y-m-d H:i:s');`　date関数を使って格納。

・ `"\t"`. `$postedAt`. を加えることで掲示板に時刻を表示

ちなみに
・`str_replace`　はタブをどうのこうの～という感じでわかりません。ちゃんちゃん

なにはともあれ
<img width="272" alt="data1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/29017329-16b4-d5c4-2511-65d77d359c78.jpeg">
datファイルには時刻がきちんと表示されました。

#####8.投稿データを表示する
<img width="448" alt="index5.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/8d5d0aef-76ae-b9db-8b48-09ac0318ff5f.jpeg">
・function はユーザー定義関数というもので好きなように自分で関数を定義できる（あってる？）

・`htmlspecialchars($s, ENT_QUOTES, 'UTF-8')`は特殊文字を HTML エンティティに変換する。らしい、、、

・`ENT_QUOTES`はダブルクォート、シングルクォートの両方を変換する。らしい、、、

つまりこのコードは、`htmlspecialchars`関数を使って`$s`にUTF-8のダブルクォート、シングルクォートの両方を変換する処理を格納してるということ？
それを`h()`で呼び出すということであってますか先生？教えてください。

（続き）
<img width="679" alt="index6.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/320494/863cd398-e830-e040-0044-fd845efb6806.jpeg">
・file() はファイル全体を読み込んで配列に格納する関数。

・`FILE_IGNORE_NEW_LINES`は配列の各要素の最後に改行文字を追加しない。（なにこれ。なくていいんじゃないの？）

・`<?php foreach($posts as $post) : ?>`　は配列を反復処理するための関数。foreach が使えるのは配列とオブジェクトだけであり、 別のデータ型や初期化前の変数に対して使うとエラーになる。

ここでは`$posts`に入れた配列を`$post`として実行するということ。

・`<?php list($message, $user, $postedAt) = explode("\t", $post); ?>`
list()関数： 配列と同様の形式で、複数の変数への代入を行う
explode()関数：文字列を文字列により分割する

`$post`の中にある`list()`が受け取る各変数に含まれるタブをexplode()関数を使って分割する。ということでおｋ？

・`<?php echo h($message); ?>(<?php echo h($user); ?>)-<?php echo h($postedAt); ?>` このh()って結局どういう意味をもってるの？

##おわり