WebプログラミングU PHP

 目次へ 前へ 次へ

2011/10/4 久米

 

3 PHP応用

3.3 セッション管理

3.3.1 セッション管理が必要な理由

通常、Webサーバからみると貴方は毎回一見客です

ブラウザ   Webサーバ
こんにちは田中です。  
  いらっしゃいませ田中様。
いいお天気ですね。  
  はじめましてどちら様ですか?
田中ですが。  
  いらっしゃいませ田中様。
このみたらしだんご3本ください。  
  ありがとうございます。どちら様ですか?
がーーん。  
  どちら様ですか?

セッション管理を使うとブラウザを閉じるまで、Webサーバは貴方を覚えていてくれる。

ブラウザ   Webサーバ
こんにちは田中です。  
  いらっしゃいませ田中様。
(整理券3808番を渡す)
いいお天気ですね。
(整理券3808番を見せる)
 
  (整理券3808番を確認)
どぴーかんですね田中様。
このみたらしだんご3本ください。
(整理券3808番を見せる)
 
  (整理券3808番を確認)
ありがとうございます田中様。
(みたらしだんご3個をメモ)
イチゴのショートケーキ1つください。
(整理券3808番を見せる)
 
  (整理券3808番を確認)
ありがとうございます田中様。
(イチゴのショートケーキ1つをメモ)
おいくらですか。
(整理券3808番を見せる)
 
  (整理券3808番を確認)
(メモを確認)
ありがとうございます田中様。
合計300円です。

セッション管理機能を使うと、複数のページにわたって所望の情報を維持し続けることができます。

 

3.3.2 セッション管理の方法

セッション管理は次の2つで実現できます。参照 PHPセッション管理

1

セッション管理を使用するページに下記を記述する。
  session_start();
HTML文を出力する手前に記述する。
セッション管理機能を使うよという意味です。

<?php
    session_start();
?>
2

セッション管理中に複数のページにまたがって
共有したい変数は次の書式を使用する。
  $_SESSION['変数名']
代入や読み出しができる。
ページの先頭でなくても、どこに書いてもOK。

<?php
    session_start();
    $_SESSION['username'] = $_POST['username'];
?>
<?php
    $_SESSION['username'] = $name;
    print "<p>いらっしゃいませ。".$_SESSION['username']."様</p>";
?>

では、試してみましょう。

session1.htm
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>session1</title>
</head>

<body>
<h1>銀座コージーコージー</h1>
<form method="post" action="session2.php">
名前:<input type="text" name="username"> 
<input type="submit" name="sub" value="お店に入る">
</form>
</body>
</html>
session2.php
<?php
    session_start();
    $_SESSION['username'] = $_POST['username'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>session2</title>
</head>

<body>
<h1>銀座コージーコージー</h1>
<?php
    print "<p>いらっしゃいませ。".$_SESSION['username']."様</p>";
?>
<form method="post" action="session3.php">
みたらしだんご <select name="mitarashi">
    <option value="0" selected>何本?</option>
    <option value="1">1本</option>
    <option value="2">2本</option>
    <option value="3">3本</option>
  </select><br><br>
<input type="submit" name="sub" value="買う">
</form>
</body>
</html>
session3.php
<?php
    session_start();
    $_SESSION['mitarashi'] = $_POST['mitarashi'];
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>session3</title>
</head>

<body>
<h1>銀座コージーコージー</h1>
<?php
    print "<p>ありがとうございます。".$_SESSION['username']."様</p>";
?>
<p>おいしいショートケーキもありますよ。</p>
<form method="post" action="session4.php">
イチゴのショートケーキ <select name="ichigo">
    <option value="0" selected>何個?</option>
    <option value="1">1個</option>
    <option value="2">2個</option>
    <option value="3">3個</option>
  </select><br><br>
<input type="submit" name="sub" value="買う">
</form>
</body>
</html>
session4.php
<?php
    session_start();
    $_SESSION['ichigo'] = $_POST['ichigo'];
    
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>session4</title>
</head>

<body>
<h1>銀座コージーコージー</h1>
<?php
    print "<p>ありがとうございます。".$_SESSION['username']."様</p>";
?>
<p><a href="session5.php">おいくらですかと聞く</a></p>
</body>
</html>
session5.php
<?php
    session_start();
    $gokei=$_SESSION['mitarashi']*40+$_SESSION['ichigo']*180;
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>session5</title>
</head>

<body>
<h1>銀座コージーコージー</h1>
<?php
    print "<p>ありがとうございます。".$_SESSION['username']."様</p>";
    print "<p>合計 ".$gokei."円です。</p>";
    $_SESSION=array();
    session_destroy();
?>
</body>
</html>

※最後の2行はサーバ側のセッションデータを棄却するスクリプトです。
$_SESSION=array();
session_destroy();
セッションデータを使わなくなったら、削除しておいた方がベターです。
手動で棄却しなくても、いつか自動的に削除されますが。

 

コラム1 セッション変数

セッション管理中に変数を共有する方法には、次の2種類があります。

  • $_SESSIONを使用する方法
  • session_register()関数を使用する方法

PHPで推奨されているのは、$_SESSIONの方法です。そのため、本講義では、$_SESSIONの方法を使用します。

参照:PHPマニュアルより抜粋「セキュリティとコードの可読性のために$_SESSIONの使用 が推奨されます。
$_SESSIONの場合、 session_register(), session_unregister(), session_is_registered()は不要です。
ユーザは、 通常の変数と同様にセッション変数にアクセス可能 です。 」

 

コラム2 セッションデータはどこに格納?

php.iniに書かれている設定によります。
デフォルトでは、 session.save_path = C:\PHP\sessiondata
となっていますので、 C:\PHP\sessiondataの中に格納されます。

使われなくなったセッションデータは、デフォルトでは、
ガーベージコレクト(100リクエスト程度で起動)されたときに削除されます。

 

コラム3 携帯はクッキーが使えない(スマホはOK)

携帯でセッション管理を実現する方法は下記の2つです。
クッキーが使えないので、FormタグかURL変数にセッションIDを入れてあげます。

  1. Formタグ
    <input type="hidden" name="<? print strip_tags(session_name()); ?>" value="<? print strip_tags(session_id()); ?>">
  2. URL変数
    <a href="next.php?<? print strip_tags(SID); ?>">次ページ</a>

 

コラム4 クッキー無効にしている人の対策

  1. セッション変数が設定されているかどうか判定してif(isset($_SESSION['username'])、
    設定されていなければ、 「クッキーを有効にして下さい」のメッセージを表示する。
  2. セッション変数が設定されているかどうか判定して、
    設定されていなければ、 コラム3の方法を実施する。
  3. PHPの設定パラメータ「session.use_trans_sid」を1に設定しておく。
    こうすると、クッキーが使えない場合、サーバが自動的にコラム3の方法を行ってくれる。