目次
PHPでセッションを扱う際の基本事項をまとめます。
環境:PHP 7.4.4、 Google Chrome バージョン: 83.0.4103.116
セッションとクッキーの基礎知識
・セッション(session)とは
クライアント(Webブラウザ)とサーバー間で接続の状態を保たせるために
リクエストを受けたサーバー側で生成し、保存するデータのこと。
・クッキー(cookie)とは
(セッションと同じく)クライアントとサーバー間で接続の状態を保たせるために
Webブラウザ側でデータを保存する仕組み(ブラウザ側の領域)のこと。
セッションとクッキーの仕組みを利用することで、
Webサイトはログイン状態の保持やショッピングカートなどの機能を実現します。
PHPでセッションを利用する
セッションを開始する
PHPではsession_start関数を実行することで、
サーバー上でセッションIDと呼ばれるデータが作成され、
同時にWebブラウザ側のクッキー領域に同じセッションIDが保存されます。
(これをセッションクッキーという)
<?php session_start();
ブラウザの開発者ツールから、クッキーに保存されたセッションIDを確認する事ができます。
(google chromeデベロッパーツール、Application > Cookiesより)
『セッションIDとはサーバーがクライアントを一意に識別するための合言葉のようなもの』
セッションIDはデフォルトで「PHPSESSID」という名前となっています。
セッションIDを保存したクライアントが次回以降サーバーへリクエストする際にセッションIDを※一緒に送信することにより、
サーバー側は同じセッションIDを持ったクライアントからのリクエストと認識します。
※リクエストヘッダと呼ばれる場所へ格納して送信される
セッションに情報を保存する
セッションによりクライアントとサーバーの接続状態を保つ事が出来れば、
通常ではリクエストを跨いだ際に消えてしまう情報もセッションが切れるまでWebサイト上で常に保存、参照する事が可能になります。
(フォームへ入力した値の保持、カートへの商品の追加等)
セッション変数 $_SESSION
スーパーグローバル変数 $_SESSIONへデータを保存する事でセッション情報を作成します。
変数 $_SESSIONはリクエスト変数$_GETや$_POSTと同様、連想配列の形式となっており
添字(キー)を指定して複数の値を保存、追加していく事が可能となっています。
同じキーを指定して値を代入する事で、先に保存された値を上書きすることも出来ます。
<?php session_start(); $_SESSION['id'] = 1; $_SESSION['name'] = "ken"; $_SESSION['mail'] = "XXXXX@gmail.com";
SAMPLE
クライアントから送信された値をセッション情報として保存し、複数ページを跨いで利用するサンプル
(遷移元)入力フォーム
<form action="/confirm.php" method="post"> <input type="checkbox" name="item[]" value="Jacket">Jacket <input type="checkbox" name="item[]" value="Pants">Pants <input type="checkbox" name="item[]" value="Denim">Denim <input type="checkbox" name="item[]" value="Shoes">Shoes <button type="submit">Submit</button> </form>
遷移先 1
(キー「item」の値は配列で保存する為、この場合の変数$_SESSIONは多次元配列となる)
<?php // confirm.php session_start(); $_SESSION['item'] = $_POST['item']; ?> <!DOCTYPE html> <html> <head> <title></title> </head> <body> <form action="/complete.php" method="post" id="demo-form"> <ul> <?php foreach($_SESSION['item'] as $key => $value) { echo "<li>" . $value . "</li>"; } ?> </ul> <button type="submit">Submit</button> </form> </body> </html>
遷移先 2
<?php // complete.php session_start(); echo "Submited Items..."."<br>"; foreach($_SESSION['item'] as $key => $value) { echo $value."<br>"; }
(注意)
変数$_SESSIONを利用する場合は
値の格納時も参照時も常に前もってsession_start関数を実行し、セッションを開始しておく必要があります。
セッション情報を破棄する
セッションで保存している情報が不要になったら以下の方法でクリアします。
(ログアウト機能やショッピングカートの内容を全て空にする等)
1. セッション変数を空にする。
(空の配列にする)
$_SESSION = []
(先のサンプルのように配列で持っている特定のセッションのみクリアする場合)
$_SESSION[‘item’] = []
2. セッションそのものを破棄する。
session_destroy関数を実行
session_destroy()
(1、2ともsession_start関数を実行しておく必要があります)
3. クッキーへ保存したセッションID(セッションクッキー )の削除も忘れずに行う。
setcookie関数を利用し、有効期限を過去に指定する事でブラウザに残ったセッションクッキーを削除します。
setcookie(session_name(), ”, time() – 3600, ‘/’)
1 ~ 3全部まとめると
<?php session_start(); $_SESSION = []; session_destroy(); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time() - 3600, '/'); }