- ベストアンサー
formで送信したPOSTデータの削除について
いつもお世話になっております。 PHPでカートを作っております。カートに入れるボタンを押した際に、どのボタンを押したかを識別する為に、POSTで識別データを送信しております。 このPOSTデータが含まれている場合にカートに入れる動作が実行される様に設定しておりますが、POSTで送信すると、ブラウザの更新ボタンを押すたびにカートに同じ商品が追加されていってしまいます。 ですので、カートに入れる動作が終了した時点で、このPOSTのデータを無効にしたいのですが、PHPのunset関数を実行しても、ブラウザの更新を押した時点で、再度POSTを送信してしまうので、やはり重複登録されてしまいます。 このPOSTのデータを無効にする方法があれば、是非お教え頂けると助かります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
まずその前に すでにカートに入っている商品をもう一度カートに入れようとした場合の正しい動きを決めてください どんなショッピングカートを作っているのかわかりませんが、 この世の中にある通販サイトではそのような動きを正しい仕様として決めています あなたが頭ごなしに「すでにカートに入っている商品をもう一度カートに入れようとした場合、数が追加される」ということを悪いことのように思っているようですが。仕様としてそのような挙動が正しいもので有れば「仕様を満たしている」と言えます リロード時の再POSTですが。 リロードした場合はブラウザは再度同じデータを送りつけます、これはブラウザの仕様であり、PHPが悪いわけでもなければunsetで済ませられる問題でもありません。 PHPに限らず、ほかの言語でもPOSTされます。 ですから、更新(リロード)できないような対策が必要です 簡単な方法としては、クッキーやセッションでリロード対策ですね。 例えば if(商品番号をKeyとするクッキーが無い){ $obj->商品を追加("商品番号"); } みたいな感じの処理を入れておけばよいかと思います または、POSTされたときに、同一商品がすでにカートに入っているときは警告なりエラーを出してカートに追加するかしないかを選択してもらうようにするとか。 if( $obj->商品がカートに入っているか("商品番号") ){ $カートObj->getメッセージobj()->追加しますかメッセージを表示("商品番号",個数); }else{ $カートObj->商品をカートに入れる("商品番号",個数); } って感じです リロード対策に関してはさまざまな方法がありますので調べてみてください 何れにせよ、リロードさせない対策&リロードされた場合の挙動 をしっかりを決めて実装してください
その他の回答 (2)
- yambejp
- ベストアンサー率51% (3827/7415)
データの登録が成功した時点で headerのlocationで「登録完了」ページへ飛ばせばよいでしょう。
お礼
個人情報等の登録であればそれでもいいと思うのですが、カートに入れるだけなので、やはりSESSION or COOKIEにて対策します。 ありがとうございました!
- jone
- ベストアンサー率42% (6/14)
POSTデータをSESSIONファイル(DBとか)などに記録してください。 再度押下された場合、その記録先のデータを検証すれば無効にできると思いますが・・・
お礼
SESSION or COOKIEにて対策するしか方法が無さそうですね。 ありがとうございました!
お礼
ありがとうございます。 やはり、再POSTを防止する方法はないんですね。 SESSION or COOKIEにて対策を練ります。 ありがとうございました!