1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

制作環境

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>
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?