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(cookie名, cookie保存内容, (time()+1800));
これを以下のように修正しました。
現象が直った記述方法
setcookie(cookie名, cookie保存内容, (time()+1800), "/");
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は様々な状況を想定して、有効期限、有効範囲を細かく設定できるということを今回学びました。