- ベストアンサー
2回投稿されてしまいます
こんにちは。 PHPでアンケートプログラムを作っています。 HTMLフォームから送られてきたデータをサーバ上のテキストファイルに記録するのですが、同じデータが2~3回記録されてしまうことがあります。 何が問題でしょうか? また、対策はありますか? よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 問題が解決したようでよかったです。 1点気になったので投稿させていただきました。 > HTMLの中にPHPのコードを混ぜてしまうことが > バグの原因になっていたとは、思いもよりませんでした。 HTMLの中にPHPのコードを書くことはよくあります。 今回の不具合の主原因は、PHPコードがユーザの操作により、 複数回呼ばれる可能性があることだと思います。 釈迦に説法かも知れず恐縮ですが、 ユーザはどんな操作をするかも知れず、いろいろ検証されることを お勧めします。 失礼しました。
その他の回答 (4)
- katze_dog
- ベストアンサー率80% (4/5)
こんにちは。 ソースありがとうございます。 必要なところだけ抜粋させていただきます。 ▼入力部分 ------------------------------------------------------ <html> <head> <title>questuionnaire</title> </head> <body> <form name = "myform" action = "questionnaire.php" onsubmit = "return check()"> (フォームの内容) </form> : : </html> ------------------------------------------------------ ▼PHP部分(questionnaire.php) ここにはhtmlソースは必要ありません。 ------------------------------------------------------ <?php $name = $_REQUEST['name']; $q1 = $_REQUEST['quiz0']; // 1問目の答え $q2 = $_REQUEST['quiz1']; // 2問目の答え $q3 = $_REQUEST['quiz2']; // 3問目の答え $timestr = date("Y-m-d H:i:s"); //年月日時間の取得 : : : header("Location: complete.html"); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ↑ この一行を最後に入れる ?> ------------------------------------------------------ ▼アンケートを受ける側(complete.html) ------------------------------------------------------ <html> <head> <title>questionnaire</title> </head> <body> <p>ご協力ありがとうございました。</p> </body> </html> ------------------------------------------------------ 検証してませんが、こんな感じでいかがでしょうか?
お礼
コードをご教示いただきまして、誠にありがとうございました。 早速試させていただきましたが、問題となっていた二重投稿の症状はなくなったようです。 HTMLの中にPHPのコードを混ぜてしまうことがバグの原因になっていたとは、思いもよりませんでした。 ありがとうございました。
よくわかりませんが。。 誤操作防止として、送信した段階で、セッション変数とかフォームデータなどをクリアして2度と送れないようにする必要があるのでは? --以下は推測-- それでも何かが入ってくるようなら、アクセスログを解析してみてみれば?検索エンジンのクロールのような自動的なもの。。BOT的なものでどうしても防げない場合は・・フォーム送信前に人間の操作であることを確認する処理でも入れてみれば?
- katze_dog
- ベストアンサー率80% (4/5)
> 同じデータが2~3回記録されてしまうことがあります のよくあるパターンとして、ユーザー側で リロードもしくはF5を押す 事があると思います。 対策としてはいろいろありますが、 PHPでせっかく組んでいるなら header("Location:" $url); みたいにリダイレクトしてはいかがでしょうか?
補足
レスありがとうございます。 一応以下が現在使っているコードです。上がHTML、下がPHPです。 何か不備がありましたらご指摘くださいますようよろしくお願いいたします。 ***アンケート回答フォーム(HTML)*** <html> <head> <title>questuionnaire</title> </head> <body> <form name = "myform" action = "questionnaire.php" onsubmit = "return check()"> //questionnaire.phpにフォームの答えを送る <hr> (0)あなたのお名前を入力してください。<p> <input type = "text" name = "name" value = ""> <p> <hr> (1)あなたの好きな動物を選んでください。<p> <input type = "radio" name = "quiz0" value = "ライオン"> ライオン<p> <input type = "radio" name = "quiz0" value = "ブタ"> ブタ<p> <input type = "radio" name = "quiz0" value = "犬"> 犬<p> <input type = "radio" name = "quiz0" value = "ハムスター"> ハムスター<p> <hr> (2)あなたの好きな果物を選んでください。<p> <input type = "radio" name = "quiz1" value = "メロン"> メロン<p> <input type = "radio" name = "quiz1" value = "ミカン"> ミカン<p> <input type = "radio" name = "quiz1" value = "リンゴ"> リンゴ<p> <input type = "radio" name = "quiz1" value = "パイナップル"> パイナップル<p> <hr> (3)あなたの好きな国を選んでください。<p> <input type = "radio" name = "quiz2" value = "アメリカ"> アメリカ<p> <input type = "radio" name = "quiz2" value = "イギリス"> イギリス<p> <input type = "radio" name = "quiz2" value = "イタリア"> イタリア<p> <input type = "radio" name = "quiz2" value = "フランス"> フランス<p> <hr> <input name= "mybutton" type="submit" value="送信" > </form> <p> 送信ボタンをクリックしてください。<p> <p> <script language="Javascript"> var i; var n = 3;//question number var rn = 12;//radio button number function check() { var sum = 0;//sum for (i=0; i<13; i++) { if (document.myform.elements[i].checked == true) { sum=sum+1; } } if (sum != 3) { alert('すべての質問に答えてください。') return false; } else if (document.myform.name == "") { alert('お名前を入力してください。') return false; } else { return true; } } </script> </body> </html> ----------------------------------------------------------------- ***アンケートの答えを受け取る側(PHP)*** <html> <head> <title>questionnaire</title> </head> <body> ご協力ありがとうございました。 <?php $name = $_REQUEST['name']; $q1 = $_REQUEST['quiz0']; // 1問目の答え $q2 = $_REQUEST['quiz1']; // 2問目の答え $q3 = $_REQUEST['quiz2']; // 3問目の答え $timestr = date("Y-m-d H:i:s"); //年月日時間の取得 $pointer=fopen("data.txt", "a"); //data.txt にアンケート結果を追加する flock($pointer, LOCK_EX); fputs($pointer, $timestr); fputs($pointer, ","); fputs($pointer, $name); fputs($pointer, ","); fputs($pointer, $q1); fputs($pointer, ","); fputs($pointer, $q2); fputs($pointer, ","); fputs($pointer, $q3); fputs($pointer, ","); fputs($pointer, "\r\n"); flock($pointer, LOCK_UN); fclose($pointer); ?> </body> </html>
これだけの情報じゃ、なんとも答えようがないだろう。送信された情報をどのような形で保存しているかということがわからないと。 例えば、よくWebプログラミングの入門書なんかで見るが、フォームから送信されたPHPファイル内で、データの保存をしてそのまま「保存しました、ありがとうございます」というような表示を行う、というように、1つのファイルで保存とその後の結果表示を行っている場合。表示されたページをリロードすると同じ結果がそのまままた保存されてしまったりする。例えばそんな具合に、リロードやブラウザのページ移動などで移動するとまたスクリプトが動いて二重保存してしまう、というような問題じゃないだろうか。
お礼
>HTMLの中にPHPのコードを書くことはよくあります。 >今回の不具合の主原因は、PHPコードがユーザの操作により、 >複数回呼ばれる可能性があることだと思います。 ありがとうございます。 まだまだ不勉強なので今後ともご指導よろしくお願いいたします。