質問編集履歴

3

「解除」をつけ忘れたことと、コメントアウトの場所の変更

2021/07/22 08:48

投稿

tamanikuru
tamanikuru

score31

test CHANGED
File without changes
test CHANGED
@@ -248,12 +248,12 @@
248
248
 
249
249
  $data = $data."<p>".$contents."</p>\r\n";
250
250
 
251
+ // ファイルへ書き込み開始
252
+
251
253
  $keijban_file = 'keiji_all.txt';
252
254
 
253
255
  $fp = fopen($keijban_file, 'ab');
254
256
 
255
- // ファイルへ書き込み
256
-
257
257
  if ($fp){
258
258
 
259
259
  if (flock($fp, LOCK_EX)){
@@ -266,7 +266,7 @@
266
266
 
267
267
  }
268
268
 
269
- // ファイルロック
269
+ // ファイルロック解除
270
270
 
271
271
  flock($fp, LOCK_UN);
272
272
 

2

不要な情報を消し、コードの全文を載せました。

2021/07/22 08:48

投稿

tamanikuru
tamanikuru

score31

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
 
18
18
 
19
- ### コード(一部分を抜粋)
19
+ ### コード
20
20
 
21
21
 
22
22
 
@@ -26,20 +26,274 @@
26
26
 
27
27
 
28
28
 
29
-
30
-
31
29
  <?php
32
30
 
31
+ // recaptchaを使うので、試してみるために組んでいます。
32
+
33
+ // よって、使わない部分が多いです。
34
+
35
+ // ほぼ確認用のコードです。
36
+
37
+ require '../recaptcha/recaptcha_vars.php';
38
+
39
+ // サイトキー
40
+
41
+ $siteKey = V2_SITEKEY;
42
+
43
+ // シークレットキー
44
+
45
+ $secretKey = V2_SECRETKEY;
46
+
47
+ $result_status = ''; // 結果を初期化
48
+
49
+ if ( isset( $_POST[ 'g-recaptcha-response' ] ) ) {
50
+
51
+ //GoogleのAPIを指定
52
+
53
+ $url = 'https://www.google.com/recaptcha/api/siteverify';
54
+
55
+ //パラメータを指定
56
+
57
+ $data = array(
58
+
59
+ 'secret' => $secretKey,
60
+
61
+ 'response' => $_POST[ 'g-recaptcha-response' ]
62
+
63
+ );
64
+
65
+ //POST メソッドを使用
66
+
33
- echo <<<html
67
+ $context = array(
34
-
68
+
35
- (中略)
69
+ 'http' => array(
70
+
36
-
71
+ 'method' => 'POST',
72
+
37
- <button id=“send” type="submit" disabled name="btn1_toukou" value="投稿!!" class=“button” onclick="location.href='掲示板のURL'">
73
+ 'header' => implode("\r\n", array('Content-Type: application/x-www-form-urlencoded',)),
74
+
38
-
75
+ 'content' => http_build_query($data)
76
+
39
- (中略)
77
+ )
78
+
79
+ );
80
+
81
+ //設定したパラメータからAPIを使って取得する
82
+
83
+ $api_response = file_get_contents($url, false, stream_context_create($context));
84
+
85
+ $result = json_decode( $api_response );
86
+
87
+ if ( $result->success ) {
88
+
89
+ $result_status = '成功しました';
90
+
91
+ //デバッグ用。使わないのでコメントアウト。
92
+
93
+ //$re = 'OK';
94
+
95
+ } else {
96
+
97
+ $result_status = '失敗しました。: ';
98
+
99
+ $result_status .= $result->{'error-codes'}[ 0 ];
100
+
101
+ //デバッグ用。使わないのでコメントアウト。
102
+
103
+ //$re = 'NG';
104
+
105
+ }
106
+
107
+ }
108
+
109
+ print($re);
40
110
 
41
111
  ?>
42
112
 
113
+ <html>
114
+
115
+ <script>
116
+
117
+ var onloadCallback = function() {
118
+
119
+ grecaptcha.render('recaptcha', {
120
+
121
+ 'sitekey' : "<?php echo $siteKey; ?>",
122
+
123
+ 'callback' : verifyCallback,
124
+
125
+ 'expired-callback' : expiredCallback
126
+
127
+ });
128
+
129
+ };
130
+
131
+ var verifyCallback = function(response) {
132
+
133
+ document.getElementById("warning").textContent = '';
134
+
135
+ document.getElementById("send").disabled = false;
136
+
137
+ };
138
+
139
+ var expiredCallback = function() {
140
+
141
+ document.getElementById("warning").textContent = '投稿するにはチェックを入れてください。';
142
+
143
+ document.getElementById("send").disabled = true;
144
+
145
+ };
146
+
147
+ </script>
148
+
149
+ </head>
150
+
151
+ <head>
152
+
153
+ <link rel="icon" type="image/png" href="../icon.png">
154
+
155
+ <title>掲示板</title></head>
156
+
157
+ <body>
158
+
159
+ <body bgcolor="#181a19" text="#cccccc" alink="#ffffff">
160
+
161
+ <p><h1>掲示板</h1></p><br>
162
+
163
+ <a href="https://***.**/">***.**(トップページ)</a><br>
164
+
165
+ <p>テスト的な意味もありますが、ちょっと作ってみました。</p>
166
+
167
+ 削除・変更の依頼は<a href="./delete.php" target="_blank">こちら</a>から
168
+
169
+ <form method="POST" action="<?php print($_SERVER['PHP_SELF']) ?>">
170
+
171
+ <input type="text" name="personal_name"><br><br>
172
+
173
+ <textarea name="contents" rows="8" cols="40"></textarea><br><br>
174
+
175
+ <div id="recaptcha"></div>
176
+
177
+ <p id="warning">投稿するにはチェックを入れてください。</p>
178
+
179
+ <input id="send" type="submit" name="btn1" class="btn btn-primary" disabled value="投稿!!" onclick="location.href='***.**/keiji/keiji_all.php'">
180
+
181
+ </form>
182
+
183
+ <?php
184
+
185
+ if($_SERVER["REQUEST_METHOD"] == "POST"){
186
+
187
+ writeData();
188
+
189
+ }
190
+
191
+ // ファイルを読み込んで表示
192
+
193
+ readData();
194
+
195
+ function readData(){
196
+
197
+ $keijban_file = 'keiji_all.txt';
198
+
199
+ $fp = fopen($keijban_file, 'rb');
200
+
201
+ if ($fp){
202
+
203
+ // ファイルロック
204
+
205
+ if (flock($fp, LOCK_SH)){
206
+
207
+ while (!feof($fp)) {
208
+
209
+ $buffer = fgets($fp);
210
+
211
+ print($buffer);
212
+
213
+ }
214
+
215
+ flock($fp, LOCK_UN);
216
+
217
+ }else{
218
+
219
+ // できないなら
220
+
221
+ print('ファイルロックに失敗しました');
222
+
223
+ print('何度も失敗する場合は知らせてください。');
224
+
225
+ }
226
+
227
+ }
228
+
229
+ fclose($fp);
230
+
231
+ }
232
+
233
+ function writeData(){
234
+
235
+ $personal_name = $_POST['personal_name'];
236
+
237
+ $contents = $_POST['contents'];
238
+
239
+ $contents = nl2br($contents);
240
+
241
+ // HTMLの構成
242
+
243
+ $data = "<hr>\r\n";
244
+
245
+ $data = $data."<p>投稿者:".$personal_name."</p>\r\n";
246
+
247
+ $data = $data."<p>内容:</p>\r\n";
248
+
249
+ $data = $data."<p>".$contents."</p>\r\n";
250
+
251
+ $keijban_file = 'keiji_all.txt';
252
+
253
+ $fp = fopen($keijban_file, 'ab');
254
+
255
+ // ファイルへ書き込み
256
+
257
+ if ($fp){
258
+
259
+ if (flock($fp, LOCK_EX)){
260
+
261
+ if (fwrite($fp, $data) === FALSE){
262
+
263
+ print('ファイル書き込みに失敗しました');
264
+
265
+ print('何度も失敗する場合は知らせてください。');
266
+
267
+ }
268
+
269
+ // ファイルロック
270
+
271
+ flock($fp, LOCK_UN);
272
+
273
+ }else{
274
+
275
+ print('ファイルロックに失敗しました');
276
+
277
+ print('何度も失敗する場合は知らせてください。');
278
+
279
+ }
280
+
281
+ }
282
+
283
+ fclose($fp);
284
+
285
+ }
286
+
287
+ ?>
288
+
289
+ </body>
290
+
291
+ <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
292
+
293
+ </html>
294
+
295
+
296
+
43
297
  ```
44
298
 
45
299
 
@@ -66,4 +320,4 @@
66
320
 
67
321
  PHPバージョンはPHP7.3です。
68
322
 
69
- windows 10のIE8、edgeを使って検証後、windows XPのIE6でも検証
323
+ windows 10のedgeを使って検証しました

1

質問文の日本語がわかりにくかったので手直ししました。

2021/07/22 08:36

投稿

tamanikuru
tamanikuru

score31

test CHANGED
File without changes
test CHANGED
@@ -6,11 +6,11 @@
6
6
 
7
7
  投稿ボタンを押した後リロードや戻るボタンを押してしまい、二重投稿になってしまうことがありました。
8
8
 
9
- そのため、投稿ボタンに以下のようにリダイレクトをする文を記述しました。
9
+ そのため、投稿ボタンにリダイレクトをする文を記述しました。
10
10
 
11
11
  ですが、うまくいかず、2回戻るボタンを押すと二重投稿ができてしまいます。
12
12
 
13
- 誰か知恵を貸してくれる人はいませんか?それと、どう書き換えればいいか教えてください。
13
+ 誰か知恵を貸してくれる人はいませんか?また、どう書き換えればいいか教えてください。
14
14
 
15
15
 
16
16
 
@@ -50,7 +50,7 @@
50
50
 
51
51
 
52
52
 
53
- cookieとjavascriptを使ってエラーメッセージを出すように
53
+ cookieとjavascriptを使ってエラーメッセージを出すようにし、リダイレクトさせ
54
54
 
55
55
  →どちらか一方を拒否されていると機能しない。
56
56