質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

3243閲覧

$_SESSIONが取得できない。

ishido

総合スコア13

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/02/22 06:35

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
PHPでセッションを利用してログイン管理をしています。
PHP7.0では正常に動いていましたが、PHP7.2にバージョンアップするとセッションが取得できずNULLになってしまいます。

発生している問題

$_SESSIONが取得できない。

該当のソースコード

ログイン後に表示されるページではセッションが取得されていますが、
別のページに遷移した際に下記のコードでセッション状況をチェックするとセッションが取得できずに
session_startをしても$_SESSIONでsession_id()などが取得できません。

if( !isset( $_SESSION ) ) { session_set_cookie_params($lifetime); session_start(); }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

公式ページによると、挙動が変わっているようですが、これと関係ありますか?
session_set_cookie_params

  • 7.1以前は引数がfalseの場合はvoidを返した(voidというのは引数も含め何も処理しない、つまりなかったことにするって処理です)

  • 7.2以後はきちんと判定するようになった。

だとすると変数$lifetimeに入っている判定値がfalseである(機能していない)可能性が高いです。

setCookie()変数から送られてきた値がちゃんと入っているか確認してみてください。

追記:公式のフォーラムに海外の人が、これは使えないと警告していますので、代替方法を載せておきます。

PHP

1$lifetime=600; 2session_start(); 3setcookie(session_name(),session_id(),time()+$lifetime);

投稿2019/02/22 06:39

編集2019/02/22 10:36
FKM

総合スコア3633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ishido

2019/02/22 06:41

返答ありがとうございます。 こちらの記述は確認していましたが、私のプログラムにどのように影響しているのか どのように直せば動くのかがわからないでいます。 7.2.0 成功した場合に TRUE を、失敗した場合に FALSE を返します。 以前はこの関数は void を返していました。
FKM

2019/02/22 06:48

voidってのは引数を受け取らず何も処理しないってことです。ところが7.2からは受け取って処理するようになった…つまり$lifetimeの値が本当に真か判定しているわけなので、 var_dump($lifetime)として、本当にsessionの値が入っているか確認してください。
ishido

2019/02/22 07:08

有難うございます。検証してみます。
ishido

2019/02/22 07:26

$lifetime=1200; session_set_cookie_params($lifetime); のように記述していますが、機能していないようです。
ishido

2019/02/22 08:37

bodyタグの直後に記述してみましたが、残念ながら改善されていません。
FKM

2019/02/22 08:41 編集

だとすると、こいつのせいでしょうかね。 http://d.hatena.ne.jp/katase_n/20060524 そういや、公式サイトのフォーラムにも海外の人が「これだとできないので、こうしろ」って書いてますね。 As PHP's Session Control does not handle session lifetimes correctly when using session_set_cookie_params(), we need to do something in order to change the session expiry time every time the user visits our site. So, here's the problem. <?php $lifetime=600; session_set_cookie_params($lifetime); session_start(); ?> This code doesn't change the lifetime of the session when the user gets back at our site or refreshes the page. The session WILL expire after $lifetime seconds, no matter how many times the user requests the page. So we just overwrite the session cookie as follows: <?php $lifetime=600; session_start(); setcookie(session_name(),session_id(),time()+$lifetime); ?> And now we have the same session cookie with the lifetime set to the proper value.
FKM

2019/02/22 10:39 編集

訳すると、 session_set_cookie_params()を使ったとき、PHPでのセッション時間の制御が正しくない。よって代替の方法を考える必要がある。 ~略~ このコードだとページが遷移したときや更新したときにセッションの値を変えられない。これだとページを要求した際にすぐ有効期限が切れる。それで以下のようにセッションの値を上書きするようにした。 ~略~ これで、セッションの値を保持することができるぞ。 とあります。
ishido

2019/02/22 21:35

なるほど、訳も載せて頂きありがとうございます。 コードを変更したところ問題なく稼働しました。公式フォーラムの英語は読めないので断念していました。 解決いたしました。
guest

0

session_start();は$_SESSIONを参照するより先に書く必要があるのでは。

投稿2019/02/22 06:46

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/02/22 06:47

あ、すみません関係ないですね。 スルーしてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問