PHPで簡易掲示板を作ったが、datファイルに書き込まれない
解決したいこと
<理解できないこと>
「ドットインストール」のサイトを参考に簡易掲示板を作るレッスンを学習していた。
実際に作成した掲示板で、投稿フォームから送ったメッセージと名前の入力データが、データファイルであるbbs.datに書き込まれないという問題が発生している。
動画
https://gyazo.com/6eff4c24a9d4c1d5a90969de3b8a12fb
しかし、自分では、解決することができなかった。
どのようにすれば、入力データがbbs.datに書き込まれるようになるでしょうか?
<理解できること>
bbs.datは、index.phpと同じディレクトリに作成したこと。また、パーミッションの設定においても、書き込みが誰でもできるように設定している。
動画
https://gyazo.com/030eb1f12b2181d4cccc1ddc46abc1f2
teratailに自分と同じ問題が発生した方の質問に対する回答を参考にしたが、解決できなかった。
https://teratail.com/questions/113439
自力で調べた内容
Google検索キーワード:
「ドットインストール dataファイル 書き込まれない」
- #04 エラーチェックをしていこう | PHPで作る簡易掲示板 - ドットインストール
- ドットインストールの簡易掲示板 - teratail
- 掲示板を作ったが、datファイルに書き込まれない - teratail
仮説と検証作業の結果
仮説
ファイル名や入力データがbbs.datに書き込まれる処理を実行するプログラムが間違っていると考えた。
検証
bbs.datというファイル名を確認した。
3行目のコードを確認した。
$dataFile = 'bbs.dat';
52行目のコードを確認した。
$fp = fopen($dataFile, 'a');
61行目のコードを確認した。
$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
結果
自分が検証した限りにおいて、ファイル名やプログラムの記述は合っていた。
全体のソースコード
<?php
$dataFile = 'bbs.dat';
session_start();
function setToken() {
$token = sha1(uniqid(mt_rand(), true));
$_SESSION['token'] = $token;
}
function checkToken() {
if (empty($_SESSION['token']) || $_SESSION['token'] != $_POST['token']) {
echo "不正なPOSTをが行われました";
exit;
}
}
function h($s) {
return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
function redirect() {
header('Location: http://' .$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
exit;
}
if ($_SERVER['REQUEST_METHOD'] == 'POST' &&
isset($_POST['message']) &&
isset($_POST['user'])) {
checkToken(); //投稿された後
$message = trim($_POST['message']);
$user = trim($_POST['user']);
if ($message !== '') {
$user = ($user === '') ? 'ななしさん' : $user;
$message = str_replace("\t", ' ', $message);
$user = str_replace("\t", ' ', $user);
$postedAt = date('Y-m-d H:i:s');
$newData = $message . "\t" . $user . "\t" . $postedAt . "\n";
$fp = fopen($dataFile, 'a');
fwrite($fp, $newData);
fclose($fp);
}
redirect();
} else {
setToken();
}
$posts = file($dataFile, FILE_IGNORE_NEW_LINES);
$posts = array_reverse($posts);
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>簡易掲示板</title>
</head>
<body>
<h1>簡易掲示板</h1>
<form action="" method="post">
message:<input type="text" name="message" >
user:<input type="text" name="user" >
<input type="submit" value="投稿" >
<input type="hidden" name="token" value="<?php echo ($_SESSION['token']); ?>" >
</form>
<h2>投稿一覧(<?php echo count($posts); ?>件)</h2>
<ul>
<?php if(count($posts)) : ?>
<?php foreach ($posts as $post) : ?>
<?php list($message, $user, $postedAt) = explode("\t", $post); ?>
<li><?php echo h($message); ?><?php echo h($user); ?><?php echo h($postedAt); ?> </li>
<?php endforeach; ?>
<?php else : ?>
<li>まだ投稿はありません。</li>
<?php endif; ?>
</ul>
</body>
</html>