HTMLにはセッション機能がありません。
セッションとは、簡単に言うとリクエスト間の繋がりです。
ある時ページAが呼び出され、次にページBが呼び出されたとして、そのAとBが同一人物から呼び出されたのか、それとも別人から呼び出されたのかがわかりません。
また、ページAからページBに情報を渡すといったこともできません。
要するにログイン認証のあるページが作れず、ショッピングカートも作れないということです。
それではあんまりなので、多くのサイトではPerlやPHP等の言語を用いてセッションを実装しています。
以下は、よく使われているセッションの仕組みです。
まずサーバ側で適当な文字列を用意し、クライアントのクッキーにセットします(セッションIDと呼ぶ)
クライアントはサーバにアクセスする度に、そのセットされたクッキーを送信します(ブラウザの仕様)
サーバ側ではクライアントが送ってきたセッションIDをチェックして、サーバに記録されているセッションIDと同じであれば同じクライアントのアクセスからだ、と判断します。
ショッピングカートを例に、実装の流れを考えてみましょう。
クライアントがカタログページにアクセスしてくる
・セッションIDを作成する
・クライアントのクッキーにセットする
クライアントが商品を注文した
・必要な情報を、セッションIDとセットにしてサーバで保存する
クライアントが買い物レジに移動した
・クライアントとサーバのセッションIDをチェックし、同じものを取り出して表示
以上のような流れとなります。
面倒そうですね。
上記の流れでは書いていませんが、実際には他にもセッションの有効期限を決めたり、不正なセッションIDがやってきた場合の処理など、実装しなければならないことがいろいろあります。
またセッションはセキュリティ上考慮すべき点も多いので、毎回考えながら行うのは大変です。
特にセッションIDが他者に漏れたりすると買い物され放題なので、実装には十分注意しなければなりません。
Perlではこのあたりの処理も自力で実行しなければなりません。
CGI::Session等のモジュールもありますが、それでも実装するにはやや敷居が高いのが実情です。
PHPでは、
session_start();
と書くだけであとはPHPが全ての管理を行ってくれます。
session_start();
と書くことで使えるようになるスーパーグローバル変数があります。
$_SESSIONです。
普通のローカル変数同様、普通に代入するだけで使えます。
自動的にクライアント毎に内容が振り分けられ、Perlで必要だったクライアントのセッションIDとサーバのセッションIDをチェックして云々、という処理が一切必要ないという恐ろしく便利な変数です。
フォームのスクリプトa.htmlとa.php、およびそれとは何の関係もないb.phpを用意します。
http://yuubiseiharukana.creativeroot.jp/php1/a.html
<form action="a.php" method="POST"> <input type="text" name="userid"> <input type="text" name="pass"> </form> |
http://yuubiseiharukana.creativeroot.jp/php1/a.php
<?php session_start(); $_SESSION['userid']=$_POST['userid'] $_SESSION['pass']=$_POST['pass'] ?> |
http://yuubiseiharukana.creativeroot.jp/php1/b.php
<?php session_start(); print_r($_SESSION); ?> |
a.htmlでフォームを登録した後、適当に他のサイトを見て回った後でb.phpにアクセスすると、a.phpでセットした変数がしっかり表示されます。
有効期限は設定で変更できますが、デフォルトはブラウザを閉じるまでです。
他にもセッション名を指定する関数session_name()やセッションIDを取得する変数session_id()等セッションに関するいろいろな関数がありますが、使用法についてはまたそのうち。
ちなみにsession_start();しないとsession_id()は取得できませんが、クッキー自体は毎回送信されているはずで、実際$_COOKIE['PHPSESSID']で取得できます。