$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
1<html>
2<head>
3 <title>sample</title>
4</head>
5<body>
6 <form action="./sample.php" method="post">
7 <table border="1">
8 <tr>
9 <td>名前</td><td><input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST["name"] : ''; ?>"></td>
10 </tr>
11 <tr>
12 <td>コメント</td><td><input type="text" name="comment" value="<?php echo isset($_POST["comment"]) ? $_POST["comment"] : ''; ?>"></td>
13 </tr>
14 </table>
15 <br>
16 <input type="submit" name="create" value="新規投稿">
17 </form>
18</body>
19</html>
20
21<?php
22//投稿管理ファイル
23$filename = 'kadai.txt';
24$fp = fopen($filename, 'a+');
25
26//投稿時間
27$postedAt = date('Y-m-d H:i:s');
28//投稿番号
29$count = 1;
30
31//新規投稿
32if (isset($_POST['create'])) {
33 if (empty($_POST['name']) || empty($_POST["comment"])) {
34 exit();
35 }
36
37 $name = $_POST["name"];
38 $comment = $_POST["comment"];
39
40 //最終行にカーソル(ファイルポインタ)移動
41 $offset = -2;
42 while (fgetc($fp) !== "\n") {
43 fseek($fp, $offset--, SEEK_END);
44 }
45 //下記でも同じ(最終行にカーソル(ファイルポインタ)移動)
46 //for ($offset=-2, fseek($fp, $offset, SEEK_END); fgetc($fp) !== "\n"; $offset--) {
47 // fseek($fp, $offset, SEEK_END);
48 //}
49
50 //最終行取得
51 $end = fgets($fp);
52
53 if (! empty($end)) {
54 $end = str_replace(['{','}'], ['',''], $end);
55 $end = explode("\t<>\t", $end);
56 if (count($end) > 0) {
57 $count = intval($end[0]) + 1; //最新の投稿番号
58 }
59 }
60
61 //新規投稿保存フォーマット
62 $newData = "{".$count."}"."\t<>\t". "{".$name."}"."\t<>\t"."{".$comment."}"."\t<>\t"."{".$postedAt."}"."\n";
63
64 fwrite($fp, $newData);
65 fclose($fp);
66}
67?>