2009-03-19 14 views
7

セッション変数が設定されているページ以外のページでセッション変数を使用できません。セッション変数は、セッション変数以外の変数のように動作します。私は同様の質問が他の6つの類似フォーラムに掲載されていることを発見しましたが、他のケースの回答は常に適用されないことが判明しました。ここでPHPセッション変数が保存されていません

私のファイルは、以下のとおりです。

sess1.php

<?php 
session_start(); 

session_register("userid"); 
session_register("textvar"); 

$_SESSION['userid'] = 10333 ; 
$_SESSION['textvar'] = TextVariable ; 

echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; 
echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; 
?> 
<p>Go to the <a href="sess2.php">next page</a>.</p> 

と、 sess2.php

<?php 
session_start(); 

echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; 
echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; 
?> 

それぞれの場合のブラウザーの出力は次のとおりです。

sess1.php

ユーザーIDは、次のとおりです。10333

もう一つの変数は以下のとおりです。[次のページ]にTextVariable

移動します。

と、 sess2.php

ユーザーIDのセッション変数は次のとおりです。

他のセッション変数は次のとおりです。[最後のページ]へ

移動します。

されていないいくつかのこと:

  • 私は両方のファイルの先頭ににsession_start()を持っています。
  • 変数ディレクトリは書き込み可能で、セッション変数がそこに表示されています。 (私はsess_b62と呼ばれる約100の小さなファイルを持っています: 'userid | i:10333; textvar | s:12: "TextVariable";')
  • phpinfo()は、php.iniファイルが正しく読み取られており、有効期間がデフォルトの0(ブラウザが閉じられるまで)に設定されています。

私はウィットの終わりです。助言がありますか?

ありがとうございます。

+0

同じセッションIDが使用されているかどうかを確認しましたか? – Gumbo

+0

SSL経由のページの1つですか? –

+0

実行中のPHPのバージョンは? (phpinfo()からも) –

答えて

2

セッションIDは、複数のページにわたって同じセッションを使用できるように、何らかの形で運ばれなければなりません。一般に、これはクッキー(session.use_cookiesを参照)で行われますが、URLまたはフォームでも行うことができます(session.use_trans_sid参照)。

まず、セッションIDが送信されていることを確認して、PHPが適切なセッションとセッションのデータをロードできるようにする必要があります。

見るIs my understanding of PHP sessions correct?

+0

助けてくれてありがとう。 phpinfo()は私がクッキーを使用していることを確認して、IDが送信されているようです。 session.use_cookiesは "On"で、session.use_trans_sidは0です。Set-Cookieは、最初のページで作成されたクッキーを記録し、そのページはrefererという名前になります。 –

+0

セッションIDは両方のページで同じですか?Set-Cookieヘッダーフィールドが送信されたということは、クッキーが受け入れられ、2番目の要求と共に送信されたことを意味しません。両方のページの 'session_id()'戻り値を比較してみてください。 – Gumbo

+0

Crud。セッションIDは異なります。それで...? –

7

session_register()ここで問題を引き起こしている可能性があります。 session_register()のドキュメントを読んでください。既存の変数を使用してセッション変数を割り当てることを意図しています。

hereから:

まあ、session_register()は、特定のグローバル変数がセッションで考慮されるべきであることをPHPに指示します。これは、スクリプトの実行終了時(セッションデータの書き込みが通常発生したとき)に、そのグローバル変数の結果の値が、現在有効なセッションハンドラを使用して書き込まれることを意味します。

これはあなたが抱えている問題だと思います。スクリプト実行の最後に、セッション変数が上書きされます。

+0

ええ、session_register()は、しばらく使用されなくなりました。私はそれがこの特定の問題を引き起こしているかどうかはわかりませんが、それは関係なくそのコード内にあるべきではありません。 –

+0

興味深い。私は著作権'07の入門PHP/SQLブックから取り組んでいます。コードはほとんど直接引用です。残念ながら、session_register()行をremvoingしても問題は解決しないようです。情報をありがとう。 –

