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

質問編集履歴

3

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

2021/07/22 08:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -123,16 +123,16 @@
123
123
  $data = $data."<p>投稿者:".$personal_name."</p>\r\n";
124
124
  $data = $data."<p>内容:</p>\r\n";
125
125
  $data = $data."<p>".$contents."</p>\r\n";
126
+ // ファイルへ書き込み開始
126
127
  $keijban_file = 'keiji_all.txt';
127
128
  $fp = fopen($keijban_file, 'ab');
128
- // ファイルへ書き込み
129
129
  if ($fp){
130
130
  if (flock($fp, LOCK_EX)){
131
131
  if (fwrite($fp, $data) === FALSE){
132
132
  print('ファイル書き込みに失敗しました');
133
133
  print('何度も失敗する場合は知らせてください。');
134
134
  }
135
- // ファイルロック
135
+ // ファイルロック解除
136
136
  flock($fp, LOCK_UN);
137
137
  }else{
138
138
  print('ファイルロックに失敗しました');

2

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

2021/07/22 08:48

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -7,18 +7,145 @@
7
7
  誰か知恵を貸してくれる人はいませんか?また、どう書き換えればいいか教えてください。
8
8
 
9
9
 
10
- ### コード(一部分を抜粋)
10
+ ### コード
11
11
 
12
12
 
13
13
  ```PHP
14
14
 
15
-
16
15
  <?php
16
+ // recaptchaを使うので、試してみるために組んでいます。
17
+ // よって、使わない部分が多いです。
18
+ // ほぼ確認用のコードです。
19
+ require '../recaptcha/recaptcha_vars.php';
20
+ // サイトキー
21
+ $siteKey = V2_SITEKEY;
22
+ // シークレットキー
23
+ $secretKey = V2_SECRETKEY;
24
+ $result_status = ''; // 結果を初期化
25
+ if ( isset( $_POST[ 'g-recaptcha-response' ] ) ) {
26
+ //GoogleのAPIを指定
27
+ $url = 'https://www.google.com/recaptcha/api/siteverify';
28
+ //パラメータを指定
29
+ $data = array(
30
+ 'secret' => $secretKey,
31
+ 'response' => $_POST[ 'g-recaptcha-response' ]
32
+ );
33
+ //POST メソッドを使用
17
- echo <<<html
34
+ $context = array(
18
- (中略)
35
+ 'http' => array(
36
+ 'method' => 'POST',
19
- <button id=“send” type="submit" disabled name="btn1_toukou" value="投稿!!" class=“button” onclick="location.href='掲示板のURL'">
37
+ 'header' => implode("\r\n", array('Content-Type: application/x-www-form-urlencoded',)),
38
+ 'content' => http_build_query($data)
20
- (中略)
39
+ )
40
+ );
41
+ //設定したパラメータからAPIを使って取得する
42
+ $api_response = file_get_contents($url, false, stream_context_create($context));
43
+ $result = json_decode( $api_response );
44
+ if ( $result->success ) {
45
+ $result_status = '成功しました';
46
+ //デバッグ用。使わないのでコメントアウト。
47
+ //$re = 'OK';
48
+ } else {
49
+ $result_status = '失敗しました。: ';
50
+ $result_status .= $result->{'error-codes'}[ 0 ];
51
+ //デバッグ用。使わないのでコメントアウト。
52
+ //$re = 'NG';
53
+ }
54
+ }
55
+ print($re);
21
56
  ?>
57
+ <html>
58
+ <script>
59
+ var onloadCallback = function() {
60
+ grecaptcha.render('recaptcha', {
61
+ 'sitekey' : "<?php echo $siteKey; ?>",
62
+ 'callback' : verifyCallback,
63
+ 'expired-callback' : expiredCallback
64
+ });
65
+ };
66
+ var verifyCallback = function(response) {
67
+ document.getElementById("warning").textContent = '';
68
+ document.getElementById("send").disabled = false;
69
+ };
70
+ var expiredCallback = function() {
71
+ document.getElementById("warning").textContent = '投稿するにはチェックを入れてください。';
72
+ document.getElementById("send").disabled = true;
73
+ };
74
+ </script>
75
+ </head>
76
+ <head>
77
+ <link rel="icon" type="image/png" href="../icon.png">
78
+ <title>掲示板</title></head>
79
+ <body>
80
+ <body bgcolor="#181a19" text="#cccccc" alink="#ffffff">
81
+ <p><h1>掲示板</h1></p><br>
82
+ <a href="https://***.**/">***.**(トップページ)</a><br>
83
+ <p>テスト的な意味もありますが、ちょっと作ってみました。</p>
84
+ 削除・変更の依頼は<a href="./delete.php" target="_blank">こちら</a>から
85
+ <form method="POST" action="<?php print($_SERVER['PHP_SELF']) ?>">
86
+ <input type="text" name="personal_name"><br><br>
87
+ <textarea name="contents" rows="8" cols="40"></textarea><br><br>
88
+ <div id="recaptcha"></div>
89
+ <p id="warning">投稿するにはチェックを入れてください。</p>
90
+ <input id="send" type="submit" name="btn1" class="btn btn-primary" disabled value="投稿!!" onclick="location.href='***.**/keiji/keiji_all.php'">
91
+ </form>
92
+ <?php
93
+ if($_SERVER["REQUEST_METHOD"] == "POST"){
94
+ writeData();
95
+ }
96
+ // ファイルを読み込んで表示
97
+ readData();
98
+ function readData(){
99
+ $keijban_file = 'keiji_all.txt';
100
+ $fp = fopen($keijban_file, 'rb');
101
+ if ($fp){
102
+ // ファイルロック
103
+ if (flock($fp, LOCK_SH)){
104
+ while (!feof($fp)) {
105
+ $buffer = fgets($fp);
106
+ print($buffer);
107
+ }
108
+ flock($fp, LOCK_UN);
109
+ }else{
110
+ // できないなら
111
+ print('ファイルロックに失敗しました');
112
+ print('何度も失敗する場合は知らせてください。');
113
+ }
114
+ }
115
+ fclose($fp);
116
+ }
117
+ function writeData(){
118
+ $personal_name = $_POST['personal_name'];
119
+ $contents = $_POST['contents'];
120
+ $contents = nl2br($contents);
121
+ // HTMLの構成
122
+ $data = "<hr>\r\n";
123
+ $data = $data."<p>投稿者:".$personal_name."</p>\r\n";
124
+ $data = $data."<p>内容:</p>\r\n";
125
+ $data = $data."<p>".$contents."</p>\r\n";
126
+ $keijban_file = 'keiji_all.txt';
127
+ $fp = fopen($keijban_file, 'ab');
128
+ // ファイルへ書き込み
129
+ if ($fp){
130
+ if (flock($fp, LOCK_EX)){
131
+ if (fwrite($fp, $data) === FALSE){
132
+ print('ファイル書き込みに失敗しました');
133
+ print('何度も失敗する場合は知らせてください。');
134
+ }
135
+ // ファイルロック
136
+ flock($fp, LOCK_UN);
137
+ }else{
138
+ print('ファイルロックに失敗しました');
139
+ print('何度も失敗する場合は知らせてください。');
140
+ }
141
+ }
142
+ fclose($fp);
143
+ }
144
+ ?>
145
+ </body>
146
+ <script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>
147
+ </html>
148
+
22
149
  ```
23
150
 
24
151
 
@@ -32,4 +159,4 @@
32
159
  ### 補足情報
33
160
 
34
161
  PHPバージョンはPHP7.3です。
35
- windows 10のIE8、edgeを使って検証後、windows XPのIE6でも検証
162
+ windows 10のedgeを使って検証しました

1

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

2021/07/22 08:36

投稿

退会済みユーザー
title CHANGED
File without changes
body CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  PHP(7.x系)で掲示板システムを作っています。
4
4
  投稿ボタンを押した後リロードや戻るボタンを押してしまい、二重投稿になってしまうことがありました。
5
- そのため、投稿ボタンに以下のようにリダイレクトをする文を記述しました。
5
+ そのため、投稿ボタンにリダイレクトをする文を記述しました。
6
6
  ですが、うまくいかず、2回戻るボタンを押すと二重投稿ができてしまいます。
7
- 誰か知恵を貸してくれる人はいませんか?それと、どう書き換えればいいか教えてください。
7
+ 誰か知恵を貸してくれる人はいませんか?また、どう書き換えればいいか教えてください。
8
8
 
9
9
 
10
10
  ### コード(一部分を抜粋)
@@ -24,7 +24,7 @@
24
24
 
25
25
  ### 試したこと
26
26
 
27
- cookieとjavascriptを使ってエラーメッセージを出すように
27
+ cookieとjavascriptを使ってエラーメッセージを出すようにし、リダイレクトさせ
28
28
  →どちらか一方を拒否されていると機能しない。
29
29
  上記のように、リダイレクトさせる
30
30
  →上記のような問題が発生する