当方WEBデザイナーです。
以前制作したクライアント様のリニューアル案件です。
以前の見積もりフォームで、おそらくスマホのブラウザのタブ機能で
送信後のページが再読み込みされ、二重送信がたまに起きる事態に。
(実はブラウザリロードでも二重送信になってしまいますが、実際はそういうことをするお客様はほぼいません。スマホのブラウザの多機能化が起こり、最近まま起きるようになったと考えています)
同クライアント様 サイトリニューアルにより、この現象を食い止めなければなりません。
私なりに調べてコードを書いていますが、どうしても二重送信をうまく食い止めることができません。
MAMP環境では無理なのか?とも考えましたが、おそらくそんなことはないと思います。
調べた結果、post送信で一時チケットの文字列を符合させ、私の環境で言えば
<mb_send_mail>を実行するという点でどの参考サイトも同じことをやっているようです。
大事な部分だけ抜粋します。
index.php
<?php session_start(); $ticket = md5(uniqid(rand(), true)); $_SESSION['ticket'] = $ticket; ?> <html> ・・・ <form action="after.php" method="post"> <input type="hidden" name="ticket" value="<?=$ticket?>"> <input type="submit" value="送信する">
after.php
<html> <header> </header> <body> ・・・ <?php session_start(); $ticket = isset($_POST['ticket']) ? $_POST['ticket'] : ''; $save = isset($_SESSION['ticket']) ? $_SESSION['ticket'] : ''; unset($_SESSION['ticket']); if($ticket === '') { die('ticket が空'); } if($ticket !== $save) { die('ticket がsave と同じではない'); } else { //ここからメール送信処理を始めています $action = $_POST['action']; $user_name = htmlspecialchars($_POST[user_name],ENT_QUOTES); $company = htmlspecialchars($_POST[company],ENT_QUOTES); //(バリデート, mail_bodyへの代入) ・・・ $mailsend = mb_send_mail($mail_to, $mail_subject, $mail_body, $mail_header); echo '送信完了しました'; } ?> ・・・ </html>
多くのサイトを参考にしましたが、一時的にチケットを発行し、送信前後で符合させ
メインのアクションを起こすという点で同じであり、
自分なりに切り分けたのですが、一時チケット($ticket)は空ではないが、同一ではないようです。
メインのアクションへのプロセス(私で言えばメール送信)は「die('ticket がsave と同じではない')」で止まります。
やりたいことはフォームの送信を一度限り可能にし、二重送信を防ぐことです。
厳密にはボタンの連打などで二重送信になることはあるようですが、クライアント様環境でそのようなクレームは無いので、ひとまずシンプルに
2回読み込みの同一二重送信を防ぐことです。
お分かりの方いらっしゃいましたらご教示よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー