//(1)セッション変数の値をクリア
$_SESSION = array()

//(2)セッションファイルを破棄
session_destroy();

-----------------------------------------------------
以前にも似たようなことを質問させて頂きましたが、
その時には気にならなかった点が気になって来ましたので、
質問させて頂きます。
で、早速ですが、

(2)をするにあたり、(1)をする意味がわからないので、
どなたか教えて下さい。

セッションファイルを削除したならば、
セッション変数は引っ張って来られなくなるのでは?
と私は思っているわけです。

よって、結局、引っ張って来られなくなる変数を、
(1)のようにしてクリアしておく意味が分からないのです。

セッション変数の値は、
セッションファイルから引いてきていると思っているのですが、
そうではないのでしょうか?

----------------------------------------------------------

また、
ちょっと話題は変わり、
unset($_SESSION)としてしまうと、何やらイケナイようなのですが(マニュアルにそう書かれている)、
これをすると、実際、どうなるのでしょう?

セッション変数に登録されている複数の値を消す場合には、
array()を使ったり、session_unset()を使えば
良いことは分かっております。
私が知りたいのは、こういうことではなく、

あくまで、unset($_SESSION)してしまうと、
どうなってしまうのか(復元不能な致命的なソース破壊に陥る?!)、
これが知りたいのです。

よって、大きく分けて、質問は2つあることになります。
以上、よろしくお願い致します。

A 回答 (2件)

unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。


「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。

どちらのマニュアルをご覧になられたのかわかりませんが、
http://www.php.net/manual/ja/function.session-un …
によると、「警告 $_SESSION スーパーグローバルを使用した セッション変数の登録が不可能になってしまうため、 unset($_SESSION) を使って $_SESSION を完全に unset しないでください。」とありました。

私が試してわかった事は unset($_SESSION) の後に session_unset() を実行しても動作しない、でした。
セッションに関する関数が正常に動作しなくなる可能性がある、と言う判断です。
上記の警告にあった「セッション変数の登録が不可能になってしまう」と言う事はなさそうです。

まずこれを実行してみました。
$_SESSION["a"]="a";
unset($_SESSION);
echo "unset:";
print_r($_SESSION);
$_SESSION["a"]="a";
session_unset();
echo "session_unset:";
print_r($_SESSION);
結果は、
unset:session_unset:Array ( [a] => a )
で unset() には成功していますが、その後の session_unset() には失敗しているようです。

次にこれを実行してみました。
$_SESSION["a"]="a";
unset($_SESSION["a"]);
echo "unset:";
print_r($_SESSION);
$_SESSION["a"]="a";
session_unset();
echo "session_unset:";
print_r($_SESSION);
結果は、
unset:Array ( ) session_unset:Array ( )
でどちらにも成功しています。

ついでに、こちらも。
$_SESSION["a"]="a";
//unset($_SESSION);
echo "unset:";
print_r($_SESSION);
$_SESSION["a"]="a";
session_unset();
echo "session_unset:";
print_r($_SESSION);
結果は、
unset:Array ( [a] => a ) session_unset:Array ( )
で unset() をコメントにしているので当然このようになります。

はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。
すっきりしない部分があり、私も気になりますが、データが不正になるような事はありそうです。
また、コードをそのたびにコンパイル実行しているのでコンパイルコードに問題が発生したとしても、ソースそのものがどうにかなるような事はないように思います。
    • good
    • 0
この回答へのお礼

実際に、身を持ってunsetして頂き、どうもすみません。
私は、致命的な破壊につながるのではと思い、怖くて出来ずにおりました。笑

>unset($_SESSION) については、少なくとも「復元不能な致命的なソース破壊に陥る」と言う事はないと思います。
>「正常に動作しなくなる処理がある」と言う程度で、それがどんなものであり、どう影響してくるのかは不明です。

こちらの説明が、
実験して頂いたコードと、その結果を読むことで、
しっかり伝わってきました。
説得力のある回答を頂き、うれしく思います。

unset($_SESSION['example']);
こちらについては問題ない、ということを把握しておりましたが、
unset($_SESSION); については、気になっておりまして、
それが、今回の回答で大分スッキリ致しました。

>はっきりとどのような影響があるのかはわかりませんが、バージョンによって異なるかも知れませんし、少なくとも、ひとつこのような現象があると言う事です。

はい、よくわかりました。^^
こちらの回答も読みやすく、大変助かりました。
どうもありがとうございます。

お礼日時:2009/09/09 15:04

試されるとわかると思いますが session_destroy() を行なってもセッション変数の値は参照できます。


セッションファイルは削除されますが、おそらくサーバーのメモリ上にある値を参照してくるのだと思います。
そのセッションを使用したプログラムが終了するまでは、この変数値は有効であると考えられます。

