実践! PHP講座 第5号

※ 手っ取り早くPHPを習得したい方へ

『マンモス本』として有名な本をお勧めします!

赤のマンモス本 – PHP4徹底攻略
青のマンモス本 – PHP4徹底攻略 実戦編

=======================
実践! PHP講座 第5号
=======================

あきらです。『実践! PHP講座』第5回を始めます。

今回からバックナンバーの公開を最新のみにしました。
いろいろ理由はありますが、1番の理由は読者数を把握するためです。

さて、前回はWebアプリを作成する上での文字の扱いについて説明しました。
これだけのことにけっこうノウハウがいるものです。

しかし、フォーム関連にはまだまだノウハウが必要です。
基礎技術なしに開発すると、後でクレーム処理で、エライ目にあいます。

それでは、今回も冷静に始めましょう!

————————————————–
フォーム攻略 ?リロード対策編?

VBなどのアプリケーションと、Webアプリケーションでは、操作性に大きな
違いがあります。
特にWebアプリケーションの操作性はブラウザに依存していますので、使い
にくいと言われる場合もあります。
しかし、現在もっとも利用されているアプリケーションはブラウザでしょう。
分厚いマニュアルが無くてもとりあえずの操作はほとんどの方ができます。

しかし、アプリケーションの立場では、少々困ったことになります。
ブラウザの更新・戻る・進むボタンを考慮する必要があるのです。
また、各ページはURLにより別々に呼び出せるので、一貫性のある操作(オンラ
イン注文など)の場合には、前後の関係を維持しなくてはなりません。

また、ログイン管理など、現在の状態を把握しておく必要が出てきます。

————————————————–
サンプルプログラム

今回もサンプルプログラムを用意したので、ダウンロードしてください。

02_reload.zip

前回同様に解凍し、移動します。

————————————————–
解説

それでは、解説して行きます。
ブラウザで確認しながら、エディタでプログラムソースを見てください。

[Step 1]

URL : http://localhost/akira/02_reload/step_1.php
PHP : C:Inetpubwwwrootakira2_reloadstep_1.php

前回の [step_6] と同様の物です。
一見まともそうですが、一度送信ボタンをクリックしてから、
ブラウザの更新ボタンをクリックしてください。

Firefox ではこのようなメッセージが表示されます。

「ページを表示するにはフォームデータを再度送信する必要があります。」

IE も同様です。
実害が無いと言えば無いのですが、できれば表示されないに越したことはあ
りません。
また、今回の講座の目的はセッション管理ですので、必要ないなんていわず
にお付き合いください。

[Step 2]

なぜこのようなメッセージが表示されるのか、理解しましょう。

ブラウザの立場で考えましょう。

(1) ブラウザは、このページはフォームデータを送信した結果だと記憶して
いる。
(2) ブラウザは、当然フォームデータを再度送信しないと正しい結果が返っ
てこないと考える。

上記のように、ブラウザとしては正しい動作だと言えます。

それでは、次の場合はどうでしょうか?

[Step 3]

URL : http://localhost/akira/02_reload/step_3.php
PHP : C:Inetpubwwwrootakira2_reloadstep_3.php

同様に、一度送信ボタンをクリックしてからブラウザの更新ボタンをクリッ
クしてください。今度はメッセージが表示されません。

なぜでしょうか?

実は、フォームの送信方法を post から get に変更したからです。
「なーんだ、対策終わりオワリ」
というわけにはいきません。

get メソッドには post メソッドよりも制約があります。
一番大きな制約は、送信できる文字数が少ないということです。
テキストボックスが複数あったり、ファイルのアップロードをしようとした
ら、すぐ制限にひっかっかってしまいます。

ですので、あくまで postパラメータでの対策が必要です。

上記で、ブラウザが postパラメータを再送信しようとするときに、意図しな
いメッセージが表示されることがわかりました。

対策は…
postパラメータを送信しないことです。どうやって?

[Step 4]

どうやって対策するのか検討しましょう。

手順を説明します。

