- ベストアンサー
submitボタンの二重送信について
PHPでfacebookアプリの作成に挑戦しています。 ウォールへ投稿すると、何度かに1回の割合で二重送信となり、後から送信された空のコメントが優先されてウォールに投稿されてしまいます。 javascriptによりボタンの二重押しは回避しているのですが、なぜかたまに2回送信されてしまっているようです。 特にスマートフォン(iPhone)からの投稿時に多いです。 かと言って毎回そうなるわけでもない為、なにが原因なのかさっぱりわかりません。 どういった原因が考えられますでしょうか? スマートフォン特有のそういった現象とかあるんでしょうか・・・ よろしくお願いいたします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
再度、確認させてください。 Facebook API使ってるって事でいいでしょうか? あと、もし判明していたらでいいんですが、どっちに原因があるかは確認してますか? 端末から送られてきている情報が二重なのか?送られてきている情報は実は一個でPHP側での処理を誤っているか? ま、概ね前者だとは思いますが、後者の可能性もなくはないかなと思ったので一応聞いてみました。 JavaScript側で空白を送信しない方法は、以下ような感じのものをアレンジしてみてください。 他にも<form>のsubmit時に入力チェックをするようなコードは いっぱいネットに転がってますので、自分にあったものを探してみてください。 http://www.1kara.net/js/form.php PHP側で制御できるのであれば、他の方の回答のものでOKです。 > スマートフォン特有のそういった現象とかあるんでしょうか・・・ 正直、iPhoneは持っていないので、iPhoneのsafariの挙動がどのようなものかは分かりません。 本当に一回しかタップしてなくて、ブラウザが余分に空白も送信しているんだとしたら、バグとしか言いようがありません。 過敏なタッチパネルだと結構二重送信とか起こりやすい気もしますが、ブラウザ側でそれを制御していないとも思えませんので、よく分かりません。 俺が使ってるAndroidは静電なのに結構しっかり押さないとブラウザはsubmitしてくれません。
その他の回答 (4)
- tany180sx
- ベストアンサー率63% (239/379)
なんかのセキュリティソフトが一度リンク先のページをチェックするので 二重送信になってしまうとかどこかで見たような。気のせいかも。
お礼
お返事ありがとうございます。 そういうこともあるんですね。 誤動作?してしまうのがスマートフォンの方なので、セキュリティーソフトは使ってないのですが、今後の参考にさせて頂きます。 ありがとうございました。
- yambejp
- ベストアンサー率51% (3827/7415)
>後から送信された空のコメントが優先 が重要であれば、空で送られてきたデータは更新・登録しない分岐をいれるだけでよくないですか?
お礼
お返事ありがとうございます。 自分なりにやってはみたのですが、どうしてもうまく行きませんでした。 きっと私が状況を正確に読めていないんでしょうね。 ありがとうございました。
原因はよくわかりませんが、JavaScriptに加えてPHPでの制御を加えれば完璧です。 セッションに以前送信したときのタイムスタンプを記録しておき、「2秒以上経過してなければ連続送信とみなす」などの判定をすればいいと思います。 if ($_SERVER['REQUEST_TIME']-$_SESSION['prev_submit']<2) die('連続送信は出来ません'); とか。
お礼
お返事ありがとうございます。 私はなぜかセッションが使いこなせない為、ちょっと難しくて実装は出来ませんでしたが、考え方は勉強になりました。 がんばってセッションの勉強も再チャレンジしてみようと思います。 ありがとうございました。
- bm_hiro
- ベストアンサー率51% (200/388)
とりあえず、どの方法で二重送信を防止しているか補足お願いします。 submitをdisableにする方法?それとも、フラグで制御する方法?それとはまた別でしょうか? 同じ内容が送信されるのでなく、二度目に送ったほうが空白というので、正直 原因が分かりません。 一回送信後、画面遷移してから 再度 空白を送信してるのでしょうか? Ajaxとか使ってますか? とか、ここまで書いていて気がついたのですが、原因の究明が目的でないなら、対処方法としてはJavaScriptで空白チェックしてから送信すればいいのでは?とか思いました。 とりあえず、思いついたこと書いてるので 的外れかもしれませんが。
補足
お返事ありがとうございます。 // submitボタン無効化処理 function DisableButton(b) { b.disabled = true; b.value = '投稿中'; b.form.submit(); 上記の方法です。 当方初心者ですので、Ajaxは使っていないです。 ボタンが2回押されてるのではなく、一度送信された情報の後に、続けて空の情報が送られる(時がある)という状況です。 空白チェックの方法で改善できるでしょうか。 原因究明できなくても、改善されれば問題ありませんので、なんでも試してみたいと思っています! 空白チェックの方法をアドバイスして頂ければ助かります。 よろしくお願い致します。
お礼
問題が解決しました。 と言っても原因はわかっていません。 結局submitボタンから文字リンクに変更して、javascriptでクリックの回数をカウントして2回目以降はリンク先へ飛ばないように設定でうまく作動するようになりました。 私の力が足りず、ボタンのままでの解決とはいきませんでしたが、大変勉強になりました。 そして、ひとつめの解答に続いて親身になってお返事くださいまして、誠にありがとうございました。