echo session_save_path();
echo session_id();
これでセッションファイルの場所を確認しておきます。

$_SESSION["a"]="a";
session_destroy();
print_r($_SESSION);
これを実行してみると、確かにセッションファイルは削除されていましたが print_r() では参照できていました。

よってこのようにするようになっているのだと思います。
$_SESSION["a"]="a";
$_SESSION=array();
session_destroy();
print_r($_SESSION);
が、そのプログラムで継続の処理があるかどうかで $_SESSION=array() をするかどうかを判断されたらいいと思います。
セッションファイルが削除される事で別のプログラムやセッションからはそれがアクセスされる事はないと思いますが、このプログラムに継続の処理があって、そこで参照する必要があるのであれば $_SESSION=array() をしないでいる、とか言う事になると思います。

この回答への補足

とても分かりやすい回答をどうもありがとうございます。

まず初めに、PHPのバージョンは、PHP 5.2.5 です。
説明不足で、すみませんでした。

>セッションファイルは削除されますが、おそらくサーバーのメモリ上にある値を参照してくるのだと思います。
>そのセッションを使用したプログラムが終了するまでは、この変数値は有効であると考えられます。

ここがポイントですね。

頂いた回答をもとに、私も実験してみました。
-----------------------------------
(a.php)
session_start();
$_SESSION["test"] = "test";
echo $_SESSION['test'];//testと出力される

//$_SESSION=array();
session_destroy();
echo $_SESSION['test'];//testと出力される
-----------------------------------
(b.php)
session_start();
echo $_SESSION["test"];//★testと出力されない
-----------------------------------
(c.php)
-----------------------------------
(d.php)
session_start();
echo $_SESSION["test"];//★testと出力されない
-----------------------------------
と書き、

a → b → c → d と遷移する場合、

a:セッション値にtestを格納し、セッションファイルを削除
b:一連のセッションの流れで、メモリ上からセッション値を引っ張ってこられるかチェック
c:いったん、一連のセッションの流れを断つ
d:セッションを復活させて、出力を試みる

結果は、コード中のコメントの通りとなりました。

b.phpにおいても、セッション値は生きているものと予想しておりましたが、実際には死んでおりました。

つまり、
--------------------
$_SESSION=array();
session_destroy();
--------------------

--------------------
//$_SESSION=array();
session_destroy();
--------------------
の違いは、
a.php つまり、
session_destroy();したスクリプト内でのみ、その違いは現れ、

別のスクリプトへ遷移すると、
両者に違いはなくなる、こんな感じでしょうか。

また、
session_destroy();が完全に行われるのは、
それを実行したスクリプトファイルが終了したとき、
なのでしょうね。

なお、
phpマニュアルに書かれているように、
完全にセッションを切断するには
セッションクッキーを削除する必要もあるようなので、
こちらも忘れないようにしたいです。

補足日時:2009/09/09 14:52
    • good
    • 0
この回答へのお礼

この度は、どうもありがとうございました。
また機会がございましたら、アドバイスをしていただけるとうれしいです。

お礼日時:2009/09/11 22:12

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPHP session_destroyとsession_unsetの違い

session_destroyとsession_unsetの違いは何でしょうか
session_unsetはセッションの開放します
session_destroyはセッションを破壊しますといわれても
よくわかりません。

Aベストアンサー

unsetはセッションに登録されている要素の開放
destroyはセッション自体の開放ですね。

destroyを読んだ後はセッションが使用できない
(出来ても動作が保証されない)
と言った感じで把握してください。

QボタンをクリックでPHP文を実行

ボタンをクリックしたときのみPHP文を実行したいのですが・・・

<input type="button" onClink="<?php~?>">
でいけるかと思ったのですが、
ページ表示時に<?php~?>が実行されてしまい、うまくいきませんでした。

onClink="window.open(test.php)"
という方法以外でお願いします。

Aベストアンサー

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、遷移させることが大前提で動作します

ですから、ボタンを押してその場でJavaScriptと同じようにPHPが動くなんてことはありえません。
ボタンを押したらサーバーにリクエストする という動作ならば可能です。

つまり
質問で言われているような
onClink="window.open(test.php)"

<form name="f1" action="test.php" method="post">
<input type="submit" name="submit" value="submit" />
</form>
等のような形になります

こういった一般的な方法だと いちいち画面が切り替わったようになってしまうのを嫌って Ajaxでコレと同じことを、画面を切り替えずに行っているだけに過ぎません

AjaxはもともとJavaScriptの機能である非同期通信をつかったもので。Ajaxという言語があるわけではありません

Ajaxを利用するのであれば、JavaScriptのXMLHttpRequestを使って非同期通信できるような実装をしなくてはなりません
簡単にサンプルコードで書けるほど単純なものでもありません

一般的なサーバーサイドスクリプトの動作として、
ボタンを押す->サーバーへリクエストする->サーバーが処理する->クライアントに何かしらの結果を返す(出力する)です
つまり、PHP等のサーバーサイドスクリプトは、...続きを読む

Q特定のセッション変数の内容だけ破棄

$_SESSION['data1']
$_SESSION['data2']
$_SESSION['data3']
$_SESSION['data4']

 このようにセッション変数が複数ある場合、session_destroy();を宣言するとすべてのセッション変数の内容が破棄されますが、例えば「$_SESSION['data1']と$_SESSION['data2']だけ」といったように、特定のセッション変数の内容だけを破棄することは出来ますか?

Aベストアンサー

unset($_SESSION['data1']);
とすればよいです。

全体を初期化したい場合は、
$_SESSION=array();
とします。
unset($_SESSION)としてはいけません。
(スーパーグローバル変数としての特殊な機能が無効化されてしまうため)

QERROR1062:Duplicate entry.....というエラーが出てしまいました

いつもお世話になります。
データベースからSELECTで抽出したデータを別のテーブルにINSERTするSQLを実行したのですが、
ERROR1062:Duplicate entry.....というエラーが出てしまいました。
お詳しい方がいらっしゃいましたら、アドバイスをいただけませんでしょうか?よろしくお願いいたします。
【実行したSQL】
INSERT INTO tblA (dataA1, dataA2, dataA3, dataA4) SELECT "9001","AA",dataB1,dataB2 FROM tblB WHERE dataB1 = 52

tblAの主キー:dataA1とdataA2
tblBの主キー:dataB1

dataA1とdataA2はtblAの主キーとなっているため、重複してしまうということのようです。tblBの主キーはdataB1であるため、抽出されてくるデータは常に1件なので問題ないと期待していましたが、甘くなかったようです。何か良い方法はないものでしょうか?よろしくお願いいたします。

Aベストアンサー

「ERROR 1062」は、重複データを格納しようとした場合に出力されるエラーです。
既にdataA1='9001'&dataA2='AA'という行が、tblAに格納されているのですよね?

>抽出されてくるデータは常に1件なので問題ないと期待していました

「insert ~ select ~」を実行前に、既に同じデータが格納されているのでは?
あるいはprimary keyの指定が、質問中に記された通りでなく、2件以上検索されているかです。

>何か良い方法はないものでしょうか?

何をするための方法を、聞きたいのかが分かりませんが?

Qメール送信フォームとhistory.back()

現在PHPでメール送信フォームを作っています。画面表示としては、
入力画面→確認画面→送信という流れなのですが、確認画面で「戻る」ボタンを設置して入力画面に戻れるようにしたいと思っています。
そこで、入力画面を当初はhtmlとし、確認画面にhistory.back()を設置してうまく入力値が入っている状態になっていたのですが、入力画面をphpファイルにしたとたんhistory,back()すると空っぽの入力画面が表示されてしまうようになりました。
確認画面で「戻る」ボタンを設置し、入力画面に戻るにはどうすればいいでしょうか?

Aベストアンサー

> 戻るボタンには、前と同じくhistory.back()を設定しています。
> この状態で試しているのですがやはり値が消えてしまっています。

history.back() では、hiddenの値が入力画面に渡されません。
戻るボタンのonClickで、formのaction属性を入力画面のURLに書き換えた上で、そのformをsubmit() するような処理が必要です(JavaScriptで記述します)。

また、上記とは別の方法もあります。history.back() で戻れないのは、入力画面がクライアントにキャッシュされていないためです。キャッシュされていないのは、セッションを使用しているためです。

PHP の session_cache_limiter() 関数を使う(入力画面を表示するプログラム内で、privateに設定する)ことで、history.back() が効くようになると思います。

ただ、一般的にはhistory.backを使わない方法を取ることが多いと思います。

QPHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?

PHPのif文でその処理を途中で抜けるにはどうすればよいでしょうか?
for文やwhile文ではbreakやcontinueなどが使えるようですが、if文にはないのでしょうか?

条件分岐がいくつかあって、その一つを途中で抜けて次の条件分岐へと移行したいのですが、
exitを使ってしまうと、次へ行かずに処理が中止されてしまいますし、
どのようにすればよいのか分からず困っています。何かよい方法はないでしょうか?

Aベストアンサー

例えば「goto 演算子」を使うとかですね。
http://php.net/manual/ja/control-structures.goto.php
(参考URL)

「if文を強制終了」というより「ステップの強制移動」と言った感じです。

ただ、あまりgoto演算子はお勧めできません。
複雑な処理になればなるほど、バグが発生した際にバグ元を発見し難くなります。

本来は細かく制御文を入れていけば、あまり必要ないと思いますが・・・

Qで配列(複数の要素)を渡したいとき?

