• 締切済み

mysqlへの書き込みがリロードする度に行われてしまう。

現在PHPとMYSQLを使ってサイトを作っています。 そこで、テーブルの追加をinsert文を使って実行し、 追加されたテーブルをselect文で表示させるということをやっています。 現在はhoge.htmlでフォーム側を記載し、hogehoge.phpで受け取り、データを追加、表示させるようにしています。 登録作業の方は問題なく実行されるのですが、 登録されたデータがhogehoge.phpをリロードする度に永遠と同じデータが追加され続けてしまう現象がおきています。(auto_incrementに指定しているidだけがかわる) データを登録し終わると次にリロードしてもデータが追加されないようにするにはどのようにすればよいのでしょうか。 ご教授御願いいたします。

みんなの回答

回答No.4

フォームからhogehoge.phpへPOSTを使ってデータを送っていると思いますが、この場合はリロードするたびにPOSTのデータが送られるのでINSERTが繰り返されることになります。 この問題の対策としてはいくつかの方法が考えられます。 1.セッションに情報を保持する 一度INSERTしたら、そのデータを一意に認識できる情報(プライマリキーなど)をセッションに保持しておきます。次にINSERTが要求されたときにセッション内に同じ情報があるか確認し、存在すればINSERTしないようにします。 もしプライマリキーが自動的に連番を割り当てるタイプのものでしたら、フォームに予めランダムなIDをhiddenタグで入れておく必要があります。このランダムなIDを割り当てる方法はNo2やNo3の方が仰っているのと同じです。 2.リダイレクトを利用する リロードによって再度POSTされることが問題になるので、リダイレクトを利用して重複したPOSTを避ける方法です。これは、hogehoge.phpをPOSTで呼び出されたらINSERTとhogehoge.phpへのリダイレクトを、GETで呼び出されたらリストの表示を行うというようにします。こうすればリロードしてもGETが呼び出されるだけですので、再度INSERTされることはありません。 個人的には2の方法が好きですが、この場合はダブルクリックには対応できませんので気をつけてください。

nonchan000
質問者

お礼

親切にご回答頂き有り難うございます。 もう少し自分なりに勉強することが必要のようです。 頑張ってみます。

  • kuroiwa96
  • ベストアンサー率100% (2/2)
回答No.3

phpのバージョン等にもよると思いますが、私もphp初心者の頃、同様の問題に当たり、参考urlのリロードクラスを使わせていただきました。 これがそのまま使用できるかどうかは不明ですが、このソースコードがやらんとしていることを理解することで、リロードや戻るボタンへの対策が取れると思います。 難しいかもしれませんし、簡単かもしれませんが、是非ソースコードを解析してみてください。

参考URL:
http://www.stackasterisk.jp/tech/php/php03_01.jsp
nonchan000
質問者

お礼

親切に教えて頂き有り難うございます。 今少し時間が無く試せていないのですが、使わせて頂こうとおもいます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

特定のフィールドにユニーク属性をつけてみてはどうでしょう?

nonchan000
質問者

お礼

ご回答有り難うございます。まだ具体的なことが分かりませんので、勉強します。

  • calltella
  • ベストアンサー率49% (317/635)
回答No.1

hogehoge.phpの処理でhoge.htmlからデータが来ていない場合は テーブル追加をさせない様にすればいいんじゃないですかね?

nonchan000
質問者

補足

早速回答頂き有り難うございます。 「hogehoge.phpの処理でhoge.htmlからデータが来ていない場合は テーブル追加をさせない様に」 出来れば良いのですが、 初心者なもので、コードの書き方が分かりません。 何かヒントのようなものでも与えて頂けないでしょうか。 宜しく御願いいたします。