WWWサーバーとブラウザはHTTPプロトコルでデータをやりとりする。サーバーはクライアントであるブラウザのリクエストに対し,レスポンスとしてデータを返す。サーバーとクライアントの対話はこれで完結してしまう。

 前回紹介した単語帳の追加フォームで,英単語,日本語,説明を入力し,追加ボタンをクリックするとpostメソッドでaction属性に指定したスクリプトに入力データが渡っていく。

----------------------------------------------------------

<form action="tango_add.php" method="post">

----------------------------------------------------------
 formタグに上記のように記述してあるからだ。このようにpostメソッドやgetメソッドを使うと他のスクリプトにデータを渡すことができる。しかし,逆に入力フォームに戻したいときに困ってしまうのだ。

 たとえば,actionに指定したスクリプトで下記のように未入力のチェックをしており,
----------------------------------------------------------

if($english == ""){
 exit ("英単語が入力されていません。<br> <a href='tangocho.php'>戻る</a>");
}
if($japanese == ""){
 exit ("日本語が入力されていません。<br> <a href='tangocho.php'>戻る</a>");
}

----------------------------------------------------------
 日本語が入力されていないとしたら,

のようにエラーメッセージが表示される。ここで「戻る」のリンクをクリックしたら,

 何も入力されていないページが表示されてしまう。WWWサーバーとしては新しいリクエストに対して新しいページを送り出しているだけにすぎないからだ。そこでセッション管理が必要になる。

 PHPのセッション管理は,クライアント個別のデータをサーバーに保存しておき,セッションIDというデータの識別子をクッキーを使って,クライアントに送ることで実現される。次にクライアントがサーバーにアクセスするときはセッションIDを伴ってアクセスする。

 イメージとしては,それぞれのクライアント専用のロッカーをサーバー上に作成して,そのロッカーを使うためのキー(ID)をクライアントに渡すような感じである。
 PHPではセッション処理関数を使うことで簡単にセッション管理ができる。セッションを開始するにはsession_start()関数を実行する。
 以下の入力フォームのスクリプトでは,先頭でsession_start()関数を実行している。次のif文のブロックで,セッション配列($_SESSION)の入力フィールドに対応する各要素に値が入っていたら(isset関数は値がセットされていたら真を返す),$enなどの変数に値を代入する。
----------------------------------------------------------

<?php
 session_start();
 if(isset($_SESSION['en'])){
  $en = $_SESSION['en'];
  }
 if(isset($_SESSION['ja'])){
  $ja = $_SESSION['ja'];
 }
 if(isset($_SESSION['intro'])){
  $intro = $_SESSION['intro'];
  }
?>
<html>
<head><title>単語帳―追加―</title></head>
<body>
<h1>単語帳―追加―</h1>
<h3>各項目入力してください。</h3>
<form action="tango_add2.php" method="post">
<table border="1" cellspacing="0">
<tr><td>英単語</td><td>
<?php
 print("<input type='text' name='english' value = '$en'>");
?>
</td></tr>
<tr><td>日本語</td><td>
<?php
 print("<input type='text' name='japanese' value = '$ja'>");
?>
</td></tr>
<tr><td>説明</td><td>
<?php
 print("<textarea name='introduce' rows='6' cols='40' value = '$intro'>");
 print $intro;
?>
</textarea>
</td></tr>
<tr><td colspan="2" align="center">
<input type="submit" name="submit" value="追加">
<input type="reset" value="リセット">
</td></tr></table>
</body>
</html>

----------------------------------------------------------
 そして,入力フォームに表示させるために <input type='text' name='english' value = '$en'>などとinputタグのvalue属性に,値を代入した変数を指定している。

 セッション配列に入力値を格納するのは追加ボタンをクリックしたときに実行されるtango_add2.phpである。
----------------------------------------------------------

<?php
 session_start();
?>
<html>
<head><title>単語の追加</title></head>
<body>
<?php
 $english = $_POST['english'];
 $japanese = $_POST['japanese'];
 $introduce = $_POST['introduce'];
 $_SESSION['en'] = $english; 
 $_SESSION['ja'] = $japanese;
 $_SESSION['intro'] = $introduce;
 if($english == ""){
  exit ("英単語が入力されていません。<br> <a href='tangocho2.php'>戻る</a>");
 }
 if($japanese == ""){
  exit ("日本語が入力されていません。<br> <a href='tangocho2.php'>戻る</a>");
 }
 $host = "localhost";
 if (!$conn = mysql_connect($host, "tuser", "tango")) {
  die("データベース接続エラー.<br />");
  }
 mysql_select_db("tango", $conn);
 $sql = "insert into tango_table(tenglish, tjapanese, tintro)
 values('$english', '$japanese', '$introduce')";

 mysql_query($sql, $conn) or die("登録できませんでした。");
 print("登録しました。");
 print("<a href='tangocho2.php'>戻る</a>");
 session_destroy();
?>
</body>
</html>

----------------------------------------------------------
 postメソッドで渡ってきた値を変数に取り,$_SESSION['en'] = $englishなどとしてセッション配列に格納している。このスクリプトの先頭でもsession_start()関数を呼び出していることに違和感を感じるかもしれないが,同じセッション内におくスクリプトは全てsession_start()関数を実行しなくてはならない。session_start()関数は文字通りセッションを開始させるだけでなく,セッションIDで識別されるセッションデータを使えるようにもしてくれるのだ。

 今回は全くこうしろうの出てこないMindStorms日記になってしまったが,この日記を書いている横でこうしろうは,単語帳をアプリケーションとして完成させようと,ぼちぼちとプログラミングを続けている。