連載
» 2007年03月09日 00時00分 公開

サンプルで理解! フォームデータの受け渡し今から始める MySQL入門(3)(3/3 ページ)

[鶴長鎮一,@IT]
前のページへ 1|2|3       

サーバ側でデータを保持する方法

サンプルのダウンロードと実行

 次に、サーバ側でデータを保持する方法です。sample2のソースファイルをダウンロードして、Apacheのドキュメントルートに展開してみましょう。

サンプルダウンロード:

sample2のtarアーカイブ


# cd /var/www/html/(ソースからインストールした場合は/usr/local/apache2/htdocs/)
# tar xvfz /..pathto../sample2.tgz

 展開後、ブラウザで「http://サーバ/sample2/menu.php」にアクセスすると実際に動作を確認できます(注)

注:起動イメージは「画面1 sample1の実行画面」と同様です。


解説

 先に紹介したsample1では、<input type="hidden"...>タグを多用しました。それにより発生する問題点(危険性)も先に述べたとおりです。本節では、サーバ変数を利用してサーバ側で各画面間のデータを管理する方法を解説します。

 サーバ側で変数を管理するために「セッション変数」を利用します。クライアントが再接続すれば、セッション変数の寿命の範囲で再び前の状態を復元できます。また、サーバ側でデータを保持するため、改ざんの危険がなくなります。セッション変数を利用する際、サーバはクライアントに一意なセッションIDを発行して、そのセッションIDを基にデータを保管します。

 また、クライアントはCookieを用いセッションIDを保持します。Cookieを使用できないモバイル端末のブラウザなどでは、URLにセッションIDを埋め込む方法が取られますが、URLは簡単に盗聴できてしまうので限定された環境でない限り使用しない方がよいでしょう(コラム2参照)

 sample2では、前回紹介した共通処理で要求されている事項をPHPで実現しています。また、先に解説したsample1との差異にも注目してください。

  • 確認画面(confirm.php)
    • 注文番号をセッション変数から$_SESSION["order_id"]で取得。注文番号がセットされていなければ強制終了
    • 選択された各アイテムの個数を$_POST[]で取得して、$_SESSION["apache"]、$_SESSION["qmail"]、$_SESSION["mysql"]、$_SESSION["bind"]に格納
    • 氏名と住所をそれぞれ$_SESSION["name"]、$_SESSION["address"]に格納
  • 完了画面(purchase.php)
    • 注文番号を$_SESSION["order_id"]で取得。注文番号がセットされていなければ強制終了
    • 選択された各アイテムの個数を$_SESSION["apache"]、$_SESSION["qmail"]、$_SESSION["mysql"]、$_SESSION["bind"]で取得、また、氏名と住所それぞれを$_SESSION["name"]、$_SESSION["address"]で取得

コラム2 PHPのセッション設定

php.iniファイルの[Session]セクションでセッション変数に関する多くの値を設定できます。以下のようにすれば、PHPでURLにセッションIDを埋め込まないようにできます。

session.use_trans_sid = 0

また、以下のようにセッションデータの保存先(デフォルトは「/tmp」)を指定できます。

session.save_path = "/tmp";

メニュー画面(menu.php)

 sample1では、「/tmp/count.dat」から注文番号を生成した後、<input type="hidden">タグに埋め込みましたが、sample2では、セッション変数に格納してサーバで値を保管します。

 以下、sample2の「メニュー画面(menu.php)」でポイントとなる個所を解説します。

1   <?php
(省略)
17  session_start();
18  $_SESSION["order_no"] = $order_no;
19  ?>
(省略)

17〜18行目

 セッション変数を利用するには「session_start()」でセッション処理を開始します(17行目)。次に「$_SESSION["キー名"] = "内容"」を利用しセッション変数に注文番号を格納します(18行目)。PHPではこれだけの処理で、セッション変数を利用できます。そのため、フォーム中に<input type="hidden">タグで値を埋め込む必要は ありません。

確認画面(confirm.php)

 続いて、sample2の「確認画面(confirm.php)」でポイントとなる個所を解説します。

1   <?php
2   session_start();
3   $_SESSION["apache"] = $_POST["apache"];
4   $_SESSION["qmail"] = $_POST["qmail"];
5   $_SESSION["mysql"] = $_POST["mysql"];
6   $_SESSION["bind"] = $_POST["bind"];

8   isset($_SESSION["order_no"]) or die("不正な呼び出しです");
9   ?>
(省略)

2〜8行目

 各アイテムの注文個数を読み取り、セッション変数に格納します(3〜6行目)。セッション変数への格納は、メニュー画面(menu.php)で説明したとおりです。

 メニュー画面(menu.php)で記憶させた注文番号を取り出すのに、特に複雑な手順は必要ありません。session_start()でセッション処理を開始していれば(2行目)、$_SESSION["キー名"]で参照可能です。注文番号なら$_SESSION["order_no"]で値を利用できます。注文番号の有無を確認するisset()も$_SESSIONに対して行います(8行目)

完了画面(purchase.php)

 最後に、sample2の「完了画面(purchase.php)」でポイントとなる個所を解説します。

1   <?php
2   session_start();
(省略)
41  $_SESSION = array();
42  session_destroy();
43 
44  ?>
(省略)

41、42行目

 $_SESSIONを利用している以外にsample1と大きな変更点はありません。しかし、sample2の場合、受注完了後にセッション変数が不要になるため破棄する必要があります。セッション変数を破棄するには、連想配列である$_SESSIONの各要素を消してから(41行目)、「session_destroy()」で不要になったセッション変数とセッションIDを解放します(42行目)

 セッション変数を解放すれば、ブラウザの[戻る]ボタンで前画面に戻っても「ページの有効期限が切れている」「キャッシュの有効期限が切れている」などと表示されて、二重処理を防ぐことができます。

問題点

 セッション変数を利用したことで、クライアント側でのデータ改ざんの危険性が減り、フォームをまたいだ値の受け渡しも簡単になりました。しかし注文番号の読み込みや、受注内容の書き出しなどのファイル操作は面倒です。特にほかの操作との競合を防ぐための排他処理や取り出した値の操作が複雑です。

関連リンク:

PHP4で作るWeb-DBシステム
http://www.atmarkit.co.jp/flinux/php4/php4_1/php1.html

オブジェクト指向言語に生まれ変わるPHP5[前編]
http://www.atmarkit.co.jp/flinux/special/php5/php5a.html

オブジェクト指向言語に生まれ変わるPHP5[後編]
http://www.atmarkit.co.jp/flinux/special/php5/php5c.html



 いかがでしたでしょうか? 今回は、2つのサンプルを例にフォームデータの受け渡し方法を説明しました。

 次回からは、MySQLを利用したデータの受け渡し(参照/登録)方法を紹介します。いよいよMySQLの登場ですが、まずはMySQLの基礎知識と基本操作について説明します。(次回に続く)


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。