[PHP]setcookieの情報がページ移動で消えてしまう現象に対処

PHPでcookie処理を組んでいた時に、次のような現象が発生しました。
cookieに情報を保存した状態で、同じサーバー内の別ページにジャンプしたところ、保存したcookieの情報が消えてしまいました。

正確には、cookieの情報が消えたり消えなかったりです。
ただ、消えては困る処理だったので、原因を調べて対処いたしました。

忘備録として記録いたします。

COOKIEとは(概略)

そもそもcookieとは何か?
ということを解説いたします。

PHPは起動と終了がその都度行われる言語です。
そのため、一時的なパラメータ(一時的な情報)を保持することができません。

例えば、改ページ処理や別ページにジャンプすると、その都度一時的に取得した情報はリセットされます。

これをなんとかする方法としてcookieを使用します。
一時的な情報をcookieに保存して、次の起動時にcookieから一次情報を再取得します。

これにより、PHPでも一時的な情報をキープしながら処理することができます。

例えば検索と改ページを組み合わせる場合は、改ページしたときに検索キーワード情報を保持しておく必要があります。

そんな場合にcookieを使用します。

cookie動作例
ページが切り替わっても、cookie内容がキープされます。

現象はこのような感じです

百聞は一見ということで以下のサンプルをご覧ください。
クッキーがキープされない例

フォルダをまたぐ場合は、cookieが保存されない現象が発生します。
■cookie保存フォルダ
/in/in02.php

■飛先ページフォルダ
/out/out02.php

フォルダが変わるとcookieがキープできないのは不都合があります。
何とかする方法を調べました。

修正方法(この記述で直りました)

PHPからクッキーを設定する際に、以下のように設定していました。
実際に動作するサンプルです。
違うフォルダでもcookieがキープされる例

現象が発生する記述方法

これを以下のように修正しました。

現象が直った記述方法

setcookie関数4番目のパラメータに「”/”」を付加するだけです。

原因はsetcookieの仕様

PHPのsetcookie関数のマニュアルを見ると次のように書いてあります。

「cookieは設定したフォルダ以下にのみ有効」

つまり下層フォルダ間のページジャンプはcookieキープされますが、並列フォルダ間のページジャンプではcookieがキープされません。

だからフォルダ間リンクの場合にcookieが消えてしまっていたのです。

そこで最上位フォルダでcookieを保存すれば、全ページでcookieがキープされるようになります。

cookieは並列フォルダはキープされませんが、下層フォルダならばキープされます。この特性で考えると、トップページで保存したcookieは全ページで有効になります。

setcookie関数には下層フォルダからの呼び出しでも、最上位フォルダ指定が可能なオプションがあります。

setcookie関数の引数

setcookie(①cookie名, ②cookieの値, ③cookieの有効期限, ④クッキー有効フォルダ)
※⑤以降は省略(詳しくはこちらです。)

例えば年(year)=2020をcookieに保存するものとして解説いたします。

記述例
setcookie(“year”, “2000”, (time()+1800), “/”);

①cookie名

cookieに保存する名称を記述します。
例だと”year”になります。

②cookieの値

cookieに保存する値を記述します。
例だと”2000″になります。

③cookieの有効期限

cookieの有効期限を「秒」で指定します。
例えば(time()+1800)は今から30分間有効のcookieということになります。
time()は現在時間を秒で表し、1800秒(30分)を加算することで30分後としています。

省略したり「0」を設定した場合は、ブラウザを開いている間有効(ブラウザを閉じたら消去)になります。

④cookieの有効フォルダ

cookieが適用されるフォルダを指定します。
“/”を指定すると、全ページ有効(閲覧ドメイン内すべてで有効になります)

省略すると、現在のフォルダが割り当てされます。

cookie有効フォルダを「最上位フォルダ」に設定することで、cookieが消えるという現象がなくなります。
(正確には並列フォルダ移動による有効範囲外現象がなくなります)

cookieで困った現象もよくよく調べると解決方法があります

今回は、設定したcookieが突然消えてしまうというものでしたが、よくよく調べると、単にcookieの特性を知らないだけでした。
ただ、cookieの特性は複雑なため今回初めて知ったことも多かったです。

cookieは様々な状況を想定して、有効期限、有効範囲を細かく設定できるということを今回学びました。

今回のレポートは以上です。
読んでいただいてありがとうございました。


ホームページに関するお悩み事やご相談事がございましたら私どもまでご連絡ください。 鋭意ご対応申し上げます。
ホームページのご提案もさせていただいております