(1) ブラウザから PHP にPOSTパラメータが送信される。
(2) PHP はPOSTパラメータをIDをつけてどこかに保存しておく。
(3) PHP はブラウザに COOKIE としてIDを渡す。
(4) PHP はブラウザに Location ヘッダーを送り、自分自身を再度呼び出す。
(5) ブラウザは Location ヘッダーにしたがい、COOKIEをPHPに渡す。
(6) PHPはCOOKIEのIDにより、保存したPOSTパラメータを取り出す。
(7) PHPは取り出したPOSTパラメータを元にページを出力する。

なんだかややこしいですね。
これを理解しておくとあとあと助かるんですが…
しかし、実践講座ですので、考えるより実践です!

実は、この手順はセッション管理としてPHPには標準で含まれています。

ちなみに、Location ヘッダーのURLに、getパラメータを設定すればいいじゃ
ん。
と、思ったあなた、鋭いですね!どうしてもCOOKIEが使えない場合、
その方法が使えます。
もっとも、IDが目に見えるので、セキュリティーはダメダメですが。

[Step 5]

URL : http://localhost/akira/02_reload/step_5.php
PHP : C:Inetpubwwwrootakira2_reloadstep_5.php

同様に、一度送信ボタンをクリックしてからブラウザの更新ボタンをクリッ
クしてください。今度はメッセージが表示されません。

$_POST[‘submit_1’] をチェックして、フォームが送信されたか判断していま
す。
これをしないと無限に自分自身を呼び出すことになります。

header(“Location: {$_SERVER[‘PHP_SELF’]}”);で自分自身をブラウザ経由で
呼び出しています。

しかし、値の保持ができていません。Location ヘッダーではpostパラメータ
を渡せないので、当然と言えば当然です。

[Step 6]

URL : http://localhost/akira/02_reload/step_6.php
PHP : C:Inetpubwwwrootakira2_reloadstep_6.php

セッションを使って値を保持しています。
ユーザ関数経由なのでちょっと分かりづらいかも知れません。

ここで、あきらの環境ではエラーが表示されました。
セッションデータ保持用に作成したフォルダのアクセス権がありません。
C:PHPsessiondata のセキュリティ設定をしましょう。
Evreryoneにフルコントロール権限を与えます。
同様に C:PHPuploadtemp も設定しておきます。

正しく実行されました。

ついでに、C:PHPsessiondata の中を見てみましょう。
sess_3dc59ea4da3d465ef44d37b767d895c0
などというファイルが出来ているはずです。
これが、セッション変数の保存場所です。
たくさんのユーザがセッションを使うには、ディスクの容量が必要なことが
解ります。

こんどはブラウザでCOOKIEを見てみましょう。
Firefoxでは、
「ツール」「オプション」「プライバシー」「COOKIE」「COOKIEを表示」
じぶんのマシン名の内容を見ると、暗号化して格納されています。

できてみれば、意外と簡単でしょ?
しかし、その裏の理屈を理解しているのがプロでしょう。

次は「フォーム攻略 ?ファイルアップロード編?」を計画しています。

— 今回のまとめ ———————————-
・リロード対策にはパラメータを保存する必要がある。
・PHPではセッショãƒ
³ç®¡ç†ãŒä½¿ãˆã‚‹ã€‚
・セッション管理の実態はIDをつけたファイルとCOOKIE。

————————————————–
それでは宿題です。あなた自身のために。

セッション関連を、PHPマニュアルで調べてください。
この講座の目的は生徒を作ることではなく、あなた自身の力をつけることです。

ぼちぼちと!

— 今回のTips ————————————
セッション管理の理屈がわかっていれば、自作することも可能です。
事実、Perl言語でセッション管理を実現するライブラリもあります。
Java言語でもクラスで実現しています。

PHPでもCOOKIEやテンポラリファイルを使えば自家製のセッション管理を
実現できます。あまりお勧めしませんが。
————————————————–


コメントを残す

メールアドレスが公開されることはありません。

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください