2011-01-07 16 views
0

私は、私はPHPでのセッション変数のスコープ、またはセッション自体を理解していないですので、この質問を推測:これは私のコードPHPのセッション変数ISSET(..)= 1の後にsession_start()

ある

if(session_id()!=""){ 
    echo "Getting rid of session"."</br>"; 
    session_destroy(); 
} 
echo "Before session_start(): ".isset($_SESSION["first_date_of_week"])."</br>"; 
session_start(); 
echo "After session_start(): ".isset($_SESSION["first_date_of_week"])." ".$_SESSION["first_date_of_week"]->format("Y-m-d")."</br>"; 

出力は次のようになります。

Before session_start(): 
After session_start(): 1 2011-01-09 

は、どのように私もそれを使用していないにもかかわらず、セッションを開始した後、セッション変数にISSET(..)を行っているとき、それが直接設定されていることを来りますまたはそれを設定するt?しかし、これまでと同じ価値があります。

また、session_id()= "" if節が決してトリガーされないためです。私はセッションを打ち切ることはありません、どのように ""に設定されていますか?私。私はページをリフレッシュし、セッションがまだ生きていることを期待しています。

ISSETを使用して、それがすでに設定されている場合(..)関数が...その後、事前に

おかげでかなり無用のテストです!

/ニクラス

+3

ヒント:!の 'session_idの()== "(" session_id()== "") 'のように評価されます。 '!='演算子を使用してください... –

答えて

3

コードで問題がいくつかあります:

  1. !==よりも優先順位が高いので、テスト!session_id()==""が間違っています。それはsession_id() != ""と書かれています。暗黙的な変換のため、正しく動作するはずですが、バグ以外の何ものでもないとは言えません。
  2. session_destroyは、の後に、session_startの後にのみ動作します。今

、ここでは正確に何が起こるかです:

  1. あなたはアクティブなセッションのためにテストします。何もないので、テストは失敗し、session_destroyは呼び出されません(呼び出されても何もしません)。
  2. $_SESSION["first_date_of_week"]の存在をテストします。アクティブセッションがないので、issetはfalseを返します。
  3. セッションを開始します。 $_SESSION["first_date_of_week"]が利用可能になりました。が表示されますが、それ以前のセッションでは、は表示されません。

何が起こっているのよりよいハンドルを取得するには、このコードを試してみてください。

$logout = true; // play with this 
session_start(); 
if ($logout) { 
    session_destroy(); 
    echo "Logged out."; 
    die; 
} 

if (!isset($_SESSION['counter'])) { 
    $_SESSION['counter'] = 1; 
} 
else { 
    ++$_SESSION['counter']; 
} 

echo "The counter value is ".$_SESSION['counter']; 
die; 
+0

Nicsoftはsession_destroyが呼び出されることはないと述べています。 – Jim

+0

しかし、同じページが2回読み込まれていて、そのページ(種類のエントリページ)がロードされるたびに新しいセッションを開始したい場合は、セッションが生きていてはいけませんし、session_id == "他の場所でのセッション?私は "if(session_id()!=" ")..."に更新しましたが、動作に変更はありません。確かに、私は以前のセッションでそれをセストしました。 – Nicsoft

+0

@Nicsoft:最初に 'session_start'を呼び出さないと**セッションは**生きていません。私の例では、私がログアウトするときとそうでないときの両方で、常にこれをやっていることに注目してください。 – Jon

2

はそのでsession_startを覚えて、単に「セッション」を開始し、新しいセッションを開始しません。あなたが何か(とあなたがそれをdestoryedしていない、@ジョンの答えを参照)を設定したのであれば、あなたは戻ってセッションを取得します:)

2
session_start(); 
if(isset(session_id())) { 
    session_destroy(); 
} 
$_SESSION['data'] = "something";