質問編集履歴

4

コードの追加

2018/04/12 23:25

投稿

kalon
kalon

スコア198

test CHANGED
File without changes
test CHANGED
@@ -123,3 +123,199 @@
123
123
 
124
124
 
125
125
  どうしたら、二重登録されないようになるでしょうか?
126
+
127
+
128
+
129
+ 以下のコードに改変したところ二重登録は防げましたが、同じ物を二重登録したいときにどうしたらよいでしょうか?
130
+
131
+ ```PHP
132
+
133
+ <?php
134
+
135
+ function insertSQL($post){
136
+
137
+ $user = "root";
138
+
139
+ $pass = "root";
140
+
141
+ try{
142
+
143
+ $dbh =new PDO('mysql:host=localhost;dbname=todo;charset=utf8', $user, $pass);
144
+
145
+ $stmt = $dbh->prepare("insert into todo values ('', :post)");
146
+
147
+ #$stmt -> bindParam(':name', $myname, PDO::PARAM_STR);評価語にバインドされる
148
+
149
+ #$stmt -> bindValue(':age', $myage, PDO::PARAM_STR);バインド時に評価される
150
+
151
+ $stmt->bindParam(':post', $post, PDO::PARAM_STR);
152
+
153
+ $stmt-> execute();
154
+
155
+ $stmt = NULL;
156
+
157
+ }catch (PDOException $e){
158
+
159
+ echo $e->getMessage();
160
+
161
+ die();
162
+
163
+ }
164
+
165
+ }
166
+
167
+
168
+
169
+ function selectSQL(){
170
+
171
+ $user = "root";
172
+
173
+ $pass = "root";
174
+
175
+ try{
176
+
177
+ $dbh = new PDO('mysql:host=localhost;dbname=todo;charset=utf8', $user, $pass);
178
+
179
+ $stmt = $dbh->query("select todo from todo");
180
+
181
+ #$todo_list = array();
182
+
183
+ foreach ($stmt as $value) {
184
+
185
+ #$todo_list = "$value[todo]<br>";
186
+
187
+ echo"$value[todo]"."<input type='text' value='<?php echo time() ?>'><br>";
188
+
189
+ }
190
+
191
+ }catch (PDOException $e){
192
+
193
+ echo $e->getMessage();
194
+
195
+ die();
196
+
197
+ }
198
+
199
+ }
200
+
201
+
202
+
203
+ /* トークンをセッションにセット */
204
+
205
+ function setToken() {
206
+
207
+ $token = rtrim(base64_encode(openssl_random_pseudo_bytes(32)),'=');
208
+
209
+ $_SESSION['token'] = $token;
210
+
211
+ }
212
+
213
+
214
+
215
+ /* トークンをセッションから取得 */
216
+
217
+ function checkToken() {
218
+
219
+ if(empty($_SESSION['token']) || ($_SESSION['token'] != $_POST['token'])) {
220
+
221
+ echo 'CSRFの可能性アリ';
222
+
223
+ }
224
+
225
+ }
226
+
227
+
228
+
229
+ /* チェック用関数 */
230
+
231
+ function checkDump() {
232
+
233
+ if (isset($_POST['token'])) {
234
+
235
+ var_dump($_SESSION['token']);
236
+
237
+ var_dump($_POST['token']);
238
+
239
+ }
240
+
241
+ }
242
+
243
+
244
+
245
+ @session_start();
246
+
247
+
248
+
249
+ if ($_SERVER['REQUEST_METHOD'] != 'POST') {
250
+
251
+ setToken();
252
+
253
+ checkDump();
254
+
255
+ if (isset($_POST["submit"])){
256
+
257
+ insertSQL($_POST["user_todo"]);
258
+
259
+ }
260
+
261
+ } else {
262
+
263
+ checkToken();
264
+
265
+ checkDump();
266
+
267
+ }
268
+
269
+
270
+
271
+
272
+
273
+ ?>
274
+
275
+ <!doctype html>
276
+
277
+ <html lang="en">
278
+
279
+ <head>
280
+
281
+ <meta charset="UTF-8">
282
+
283
+ <meta name="viewport"
284
+
285
+ content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
286
+
287
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
288
+
289
+ <title>ToDo List</title>
290
+
291
+ </head>
292
+
293
+ <body>
294
+
295
+ <form action="todo.php" method="post">
296
+
297
+ <input type="text" name="user_todo">
298
+
299
+ <input type="submit" name="submit" value="登録">
300
+
301
+ </form>
302
+
303
+
304
+
305
+ <?php
306
+
307
+
308
+
309
+ selectSQL();
310
+
311
+
312
+
313
+ ?>
314
+
315
+
316
+
317
+ </body>
318
+
319
+ </html>
320
+
321
+ ```

3

コードの修正

2018/04/12 23:25

投稿

kalon
kalon

スコア198

test CHANGED
File without changes
test CHANGED
@@ -17,36 +17,6 @@
17
17
  renshu5.php
18
18
 
19
19
 
20
-
21
-
22
-
23
- <!doctype html>
24
-
25
- <html lang="en">
26
-
27
- <head>
28
-
29
- <meta charset="UTF-8">
30
-
31
- <meta name="viewport"
32
-
33
- content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
34
-
35
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
36
-
37
- <title>ToDo List</title>
38
-
39
- </head>
40
-
41
- <body>
42
-
43
- <form action="renshu5.php" method="post">
44
-
45
- <input type="text" name="user_todo">
46
-
47
- <input type="submit" name="submit" value="登録">
48
-
49
- </form>
50
20
 
51
21
 
52
22
 
@@ -100,6 +70,8 @@
100
70
 
101
71
  insertSQL($_POST["user_todo"]);
102
72
 
73
+ $_POST = NULL;
74
+
103
75
  }
104
76
 
105
77
 
@@ -107,6 +79,38 @@
107
79
  selectSQL();
108
80
 
109
81
  ?>
82
+
83
+ <!doctype html>
84
+
85
+ <html lang="en">
86
+
87
+ <head>
88
+
89
+ <meta charset="UTF-8">
90
+
91
+ <meta name="viewport"
92
+
93
+ content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
94
+
95
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
96
+
97
+ <title>ToDo List</title>
98
+
99
+ </head>
100
+
101
+ <body>
102
+
103
+ <form action="renshu5.php" method="post">
104
+
105
+ <input type="text" name="user_todo">
106
+
107
+ <input type="submit" name="submit" value="登録">
108
+
109
+ </form>
110
+
111
+
112
+
113
+
110
114
 
111
115
 
112
116
 

2

タイトルの変更

2018/04/12 13:20

投稿

kalon
kalon

スコア198

test CHANGED
@@ -1 +1 @@
1
- ページを更新する度にPOSTされたものが登録されてしまう。
1
+ ページを更新(F5)する度にPOSTされたものが登録されてしまう。
test CHANGED
File without changes

1

文章が不完全

2018/04/12 12:51

投稿

kalon
kalon

スコア198

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ただいま独学でPHPを使ってTODOリストを作っています。
4
4
 
5
- 一度「登録」してから、ページを更新すると、入力欄は空にもかかわらず、先ほど登録したものがもう一度登録されてしまいます。
5
+ 一度「登録」してから、ページを更新(F5)すると、入力欄は空にもかかわらず、先ほど登録したものがもう一度登録されてしまいます。
6
6
 
7
7
 
8
8
 
@@ -118,4 +118,4 @@
118
118
 
119
119
 
120
120
 
121
- どうしたら、
121
+ どうしたら、二重登録されないようになるでしょうか?