プロが教えるわが家の防犯対策術!

プログラミング初心者です。
INSERT INTOを使ってPHPからMYSQLにデータを書き込むページを作ったのですが、ブラウザの更新ボタンを押したり、戻るボタンでそのページにたどり着くと同じデータが再度書き込まれてしまいます。
このようにならないためにはどのように処理すればよろしいのでしょうか?一般的な方法を教えていただけたらありがたいです。

よろしくお願いします。

A 回答 (3件)

こんにちは。



次の方法はいかがでしょうか?
1.入力画面で埋め込んだ重複しない文字列を処理チェック用文字列として保持する。
2.完了画面に移動した時に、セッションに保持した処理チェック用文字とリクエストの処理チェック用文字が一致しなければ登録処理を行う。
3.登録処理後に、その文字列をセッションに保持する。

以下は、その実装サンプルです。ご覧ください。


<PHPファイル1>
1.入力画面表示
2.PHPで登録処理チェック用の非表示データ埋め込みを行う。
3.JavaScriptでボタン2度押し防止処理を実装する。

<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>q7810942-Input</title>
<script type="text/javascript">
function onSubmit() {
document.forms[0].action = "q7810942-02.php";
document.forms[0].submit();
document.getElementById("go").disabled = true;
return true;
}
</script>
</head>
<body>
<h3>Input Page</h3>
<form action="javascript:onSubmit();">
<input type="hidden" name="token" value="<?php echo(date("YmdHis")); ?>" />
<input type="submit" id="go" />
</form>
</body>
</html>


<PHPファイル2>
1.データ登録処理
2.完了画面表示

<html>
<head>
<meta http-equiv="Content-Language" content="ja">
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>q7810942-02</title>
</head>
<body>
<h3>Complete Page</h3>
<?php
session_start();
echo("REQUEST: ".$_REQUEST["token"]."<br>");
echo("SESSION: ");
if (isset($_SESSION["token"])) {
echo($_SESSION["token"]);
}
echo("<br>");
if (!isset($_SESSION["token"]) || $_REQUEST["token"] != $_SESSION["token"]) {
// DBインサート処理
echo("DBインサート処理実行<br>");
$_SESSION["token"] = $_REQUEST["token"];
}
?>
</body>
</html>
    • good
    • 0

1さんの言うようにajaxで書き込み行いページ移動をしない方法、


あるいは簡単な方法としてインサート後 location.replace で履歴を上書きして他のページを出力してしまう方法、
などです。

<?php
インサート処理
?>
<html>
<head>
<script language="javascript">
<!--
location.replace('finish.html');
//-->
</script>
</head>
<body>
</body>
</html>
    • good
    • 0

確認ページをつくってセッション処理をするか


更新をajaxなど非同期処理でおこなう
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!