CodeCamp Webマスターコース PHP 提出課題 ひとこと掲示板

#制作環境
Windows 10
XAMPP
PHP : 7.4.3
Visual Studio Code

#はじめに
この記事はプログラミングをはじめたばかりの素人が、メモするのに利用しています。
内容には誤りがあるかもしれません。

当方は2月から2ヶ月間CodeCampのWebマスターコースを受講しました。
CodeCampは、意向により模範解答などを見ることができません。
※理由は、コードの記述に正解がないからだそうです。

他の人のコードを見る事も参考になると思いますので、つたないコード記述ではありますが、合格をもらったコードを掲載します。

良くも悪くも参考になればと思います。

#課題の内容
####内容
名前とコメントを発信できるシンプルな掲示板を作成する。

####合格ライン
・指定要件が全て満たされていること。
・エラーがなく、分かりやすいソースコードになっていること。

####要件

|範囲|No.|内容|
|:---|:---:|:---|
|管理ページ|1|利用者が名前とコメントを入力し、発言できる。|
|管理ページ|2|利用者の過去の発言内容をテキストファイルで管理する。|
|管理ページ|3|全ての利用者の過去の発言内容を一覧で表示する。一覧には「名前」「コメント」「発言日時」の3つを1行ずつ表示する。|
|管理ページ|4|利用者の名前は最大20文字以内まで発言できる。もし20文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。|
|管理ページ|5|利用者のコメントは最大100文字以内まで発言できる。もし100文字より多くの文字を入力して発言した場合はエラーメッセージを表示し、発言できないようにする。|
|管理ページ|6|利用者の名前とコメントは必ず文字が入力される。もし名前あるいはコメントが未入力で発言した場合はエラーメッセージを表示し、発言できないようにする。|
|ソースコード|7|比較は「===」や「!==」を利用していること|

ファイル名はbbs.php。

#ソースコード

```PHP:bbs.php
<?php
$filename = './comment.txt';    // 読み込むテキストファイル
$date = date('-Y-m-d H:i:s');   // 入力日時
$limit_name = 20;               // 名前の最大入力文字数
$limit_comments = 100;          // コメントの最大入力文字数
$err_msg = [];                  // エラーメッセージ格納用の配列
$data = [];                     // テキストファイルの内容格納用の配列
$my_name;                  // 入力された名前のvalue
$comments;                 // 入力されたコメントのvalue


// 投稿されたかの確認
if ($_SERVER['REQUEST_METHOD'] === 'POST') {


    // 名前が投稿された場合に入力された内容を$my_nameに代入
    if (isset($_POST['my_name']) === TRUE) {
        $my_name = htmlspecialchars($_POST['my_name'], ENT_QUOTES, 'UTF-8');
    }

    // コメントが投稿された場合に入力された内容を$commentsに代入
    if (isset($_POST['comments']) === TRUE) {
        $comments = htmlspecialchars($_POST['comments'], ENT_QUOTES, 'UTF-8');
    }


    // 入力された文字数を確認しエラーメッセージを$err_msg[]に格納
    if (mb_strlen((htmlspecialchars_decode($my_name, ENT_QUOTES))) > $limit_name) {
        $err_msg[] = '名前は20文字以内で入力してください';
    } else if (empty(trim($my_name, " 　\r\n\t\0"))) {
        $err_msg[] =  '名前を入力してください';
    }

    // 入力された文字数を確認しエラーメッセージを$err_msg[]に格納
    if (mb_strlen((htmlspecialchars_decode($comments, ENT_QUOTES))) > $limit_comments) {
        $err_msg[] = 'コメントは100文字以内で入力してください';
    } else if (empty(trim($comments, " 　\r\n\t\0"))) {
        $err_msg[] =  'コメントを入力してください';
    }


    // テキストファイルに書き込む内容を$logに代入
    $log = $my_name . ":\t" . $comments . "\t" . $date . "\n";

    // $err_msg内のエラー数を確認
    if (count($err_msg) === 0) {
        // エラーが無ければテキストファイルを開く
        if (($fp = fopen($filename, 'a')) !== FALSE) {
            // 問題が無ければ書き込みを行う
            if (fwrite($fp, $log) === FALSE) {
                print 'ファイル書き込み失敗: ' . $filename;
            }
            // ファイルを閉じる
            fclose($fp);
        }
    }
}


// ファイルが読み込み可能か確認
if (is_readable($filename) === TRUE) {
    // 問題無ければテキストファイルを開く
    if (($fp = fopen($filename, 'r')) !== FALSE) {
        // テキストの内容を取得し$data[]に格納する
        while (($tmp = fgets($fp)) !== FALSE) {
            $data[] = $tmp;
        }
        // ファイルを閉じる
        fclose($fp);
    } else {
        $data[] = 'ファイルがありません';
    }
    // 更新順になるよう配列の内容を逆にする
    $reverse = array_reverse($data);
}
?>

<!DOCTYPE html>
<html lang="ja">

<head>
    <meta charset="UTF-8">
    <title>ひとこと掲示板</title>
</head>

<body>
    <h1>ひとこと掲示板</h1>

    <ul>
        <!-- エラーメッセージを表示 -->
        <?php foreach ($err_msg as $value) { ?>
            <li><?php print $value; ?></li>
        <?php } ?>
    </ul>

    <form action="bbs.php" method="POST">
        名前: <input type="text" name="my_name" size="20">
        コメント: <input type="text" name="comments" size="100">
        <input type="submit" name="send" value="送信">
    </form>
    <br>
    <ul>
        <!-- 投稿履歴を表示 -->
        <?php foreach ($reverse as $line) { ?>
            <li><?php print $line; ?></li>
        <?php } ?>
</body>

</html>
```