PHPのセッションとは?$_SESSIONの使い方・ログイン例を解説

PR PHP

PHPのセッションとは?$_SESSIONの使い方・ログイン例を解説

💡 この記事でわかること

  • セッションとは何か、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"]);

💡 使い方は連想配列とほぼ同じです。存在しないキーの参照で警告が出るのを防ぐため、取り出しは ?? 初期値 を付けるのが安全です。

👉 PHPの配列・連想配列についての記事はこちら


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増やして表示する」カウンターを作ってみると、ページをまたいで値が残る感覚がつかめます。そこからログインの仕組みへ進むと理解しやすいです。

-PHP
-, , ,