PHPのリロード対策

Twitter ツイート Hatena Bookmark ブックマーク

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使うとリロード対策も簡単にできるから便利だよなぁ。

comments powered by Disqus
Built with Hugo
テーマ StackJimmy によって設計されています。