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度きりしか回答できないようになると一番いいです(しかしそこまでする必要もないとも思っていて、連続更新を防げばよいと考えています)。
以上、どうぞよろしくお願いします。
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"]の中身を見たところ、異なる値になっています。
リロードによる再POST防止はPOST時に一度Locationでリダイレクトすることで実現できます。
質問者のプログラム例では例えば以下のように修正すれば大筋は良いと思います。
<?php switch ($hoge) { case "a": update(); // DB更新 header("Location: ".$_SERVER['SCRIPT_URI'].'?hoge=b'); exit; case "b": hyoji(); // 回答一覧表示 break; default: question(); // 質問表示 } ?>
echo $_SERVER['SCRIPT_URI'] で値が出ません。それゆエラーが出ます。
Warning: Cannot modify header information - headers already sent by...
$_SERVER["PHP_SELF"]や$_SERVER["QUERY_STRING"]は出ます。
またPOSTで動いており、'?hoge=b'は適切ではないような気がします。$hogeにbが渡らないですよね?初心者なので、認識違いでしたら申し訳ございません。
回答者 | 回答 | 受取 | ベストアンサー | 回答時間 | |
---|---|---|---|---|---|
1 | にんにん | 16回 | 14回 | 1回 | 2009-06-20 03:37:16 |
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"]の中身を見たところ、異なる値になっています。