teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

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

2017/09/09 07:51

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -9,31 +9,76 @@
9
9
 
10
10
  新規投稿を書き込むときは`fseek()`カーソル(ファイルポインタ)の位置によらず、常に一番最後に追記されます。
11
11
 
12
+ HTMLの意味が違うかもしれませんが、下記PHPファイルを`sample.php`として保存してから実行すればそのまま同じディレクトリに`kadai.txt`が保存されるようになっています。
13
+
14
+ **※セキュリティなどは一切考慮していないのでこのままコピーして何かの本番業務に使用するのは危険です。**
15
+
12
16
  ```php
17
+ <html>
18
+ <head>
19
+ <title>sample</title>
20
+ </head>
21
+ <body>
22
+ <form action="./sample.php" method="post">
13
- $name = $_POST["name"];
23
+ <table border="1">
14
- $comment = $_POST["comment"];
15
- $postedAt = date('Y-m-d H:i:s');
16
- $count = 1;
24
+ <tr>
25
+ <td>名前</td><td><input type="text" name="name" value="<?php echo isset($_POST['name']) ? $_POST["name"] : ''; ?>"></td>
26
+ </tr>
27
+ <tr>
28
+ <td>コメント</td><td><input type="text" name="comment" value="<?php echo isset($_POST["comment"]) ? $_POST["comment"] : ''; ?>"></td>
29
+ </tr>
30
+ </table>
31
+ <br>
32
+ <input type="submit" name="create" value="新規投稿">
33
+ </form>
34
+ </body>
35
+ </html>
17
36
 
37
+ <?php
18
38
  //投稿管理ファイル
19
39
  $filename = 'kadai.txt';
20
40
  $fp = fopen($filename, 'a+');
21
41
 
42
+ //投稿時間
43
+ $postedAt = date('Y-m-d H:i:s');
22
- //最終行から投稿番号取得
44
+ //投稿番号
23
- fseek($fp, -1, SEEK_END);
24
- $end = fgets($fp);
45
+ $count = 1;
25
46
 
26
- if (! empty($end)) {
47
+ //新規投稿
27
- $end = str_replace(['{','}'], ['',''], $end);
28
- $end = explode("\t<>\t", $end);
29
- if (count($end) > 0) {
48
+ if (isset($_POST['create'])) {
30
- $count = intval($end[0]) + 1; //最新の投稿番号
49
+ if (empty($_POST['name']) || empty($_POST["comment"])) {
50
+ exit();
31
51
  }
32
- }
33
52
 
34
- //新規投稿
53
+ $name = $_POST["name"];
35
- $newData = "{".$count."}"."\t<>\t". "{".$name."}"."\t<>\t"."{".$comment."}"."\t<>\t"."{".$postedAt."}"."\n";
54
+ $comment = $_POST["comment"];
36
55
 
56
+ //最終行にカーソル(ファイルポインタ)移動
57
+ $offset = -2;
58
+ while (fgetc($fp) !== "\n") {
59
+ fseek($fp, $offset--, SEEK_END);
60
+ }
61
+ //下記でも同じ(最終行にカーソル(ファイルポインタ)移動)
62
+ //for ($offset=-2, fseek($fp, $offset, SEEK_END); fgetc($fp) !== "\n"; $offset--) {
63
+ // fseek($fp, $offset, SEEK_END);
64
+ //}
65
+
66
+ //最終行取得
67
+ $end = fgets($fp);
68
+
69
+ if (! empty($end)) {
70
+ $end = str_replace(['{','}'], ['',''], $end);
71
+ $end = explode("\t<>\t", $end);
72
+ if (count($end) > 0) {
73
+ $count = intval($end[0]) + 1; //最新の投稿番号
74
+ }
75
+ }
76
+
77
+ //新規投稿保存フォーマット
78
+ $newData = "{".$count."}"."\t<>\t". "{".$name."}"."\t<>\t"."{".$comment."}"."\t<>\t"."{".$postedAt."}"."\n";
79
+
37
- fwrite($fp, $newData);
80
+ fwrite($fp, $newData);
38
- fclose($fp);
81
+ fclose($fp);
82
+ }
83
+ ?>
39
- ```
84
+ ```