Kintarou'sBlog

プログラミング学習中。学習内容のアウトプットや読書で学んだことなど随時投稿!

【PHP】Sessionを活用し情報を保持する

こんにちは😊Kintarouです。

現在エンジニア転職を目指してプログラミング学習中です👨‍🎓
夢はフリーランスエンジニアになって働く人にとって働く事が楽しくなるシステムを作ること!
と、愛する妻と海外移住すること🗽

プログラミングや読んでいる本のことなど、ブログに書いていきます!
twitter : https://twitter.com/ryosuke_angry


今回参考にさせて頂いたサイト様🙇‍♂️ dotinstall.com


Sessionとは

Cookieのように情報を保持する事が出来ますが、Sessionはブラウザではなくサーバー側に保存します。

Cookieについては過去記事にまとめてます。
ryosuke-toyama.hatenablog.com

そのため検証ツールで確認出来ず、編集や削除も出来ないため、機密性が高く重要な情報を取り扱うのに利用されます。

CookieとSessionの主な違い

項目 Cookie Session
値の保存場所 ブラウザ側 サーバー側
サイズ 制限あり 制限なし
保存できるもの 文字列のみ オブジェクトなどもOK
安全性 低い 高い
扱うもの 簡単な設定項目 認証情報など

Sessionの仕組みを使い背景色情報を保持する

Sessionは、session_start()関数を使う事で利用を開始出来ます。
また、情報は$_SESSIONという変数に配列形式で保持されます。
ブラウザ側にはPHPSESSIDという特殊な形でCookieがセットされ、値にはブラウザとサーバー側の値を紐づける識別子が表示されます。(実際の値は見えないようになっています)

■functions.php

<?php

#まずここでsession_start()を行います。
session_start();

function h ($str)
{
 return htmlspecialchars($str, ENT_QUOTES, 'UTF-8');
}

■result.php

<?php

require('../app/functions.php');

$colorFromGet = filter_input(INPUT_GET, 'color') ?? 'transparent';

#session_start()により$_SESSIONという特殊な変数が使えるようになったので、colorという名前で背景情報を保持します。
#サーバー側に情報を保持する仕組みのためsetcookie()する必要がありません。
$_SESSION['color'] = $colorFromGet;

include('../app/_parts/_header.php');

?>

<p><?= h($colorFromGet); ?></p>
<p><a href="index.php">Go Back</a></p>

■_header.php

<?php

#_header.phpで$_SESSION['color']の背景色情報を$colorに代入します。
$color = $_SESSION['color'] ?? 'transparent';

?>

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="utf-8">
  <title>PHP Practice</title>
</head>
<body style="background-color: <?= h($color); ?>;">

f:id:ryosuke-toyama:20201104182540p:plain
上記のようにPHPSESSIDという特殊なCookieが生成され、Valueにはブラウザとサーバー側の値を紐づける識別子が表示されています。
このCookieが、サーバー側のColorという名前で保持されている背景色情報を引っ張ってきているイメージです。

Session情報の削除方法

Sessionの情報はunset()関数で削除します。
Session情報(color)を削除するためのreset.phpを作成してみます。

■index.php

<?php

require('../app/functions.php');

include('../app/_parts/_header.php');

?>

<form action="result.php" method="get">
  
    <label><input type="radio" name="color" value="orange">Orange</label>
    <label><input type="radio" name="color" value="pink">Pink</label>
    <label><input type="radio" name="color" value="gold">Gold</label>
  <button>Send</botton>

  <!-- reset.phpへのリンクを作成します。 -->
  <a href="reset.php">[reset]</a>
</form>

f:id:ryosuke-toyama:20201105192318p:plain
上記のように[reset]リンクを作成し、reset.phpへジャンプします。

■reset.php

<?php

require('../app/functions.php');

#unset()関数で$_SESSION['color']の値を削除します。
unset($_SESSION['color']);

#header()関数は指定のURLにリダイレクトさせる事が出来ます。
header('Location: http://localhost:8080/index.php');

f:id:ryosuke-toyama:20201105193008p:plain
上記のように、$_SESSION['color']が削除されたため背景色が戻りました。
あくまで削除されるのはcolorの値であり、PHPSESSIDが削除されるわけではないので注意です。

header()関数注意点

本題ではないですがheader()関数が出てきたので注意点です。
①setcookie()同様、関数前にあらゆる出力の不可。
②LocationのLは必ず大文字にする。
③Location: の:(コロン)の後は半角スペースを必ず入れる。
④リダイレクトのURLは必ずhttpから記述する。

以上、どなたかの参考になれば幸いです😊