アプリ版:「スタンプのみでお礼する」機能のリリースについて

現在運営中のアンケートフォームを改善したいと思い、質問させていただきます。
現在のアンケートフォームは、入力画面.php→確認画面.php→メール送信.php→完了画面.htmlの4ファイルで構成していて、画面としては3画面です。
また、入力値についてはセッション管理をしています。
メール送信後は、以下の命令でセッション破棄・完了画面.htmlの呼び出しを行っております。
$_SESSION = array();
session_destroy();
header("Location: 完了画面.html");

ところが、セッションが完全に破棄されておりません。
具体的にあげますと、完了画面でブラウザの戻るをクリックして確認画面.phpへ戻り、「ページの有効期限が切れています」と表示されるためリロードを行うと値が入った確認画面が表示されてしまうのです。
ページの有効期限が切れていますうんぬんはかまわないのですが、リロードした時に破棄したはずの値がなぜ表示されてしまうのでしょうか。
また、最終的に求めている「同じ内容が二重送信されないようにする」のために、どのように修正すればよいでしょうか。
アドバイス、お願いいたします。

A 回答 (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"];をしないようにしました。
結果、確認画面へ戻ってリロードすると何も表示されていない入力画面を表示することがでいました。
本当にありがとうございました。

補足日時:2007/08/06 10:27
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

ブラウザのクッキーまでは考えがまわっていなかったですね;
書いていただいているように、セッションを破壊したほうがよさそうなのでぜひ利用させていただきます。
何度も回答いただき、本当にありがとうございました。

お礼日時:2007/08/06 10:27

いつもこれで消してます。


unset($_SESSION['hoge']);

参考URL:http://masago.kir.jp/php20030927.php
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

unset();で消去が一般的なのですね。
とすると、私が今運営しているアンケートフォームは項目数がとても多いので、unsetで全てを消すのはたくさん記述しなきゃいけなくて大変そうですね;
今のアンケートフォームは出来上がっているものなので、次に作成するときには設計段階から参考にさせていただきます。
ありがとうございました。

お礼日時:2007/08/06 10:24

こんにちは。


マニュアルに載っていますが、クライアントのセッションクッキーも含めてセッションを完全に削除するには以下のようにします。

<?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を使う例などもあったと思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
すごく丁寧にアドバイスいただき、恐縮です;

アドバイスいただいたとおりセッションクッキーの削除も追加してみた(具体的にはコピーペーストさせていただいた;)のですが、まだ動作は変わりませんでした。
もしかして私のセッション管理の仕方がまずいのかと不安になってきました。
session_name()ではなく、$_SESSION['name']というようなやり方で各値を記憶させてるんです。
$_SESSION['hoge']の値を完全に消してしまいたい場合はどうすればよいのか、あつかましいのですがアドバイスいただけませんでしょうか?

お礼日時:2007/08/04 11:54

unset()を使ったほうが消えそう。



参考URL:http://jp2.php.net/manual/ja/function.session-de …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
unset()は初めて知りました。
No3様に書いていただいている「$_SESSIONスーパーグローバル」に関する注意が少し難しくて理解できていないため、もう少し勉強して理解して使えそうだったら・・・という感じです。
こういう質問をするたびに知識不足を自覚するので、これを良い機会として、しっかりとセッション管理を学びたいと思います。
ご回答、ありがとうございました。

お礼日時:2007/08/04 11:41

1、入力画面で入力を受ける


2、それを確認画面に送る
3、確認画面で、送られたものをセッションに入れる
という流れでしょうか?

例えば、メール送信後、セッションの廃棄だけでなく、
$_SESSION['ProcessFinished']=true;
というセッション変数を設定して、確認画面でこの変数が設定済みかどうかをチャックし、設定済みであればメール送信の代わりに何かメッセージを出力すれば?

ご参考まで
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

処理の流れは、認識していただいている通りです。
アドバイスいただいたように、メール送信後にセッション変数を設定してみました。
たしかに設定済みの場合はメッセージが表示されておりましたので、二重投稿対策としても使えそうですね。
その画面で更にブラウザの戻るや進むをクリックして画面を前後させると、入力画面が表示され、値は入ったままになってしまう時がありましたのでセッションの完全破棄と併用すればより確実なものになるかもしれません。

お礼日時:2007/08/04 11:34

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