こんにちわ,

今HTML+PHPで
$hoge[]にいくつかの要素が入っているとき,
それをあるfoo.phpというページに渡したいとき,
echo '<form action="foo.php" method="POST">';
echo '<input type="hidden" name="$hoge[]" >';
echo '</form>';
としたのですが,うまくいきません。

どうしたらよろしいでしょうか。

Aベストアンサー

nameじゃなく、valueでは?
あとやるなら、
for($i=0;$i<count($hoge);$i++){
print "<input type=\"hidden\" name=\"$hoge[$i][0]\" value=\"$hoge[$i][1]\">";
}
とか?

QFORMで送信ボタンと戻るボタンを2つつけてそれぞれ遷移先を変えたい

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入力された値を表示する -->
  <INPUT type="submit" name="submit" value="登録"> // c.php に遷移する
  <INPUT type="submit" name="submit" value="戻る"> // a.php に戻る
 </FORM>

● c.php (完了画面)
--------------------------------------------------------------------------------
b.php について質問なのですが、
b.phpにおいて、登録ボタンと戻るボタンを2つつけて、
それぞれ遷移先を変えたいのですが、どうすればいいんでしょうか・・・?
<FORM method="POST" action="c.php">と書いてしまうと、
戻るボタンを押しても戻らずに、c.phpに遷移してしまいますよね??
こういう場合ってJavaScriptとかで遷移先を指定するんですか・・?
もしそうでしたら、JavaScriptがよくわからないので
できればサンプルコード示していただけると助かります・・・。
  

  
以下のような画面を作りたいのですが↓

--------------------------------------------------------------------------------
● a.php (ユーザ情報入力画面) ※フォームに入力する画面
 
 <FORM method="POST" action="b.php">
  <INPUT type="text" name="mail">
  <INPUT type="submit" name="submit" value="確認">
 </FORM>

● b.php (ユーザ情報入力確認画面)※フォームに入力された値を表示する画面

 <FORM method="POST" action="c.php">
  <!-- ここには、フォームに入...続きを読む

Aベストアンサー

はじめまして。

<INPUT type="submit" name="submit" value="登録" onClick="form.action='c.php';return true">
<INPUT type="submit" name="submit" value="戻る" onClick="form.action='a.php';return true">

でいいと思います。(実際、このコードで使っています)
値を渡すには、FORM内にhiddenで、値を設定しておいて、methodをPOSTに設定しておけば、渡せます。

Qsyntax error, unexpected '}' というエラーの対処法

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" maxlength="3" />
<input type="sbumit" value=回答" />
</form>
<hr />
<?php
session_start();
if(is_null($_SESSION['answer'])){
mt_stand(microtime()*1000000);
$_SESSION['answer']=mt_rand(1,100);
$_SESSION['game_cnt']=0;
}
if($_POST['answer']!=""){
$_SESSION['game_cnt']++;
if($_session['answer']==$_POST['answer']){
print("おめでとうございます".
$_SESSION['game_cnt']."回で正解しました!");
session_destroy();
}else{
if($_SESSION['answer']>$_POST['answer']){
print("もう少し大きいです。");
}else
print("もう少し小さいです。");
}
}
}
?>
</body>
</html>
それとこの間違えたところをなおしたあとはいつもコンピュータを再起動しないと修正したところが適用されないのですがほかに方法はないですか?基本的な質問ですいません。

PHPを習い始めて三日目になるのですがParse error: syntax error, unexpected '}' in C:\Program Files\Apache Group\Apache2\htdocs\****\****\game.php on line 33
というエラーがでるのですが33行目前後のどこをなおせばいいのでしょうか?
・game.php
<html>
<head>
<title>数当てゲーム</title>
</head>
<body>
<h1 style="background:#cccccc">数当てゲーム</h1>
<form method="POST" action="game.php">
1~100までの数を入力してください
<input type="text" name="answer" size="5" max...続きを読む

Aベストアンサー

print("もう少し大きいです。");
}else
print("もう少し小さいです。");
のelseの後に{がないようですが、大丈夫でしょうか?

Q完全なセッション破棄をしたい

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

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

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

ところが、セッションが完全に破棄されておりません...続きを読む

Aベストアンサー

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-unset.php

session_name()は値を記憶させているわけではなく、現在のセッション名を返します。
セッション名は、デフォルトではPHPSESSIDに設定されていますので、クッキーが有効なブラウザではPHPSESSIDという項目にセッションIDが格納されることになります。セッションが有効でないブラウザの場合、URLの最後に&PHPSESSID=******(セッションID)が付加されるのが確認できるかと思います。
ブラウザのクッキーに残ったセッションIDも削除した方が良いので以下のコードが必要になります。
> // セッションを切断するにはセ...続きを読む


人気Q&Aランキング

おすすめ情報