Help us understand the problem. What is going on with this article?

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。

ソースコード

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>
Charry
2020年の2月位からプログラミングの勉強をはじめた素人です。 オンライン学習サイトでの学習を終えた後、独学でLaravelを勉強中。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away