• Login
    • ログインしていません

  • Tool Set
    • 1ページ戻る

    • 1ページ進める

    • お気に入りに登録

    • しおりを挟む

  • Save
    • ページの復元をする

      サイトにアクセスした際に、前回閲覧していたページへ自動的に遷移するようにセットします。

  • Toppage Button
    • ボタンを非表示にする

  • Scroll Direction
    • ボタンによる
      スクロール方向を逆転

Programing

PHPにおけるCookie処理

前回、フロントにおけるCookie処理ということで、
ブラウザ上に残るCookieの操作について解説しました。
変わってバックエンド側(PHP)によるCookie処理について解説していきたいと思います。

バックエンドにおけるCookieとは

フロントでのCookieはユーザーの識別用IDという形で紹介しました。
バックエンド側におけるCookieは、
いろんなデータの中の1種類に過ぎません。

ブラウザはサイトデータの取得時にリクエストという形で、
さまざまなデータをバックエンドに渡します。
PHPを例にとると、
クエリパラメータによるデータは $_GET という形のデータになり、
フォームデータなどは $_POST という形のデータになり、
ブラウザの持つCookieデータは $_COOKIE という形で渡されます。

ブラウザからのCookieデータは、$_COOKIE の中に連想配列の形で格納され、
$_COOKIE['key1']という形でデータを取り出すことができる様になります。

各言語(Go, Python, Ruby等)でもCookieを取り扱うことはできるので、
取り扱いについては各言語の仕様に沿った使い方をしてください。

Cookieを操作する

Cookieを操作するにあたり、
バックエンド側でもライブラリが用意されていたり、フレームワークの中に関数として用意されていたりもしますが、
今回は生のCookieデータをPHPで操作していきます。
php.netのsetcookie関数のページをもとに、
本サイトで試してみて得た結果を記載しています。

CookieをSETする

設定する際は上記で示した関数でCookieを追加していきます。
注意点は、あらゆる出力よりも前に というところです。
※ ですが、これをわざとエラーが出るように記述してもCookieが設定できてしまったので、仕様が変わったのか、書き方が間違っているのかは別の機会に確認したいと思います。

php.netのsetcookie関数ページでは、
関数実行に関して2通りの方法を記載していて、本サイトではoptionを用いた方法を仕様・解説していきます。
setcookie関数の仕様は下記になります。

// 情報を引数として渡す方法
// $expires以降は記述の省略可
setcookie(
    string $name,
    string $value = "",
    int $expires = 0,
    string $path = "",
    string $domain = "",
    bool $secure = false,
    bool $httponly = false
): bool

// 情報をOptionsとして渡す方法
setcookie(string $name, string $value = "", array $options = []): bool
// 記述例
setcookie(
  "key1",
  "value1",
  [
    "expires" => 60,
    "path" => "/",
    "domain" => "whyisthis.dev",
    "secure" => true,
    "httponly" => true
  ]
);

では実際どう記述するかというと、
下記の様になります。

// 値のみ設定する(期限はSessionとなります)
setcookie("key1", "value1");

// 値に期限をつける(2023/02/20 12:00:00から次の日の12:00:00までを有効とする場合)
setcookie("key2", "value2", [
  "expires" => time() + (60 * 60 * 24)
]);

// Pathと期限を設定
setcookie("key3", "value3", [
  "expires" => time() + (60 * 60 * 24),
  "path" => "/"
]);

// DomainとPathと期限を設定
setcookie("key4", "value4", [
  "expires" => time() + (60 * 60 * 24),
  "path" => "/",
  "domain" => "whyisthis.dev"
]);

Cookieをセットするにあたり注意する点が一つあります。
フロントでは期限を設定するにあたり Max-Age という項目がありましたが、
setcookie関数では使用できません。
expires に統合されているため、期限の設定には必ずこちらを使いましょう。

Cookieの期限を設定する

期限の設定には、現在時間を取得する time関数を使用し、
そこから何秒間という形で設定します。

CookieをGETする

Cookieのデータを取得するのは、冒頭でも記述したように、
GlOBAL変数で用意されているので、
下記のように取得してください。
フロントのように何かしらの処理を行うということはありません。

$_COOKIE['key1']

CookieをDELETEする

Cookieを削除するには、原則が2つあります。
その1 期限を過去のものに設定する。
その2 付加した同じ情報を設定する。

期限を過去のものにするというのは time関数 にマイナス値を足すことで表現できます。
付加した同じ情報を設定するというのは、フロントと同じで、付与されている情報と違っていた場合には削除できません。

セットしたCookieを削除するための記述例を出したいと思います。

setcookie("key1", "", [
  "expires" => time() - 1
]);

setcookie("key2", "", [
  "expires" => time() - 1
]);

setcookie("key3", "", [
  "expires" => time() - 1,
  "path" => "/"
]);

setcookie("key4", "", [
  "expires" => time() - 1,
  "path" => "/",
  "domain" => "whyisthis.dev"
]);

まとめ

PHPでCookie情報を触るだけであれば、それほど難しくないと思います。
問題はフロント側とバックエンド側でデータをやり取りするための仕組みを、
どう使い、どう処理するかが難しいところなので、
その辺りは自身にとっても課題となるところではあります。

こちらの情報も一度試して、動作が確認できた上での使用を押し薄めしています。
この情報により、損失・不利益が生じても補償はできません。

Drug用ハンドル