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