制作環境
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>