DBに書き込み処理したり、画像を投稿させたりいろいろとリロードされては困る場合が多いと思います。
そんなときは、ここの対策をするといいと思います。
いちおここにも書いておきます
まずは確認画面での処理
1
2
3
4
5
6
7
|
<form action="complete.php" method="post">
<input name="ticket" type="hidden" value="<?= htmlspecialchars($_SESSION['ticket']), ENT_QUOTES); ?>" />
<input name="submit_button" value="完了画面へ遷移" type="submit" />
</form>
|
確認画面でチケットを発行し、セッションに保存。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
<?php
if (isset($_POST['submit_button'], $_SESSION['ticket'], $_POST['ticket'])
&& $_SESSION['ticket'] === $_POST['ticket']) {
unset($_SESSION['ticket']);
if (!$form->validation()) {
// 不正な値が入っていた場合は例外処理
header("Location: http://{$_SERVER['HTTP_HOST']}/top.php");
exit;
}
// 1回しか行わない処理
$db->insert($form);
$mail->send();
}
// 登録完了画面出力
$tpl->display();
|
このように、確認画面で発行されたチケットは一度使い切ってしまえば2度処理される事なくリロード対策となるわけ。
たしかに、便利。
ただ、これをクラス化してもいいと思う。
てか、Smarty側でもうちょっといじれそうな気がする。
その辺はまたいじってみよう。
理想としてはSmartyのテンプレート読み込みに行った時点でIDを発行させてセッションに食わせて、フォームのポスト先でセッション使ったチェックをするってのが理想か。
簡単そうだな。
Ethna使うとリロード対策も簡単にできるから便利だよなぁ。