回答編集履歴

1 一部コードが抜けていたのを修正

Tomak

Tomak score 1588

2017/09/09 16:51  投稿

`$count`が未定義なので追記ができていません。
#### $countの定義
- `kadai.txt`の最終行の投稿番号に`+1`した値
- 投稿は「{投稿番号}\t<>\t{名前}\t<>\t{コメント}\t<>\t{投稿時刻}」のフォーマット
`fopen($filename, 'a+')`で「読み/書き」でファイルをオープンしてから、`fseek($fp, -1, SEEK_END)`でカーソル(ファイルポインタ)を最終行に移動して、`fgets($fp)`で最終行を読み込みます。
新規投稿を書き込むときは`fseek()`カーソル(ファイルポインタ)の位置によらず、常に一番最後に追記されます。
HTMLの意味が違うかもしれませんが、下記PHPファイルを`sample.php`として保存してから実行すればそのまま同じディレクトリに`kadai.txt`が保存されるようになっています。  
 
**※セキュリティなどは一切考慮していないのでこのままコピーして何かの本番業務に使用するのは危険です。**  
 
```php
$name = $_POST["name"];
$comment = $_POST["comment"];
$postedAt = date('Y-m-d H:i:s');
$count = 1;
<html>
<head>
   <title>sample</title>
</head>
<body>
   <form action="./sample.php" method="post">
       <table border="1">
       <tr>
           <td>名前</td><td><input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST["name"] : ''; ?>"></td>
       </tr>
       <tr>
           <td>コメント</td><td><input type="text" name="comment" value="<?php echo isset($_POST["comment"]) ? $_POST["comment"] : ''; ?>"></td>
       </tr>
       </table>
       <br>
       <input type="submit" name="create" value="新規投稿">
   </form>
</body>
</html>
<?php  
//投稿管理ファイル
$filename = 'kadai.txt';
$fp = fopen($filename, 'a+');
//最終行から投稿番号取得
fseek($fp, -1, SEEK_END);
$end = fgets($fp);
if (! empty($end)) {
   $end = str_replace(['{','}'], ['',''], $end);
   $end = explode("\t<>\t", $end);
   if (count($end) > 0) {
       $count = intval($end[0]) + 1;   //最新の投稿番号
   }
}
//投稿時間
$postedAt = date('Y-m-d H:i:s');
//投稿番号
$count = 1;
//新規投稿
$newData = "{".$count."}"."\t<>\t". "{".$name."}"."\t<>\t"."{".$comment."}"."\t<>\t"."{".$postedAt."}"."\n";
if (isset($_POST['create'])) {
   if (empty($_POST['name']) || empty($_POST["comment"])) {
       exit();
   }
fwrite($fp, $newData);
fclose($fp);
```
   $name = $_POST["name"];
   $comment = $_POST["comment"];
   //最終行にカーソル(ファイルポインタ)移動
   $offset = -2;
   while (fgetc($fp) !== "\n") {
       fseek($fp, $offset--, SEEK_END);
   }
   //下記でも同じ(最終行にカーソル(ファイルポインタ)移動)
   //for ($offset=-2, fseek($fp, $offset, SEEK_END); fgetc($fp) !== "\n"; $offset--) {
   //   fseek($fp, $offset, SEEK_END);
   //}
   //最終行取得
   $end = fgets($fp);
   if (! empty($end)) {
       $end = str_replace(['{','}'], ['',''], $end);
       $end = explode("\t<>\t", $end);
       if (count($end) > 0) {
           $count = intval($end[0]) + 1;   //最新の投稿番号
       }
   }
   //新規投稿保存フォーマット
   $newData = "{".$count."}"."\t<>\t". "{".$name."}"."\t<>\t"."{".$comment."}"."\t<>\t"."{".$postedAt."}"."\n";
   fwrite($fp, $newData);
   fclose($fp);
}
?>
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る