💡 この記事でわかること
- セッションとは何か、Cookieとの違い
session_start()の使い方と、呼ぶ位置の注意点$_SESSIONでの値の保存・取り出し・削除- ログイン状態の保持と、ログアウト処理の書き方
- セッションを安全に使うためのポイント
1. セッションとは?
セッションとは、
👉 ページを移動しても消えない「ユーザーごとの一時的な保管場所」です。
PHPの変数はページの表示が終わると消えてしまい、次のページには引き継がれません。「ログインした状態」「買い物カゴの中身」のように、複数のページをまたいで情報を持ち続けたいときにセッションを使います。
- 実際のデータはサーバー側に保存される
- ブラウザには「どのセッションか」を示すIDだけがCookieで渡される
👉 PHPのフォーム処理($_POST・htmlspecialchars)についての記事はこちら
2. セッションを開始する(session_start)
👉 セッションを使うすべてのページで、いちばん最初に session_start() を呼びます。
<?php
session_start();
// このあとで $_SESSION が使える💡 session_start() は、HTMLや echo など「画面への出力」より前に呼ぶ必要があります。<?php の前に空白や改行が1つでもあると「headers already sent」という警告が出てセッションが動かないので、ファイルの先頭にすき間なく書きます。
3. 値の保存・取り出し・削除($_SESSION)
$_SESSION は連想配列です。キーを決めて値を入れると、次のページでも同じキーで取り出せます。
<?php
session_start();
// 保存
$_SESSION["user"] = "太郎";
$_SESSION["count"] = 1;
// 取り出し(なければ初期値)
echo $_SESSION["user"] ?? "ゲスト";
// 更新
$_SESSION["count"]++;
// 1つ削除
unset($_SESSION["count"]);💡 使い方は連想配列とほぼ同じです。存在しないキーの参照で警告が出るのを防ぐため、取り出しは ?? 初期値 を付けるのが安全です。
4. 使用例:ログイン状態を保持する
「ログイン処理」と「ログインが必要なページ」を、セッションでつなぐ流れを見てみます。
login.php(ログイン処理)
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] === "POST") {
// 実際はDBに保存したハッシュを password_verify() で照合する。
// ここではセッションの流れを見るための簡略版。
if (($_POST["password"] ?? "") === "secret") {
session_regenerate_id(true); // ログイン時にIDを作り直す(対策)
$_SESSION["login"] = true;
$_SESSION["user"] = "太郎";
header("Location: mypage.php");
exit;
}
$error = "パスワードが違います";
}mypage.php(ログインが必要なページ)
<?php
session_start();
if (empty($_SESSION["login"])) {
header("Location: login.php"); // 未ログインなら追い返す
exit;
}
echo htmlspecialchars($_SESSION["user"], ENT_QUOTES, "UTF-8") . "さん、ようこそ";👉 ログイン時に $_SESSION["login"] を立て、保護したいページの先頭で empty($_SESSION["login"]) を確認する、というのが基本パターンです。header("Location: ...") でページを移動させたあとは、必ず exit; で処理を止めます。
5. ログアウト(session_destroy)
<?php
session_start();
$_SESSION = []; // セッション変数を空にする
session_destroy(); // サーバー側のセッションデータを破棄する
header("Location: login.php");
exit;$_SESSION = []:今読み込んでいるセッション変数をすべて消すsession_destroy():サーバーに保存されたセッションそのものを削除する
6. Cookieとの違い
| セッション | Cookie | |
|---|---|---|
| データの保存場所 | サーバー側 | ブラウザ側 |
| ユーザーによる書き換え | できない(IDのみ渡す) | できてしまう |
| 保持できる期間 | ブラウザを閉じるまでが基本 | 期限を指定できる(数日〜数か月) |
| 向いている用途 | ログイン状態・カートなど | 「次回もこの言語で表示」などの軽い設定 |
<?php
// Cookie は setcookie() で作る(有効期限は秒で指定)
setcookie("lang", "ja", time() + 60 * 60 * 24 * 30); // 30日間
echo $_COOKIE["lang"] ?? "未設定";💡 Cookieはユーザーが中身を見たり書き換えたりできるため、パスワードや「ログイン済みかどうか」などの重要な情報を直接入れてはいけません。そうした情報はセッションで扱います。
7. セッションを使うときの注意
session_start()は出力より前に:ファイル先頭の<?phpの前に空白・改行を入れない- 使うページ全部で
session_start():呼び忘れたページでは$_SESSIONが空になる - ログイン成功時に
session_regenerate_id(true):セッションIDを固定される攻撃(セッションフィクセーション)への対策 - 表示する値は
htmlspecialchars():セッションに入れた値も、画面に出すときはエスケープする - パスワードは平文で持たない:照合は
password_hash()/password_verify()を使う
8. まとめ
- セッションはページをまたいで値を保持するしくみ。データはサーバー側
- 使うページの先頭で
session_start()(出力より前に) - 値の読み書きは
$_SESSION["キー"](連想配列と同じ) - ログインは「
$_SESSION["login"]を立てる → 保護ページでempty()判定」 - ログアウトは
$_SESSION = []+session_destroy()
👉 まずは「アクセスするたびに $_SESSION["count"] を1増やして表示する」カウンターを作ってみると、ページをまたいで値が残る感覚がつかめます。そこからログインの仕組みへ進むと理解しやすいです。