

### 解決したいこと

<理解できないこと>

「ドットインストール」のサイトを参考に簡易掲示板を作るレッスンを学習していた。  
実際に作成した掲示板で、投稿フォームから送ったメッセージと名前の入力データが、データファイルである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で作る簡易掲示板 - ドットインストール](https://dotinstall.com/lessons/bbs_php_v2/24504)
  * [ドットインストールの簡易掲示板 - teratail](https://teratail.com/questions/21002)
  * [掲示板を作ったが、datファイルに書き込まれない - teratail](https://teratail.com/questions/113439)

### 仮説と検証作業の結果

**仮説**  
ファイル名や入力データがbbs.datに書き込まれる処理を実行するプログラムが間違っていると考えた。

**検証**  
bbs.datというファイル名を確認した。

3行目のコードを確認した。

[code]

    $dataFile = 'bbs.dat';
    
[/code]

52行目のコードを確認した。

[code]

    $fp = fopen($dataFile, 'a');
    
[/code]

61行目のコードを確認した。

[code]

    $posts = file($dataFile, FILE_IGNORE_NEW_LINES);
    
[/code]

**結果**

自分が検証した限りにおいて、ファイル名やプログラムの記述は合っていた。

**全体のソースコード**

[code]

    <?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>
    
[/code]


CC BY-SA 4.0
2019-07-03T16:52:50.193
56360
2019-07-04T02:00:15.527
2019-07-04T02:00:15.527
3060
34608
question
php
PHPで簡易掲示板を作ったが、datファイルに書き込まれない