人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP初心者です。簡単に書くと、このようなswitch文を書いています。

switch ($hoge) {
case "a":
update(); // DB更新
hyoji(); // 回答一覧表示
break;
default:
question(); // 質問表示
}

question()のチェックボックスフォームにhiddenでhogeを置き、aをPOST送信してupdate()、hyoji()を実行するというプログラムなのですが、ひとつ欠陥があります。hyoji()画面で画面更新を行うと、再度update()にPOST=aが渡されDBに再び値が渡ってしまいます。

これを解消する方法についてご教授いただけませんでしょうか?なお、利用は携帯およびPCを考えています。

URLは事前にGETでhttp://hoge.com/abc.php?aaa=1というようになっており、各URLで回答者は1度きりしか回答できないようになると一番いいです(しかしそこまでする必要もないとも思っていて、連続更新を防げばよいと考えています)。

以上、どうぞよろしくお願いします。

●質問者: さとし
●カテゴリ:ウェブ制作
✍キーワード:CASE DB hoge pc PHP
○ 状態 :終了
└ 回答数 : 2/3件

▽最新の回答へ

1 ● b-wind
●50ポイント ベストアンサー

色々やり方はあるけど、シンプルな例としてはトークンを使う方法。

[PHP-users 19497]Re: 重複投稿/submitを防ぐトランザクショントークンという考え方

◎質問者からの返答

mt_srand((double)microtime()*1000000);

$token = md5((string)mt_rand()); //必要ならユーザー名とか

//メールアドレス等も入れて

//md5化するとGOOD(?)

session_start();

$_SESSION["token"] = $token;

?>

<body>

switch ($act) {

case "a": // 回答一覧表示

sleep(1);//重複submitを起こしやすくする。実際にはいらない

session_start();

if ( empty($_POST["token"]) || $_POST["token"] != $_SESSION["token"] ) {

echo "エラーだよん";

} else {

unset($_SESSION["token"]);

//ここから先に正常時の処理を続けて書く

update_an();

}

gamen_iti();

break;

default: // 質問表示

gamen_q();

}

?>

</body>

※簡略化してます。

としたのですが、「エラーだよん」が出力されます。1度目のquestion()からのPOST送信でもです。$_POST["token"]、$_SESSION["token"]の中身を見たところ、異なる値になっています。


2 ● y-kawaz
●20ポイント

リロードによる再POST防止はPOST時に一度Locationでリダイレクトすることで実現できます。

質問者のプログラム例では例えば以下のように修正すれば大筋は良いと思います。

<?php
switch ($hoge) {
 case "a": 
 update(); // DB更新
 header("Location: ".$_SERVER['SCRIPT_URI'].'?hoge=b');
 exit;
 case "b":
 hyoji(); // 回答一覧表示
 break;
 default: 
 question(); // 質問表示
}
?>

http://q.hatena.ne.jp/answer

◎質問者からの返答

echo $_SERVER['SCRIPT_URI'] で値が出ません。それゆエラーが出ます。

Warning: Cannot modify header information - headers already sent by...

$_SERVER["PHP_SELF"]や$_SERVER["QUERY_STRING"]は出ます。

またPOSTで動いており、'?hoge=b'は適切ではないような気がします。$hogeにbが渡らないですよね?初心者なので、認識違いでしたら申し訳ございません。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