

現在運営中のアンケートフォームを改善したいと思い、質問させていただきます。
現在のアンケートフォームは、入力画面.php→確認画面.php→メール送信.php→完了画面.htmlの4ファイルで構成していて、画面としては3画面です。
また、入力値についてはセッション管理をしています。
メール送信後は、以下の命令でセッション破棄・完了画面.htmlの呼び出しを行っております。
$_SESSION = array();
session_destroy();
header("Location: 完了画面.html");
ところが、セッションが完全に破棄されておりません。
具体的にあげますと、完了画面でブラウザの戻るをクリックして確認画面.phpへ戻り、「ページの有効期限が切れています」と表示されるためリロードを行うと値が入った確認画面が表示されてしまうのです。
ページの有効期限が切れていますうんぬんはかまわないのですが、リロードした時に破棄したはずの値がなぜ表示されてしまうのでしょうか。
また、最終的に求めている「同じ内容が二重送信されないようにする」のために、どのように修正すればよいでしょうか。
アドバイス、お願いいたします。
No.5ベストアンサー
- 回答日時:
session_name()は値を記憶させているわけではなく、現在のセッション名を返します。
セッション名は、デフォルトではPHPSESSIDに設定されていますので、クッキーが有効なブラウザではPHPSESSIDという項目にセッションIDが格納されることになります。セッションが有効でないブラウザの場合、URLの最後に&PHPSESSID=******(セッションID)が付加されるのが確認できるかと思います。
ブラウザのクッキーに残ったセッションIDも削除した方が良いので以下のコードが必要になります。
> // セッションを切断するにはセッションクッキーも削除する。
> // Note: セッション情報だけでなくセッションを破壊する。
> if (isset($_COOKIE[session_name()])) {
> setcookie(session_name(), '', time()-42000, '/');
> }
この部分はコピペで構いません。
$_SESSION['hoge']の削除は
unset($_SESSION['hoge']);
で可能です。
$_SESSIONそのものを消し去ってしまいたい場合は、
unset($_SESSION);
の代わりに
session_unset();
をコールする必要があります。
参考URL:http://jp2.php.net/manual/ja/function.session-un …
この回答への補足
少し場所をお借りしまして、結果報告を。。。
今回質問させていただいたのは、セッションが完全に破棄されていないのでどうすればよいか、という質問でしたが、皆様からの回答で確認画面でのリロードで値が戻るのは、もう一度POSTを取り直しているからだと教えていただきました。
結論としては、入力画面.phpと確認画面.phpの間にPOST送信された入力値を各セッション変数で受け取るだけのファイルを追加し、確認画面で$hoge=$_POST["hoge"];をしないようにしました。
結果、確認画面へ戻ってリロードすると何も表示されていない入力画面を表示することがでいました。
本当にありがとうございました。
回答ありがとうございます。
ブラウザのクッキーまでは考えがまわっていなかったですね;
書いていただいているように、セッションを破壊したほうがよさそうなのでぜひ利用させていただきます。
何度も回答いただき、本当にありがとうございました。
No.4
- 回答日時:
ご回答ありがとうございます。
unset();で消去が一般的なのですね。
とすると、私が今運営しているアンケートフォームは項目数がとても多いので、unsetで全てを消すのはたくさん記述しなきゃいけなくて大変そうですね;
今のアンケートフォームは出来上がっているものなので、次に作成するときには設計段階から参考にさせていただきます。
ありがとうございました。
No.3
- 回答日時:
こんにちは。
マニュアルに載っていますが、クライアントのセッションクッキーも含めてセッションを完全に削除するには以下のようにします。
<?php
// セッションの初期化
// session_name("something")を使用している場合は特にこれを忘れないように!
session_start();
// セッション変数を全て解除する
$_SESSION = array();
// セッションを切断するにはセッションクッキーも削除する。
// Note: セッション情報だけでなくセッションを破壊する。
if (isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}
// 最終的に、セッションを破壊する
session_destroy();
?>
なお、$_SESSIONの初期化にunset($_SESSION)を使ってはいけません。
http://jp2.php.net/manual/ja/function.session-un …
> 完了画面でブラウザの戻るをクリックして確認画面.phpへ戻り、「ページの有効期限が切れています」と表示されるためリロードを行うと値が入った確認画面
ということですが、
入力画面--(GET,or POSTで送信)-->確認画面--(セッション)-->完了画面
おそらく入力画面でフォームなどを入力し、その値はPOSTなどで送られていると思うのですが、確認画面でリロードしてしまうと、ブラウザはこれらの情報を再送信してしまっているのでは無いでしょうか。
すると確認画面で再度、セッションがセットされてしまいます。
リロード対策は検索エンジンで「リロード PHP」などと検索すると出てきますので参考にされるとよいかと思います。
http://www.stackasterisk.jp/tech/php/php03_01.jsp
他にDBを使う例などもあったと思います。
ご回答ありがとうございます。
すごく丁寧にアドバイスいただき、恐縮です;
アドバイスいただいたとおりセッションクッキーの削除も追加してみた(具体的にはコピーペーストさせていただいた;)のですが、まだ動作は変わりませんでした。
もしかして私のセッション管理の仕方がまずいのかと不安になってきました。
session_name()ではなく、$_SESSION['name']というようなやり方で各値を記憶させてるんです。
$_SESSION['hoge']の値を完全に消してしまいたい場合はどうすればよいのか、あつかましいのですがアドバイスいただけませんでしょうか?
No.2
- 回答日時:
ご回答ありがとうございます。
unset()は初めて知りました。
No3様に書いていただいている「$_SESSIONスーパーグローバル」に関する注意が少し難しくて理解できていないため、もう少し勉強して理解して使えそうだったら・・・という感じです。
こういう質問をするたびに知識不足を自覚するので、これを良い機会として、しっかりとセッション管理を学びたいと思います。
ご回答、ありがとうございました。
No.1
- 回答日時:
1、入力画面で入力を受ける
2、それを確認画面に送る
3、確認画面で、送られたものをセッションに入れる
という流れでしょうか?
例えば、メール送信後、セッションの廃棄だけでなく、
$_SESSION['ProcessFinished']=true;
というセッション変数を設定して、確認画面でこの変数が設定済みかどうかをチャックし、設定済みであればメール送信の代わりに何かメッセージを出力すれば?
ご参考まで
ご回答ありがとうございます。
処理の流れは、認識していただいている通りです。
アドバイスいただいたように、メール送信後にセッション変数を設定してみました。
たしかに設定済みの場合はメッセージが表示されておりましたので、二重投稿対策としても使えそうですね。
その画面で更にブラウザの戻るや進むをクリックして画面を前後させると、入力画面が表示され、値は入ったままになってしまう時がありましたのでセッションの完全破棄と併用すればより確実なものになるかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHPで入力フォームでデータを確認表示画面まで送る流れを日本語で理解したいのです。 1 2023/05/29 19:12
- PHP php 入力画面から確認表示画面へ情報の受け渡しについて。 1 2023/06/07 18:00
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- PHP php 確認表示画面で値をSESSIONから取り出す理由の解釈は正しいでしょうか? 1 2023/06/09 17:39
- PHP 掲示板のセキュリティについてアドバイスお願い致します 1 2023/08/11 20:44
- Chrome(クローム) GoogleChrome閉じるたびにアンケート続行できない表示が出る。 1 2023/08/13 13:53
- その他(gooサービス) dアカウントを登録できません 1 2023/03/03 23:35
- デスクトップパソコン windows7を使っているパソコンでの質問です。先日動作が遅く再起動かけると「windowsを起動 9 2022/06/16 21:31
- その他(動画サービス) 海外のポルノ動画をみていて「お好みに」入れて置くと画面により「待機・ページ終了」表示で動かなくなる 1 2022/12/30 19:37
- gooブログ Twitterの動画画面をgooブログに埋め込めない 4 2022/06/03 16:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
ログインしたら他からログイン...
-
セッション変数の命名規則
-
ログイン画面をはさんだ後、自...
-
完全なセッション破棄をしたい
-
複数ページでセッションを使わ...
-
別ブラウザ間でセッションの値...
-
PHP cookieの値が更新されない...
-
Sessionの上限について
-
「戻る」ボタンで値の保持
-
PHPSESSIDについて
-
PHPでログイン人数を制限したい
-
sessioncookieをではなくcookie...
-
PHP SESSION変数を複数使用でき...
-
swfファイルでセッション情報を...
-
セッション変数と配列
-
PHPSESSIDの表示
-
ブラウザを閉じた後もセッショ...
-
PHPのセッション有効期限について
-
学校の授業で困っていることが...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
URLのパラメータをGETのままで...
-
PHPSESSIDの表示
-
PHPのセッション有効期限について
-
Sessionの上限について
-
ログイン画面をはさんだ後、自...
-
ログインしたら他からログイン...
-
セッションについて
-
セッション変数にパスワードを...
-
sessioncookieをではなくcookie...
-
クッキーを使わないセッション...
-
セッションのスコープ(有効範...
-
二重ログイン管理について
-
完全なセッション破棄をしたい
-
PHP cookieの値が更新されない...
-
ブラウザを閉じた後もセッショ...
-
PHPでログイン人数を制限したい
-
swfファイルでセッション情報を...
-
セッションを用いたデータの変...
-
セッション変数と配列
-
PHPSESSIDについて
おすすめ情報