0

ツールを使用して、httpヘッダーをチェックして、Cookieの送信方法を確認します。おそらく、あなたのWebサーバーが構成ミスであり、無効な別のドメインでCookieを送信している可能性があります。

各リクエストでsession_set_cookie_params()を実行し、正しいドメイン、パスなどが設定されていることを確認することができます。

-1

でsession_registerを使用してください。両方ともファイルである必要があります。

+0

提案していただきありがとうございます。両方のファイルにsession_register()行を追加して、両方の方法で試しました。行動に変化は見られませんでした。 –

+0

session_registerは推奨されていません。避けたい場合は使用しないでください。 – rhodesjason

+0

@Jason:廃止予定のURLを共有していますか?代わりに何を使うべきですか? –

2

1つの間違いは、最初のファイルでは$_SESSION['textvar']を設定し、2番目のファイルでは$_SESSION['newvar']を呼び出していることです。

また、私が知っているサーバーでコードをテストしたところ、上のエラー以外はうまくいきました。

session_register()も削除しましたが、コードはまだ完全に動作しています。

+0

グッド・アイ - 「newvar」はタイプミスで、新しい単純なファイルにコードをコピーしたときから残されていました。しかし、私のシステムではsession_register()ソリューションが動作しません。提案に感謝します。 –

+0

あなたはあなたのクッキーを消去(またはこのサイトのクッキーを削除)し、再度アクセスする最初のページとしてこのページにアクセスしようとしましたか?また、上に他のテキストがないか、<?php? –

1

「session_register()は、変数の名前または変数名または他のアレイからなるアレイを保持する文字列のいずれかとすることができる任意のそれらの可変個の引数を受け付けます。各名前について、session_register()はグローバル変数を現在のセッションにその名前で登録します。

これらの名前に変数がないため、結果は予測できません。上記のすべての問題が解決しない場合は

だけ$_SESSION[$key] = $value;

1

を使用し、 - 私はちょうど明白なことを尋ねる:wouldn'tオープニングPHPタグの前にスペースや改行があって?

サーバエラーログファイル内の変数も定義されているかどうかを確認することができます(エラー報告のレベルにもよりますが)。

0

チェックするもう一つの明白なこと:

をお使いのディスク容量がいっぱいになっていないことを確認してください。セッションデータが保存されないようにします。

0

これは古いポストだと知っていますが、私は(session_register()を使用しない)同様の問題を抱えています。

セッションがあまりにも頻繁にタイムアウトしていたためにセッションをクッキーに変換しなければならず、サーバー設定( '特別な' Windowsサーバーホスティング環境(Apacheの場合))によりPHPセッションのタイムアウト値を変更できませんでした。

最終的な結果は、長寿命のCookieに変換した後も、Cookieデータはまだ失われています(送信中)か?時々。

非常にイライラします。

これはLAMP環境で起こったことはありませんでしたので、LAMPサーバーを使用しているかどうかは疑問です。

これが役に立ちます。私はこれがPHPの問題だとは思わない。

3

私は同じ問題に直面していました。理由は、のphp.iniにありました。の値をのに設定しました。です。しかし、私はURLでhttpsの代わりにhttpを使っていました。 httpsを使用して問題を解決しました。

session.cookie_secure = 1を設定すると、Cookieはセキュリティで保護された接続を介してのみ送信する必要があることを示します。したがって、httpを使用している間は、新しいページごとに新しいsession_idsが取得されていました。

0

PHPサーバのサーバログ(nginxやapacheなど)を確認してください。

なぜセッションがnginx error.logで機能しないのかを知ることができます。そのファイルへのパスは通常/var/log/nginx/error.logです。

私の場合、セッションデータを保存できないと言っていました。同じディレクトリ内の古いerror.log.1ファイルのサイズが17 GBで、使用可能なすべてのディスク領域を占有していたことが判明しました。

ディスクスペースを解放するだけで、セッションの正常な動作が復元されました。

関連する問題