12. パラメータの受け渡し
今日は、パラメータの受け渡しについてご説明いたします。
■パラメータについて
パラメータとは、一言で言うと、クライアントが送ってくるデータのことです。
ホームページを見るユーザは、最初にURLを指定して、リクエストというものを
送ってきます。
これを受け取ったサーバは、要求されたページをクライアントに対して返します。
これをレスポンスといいます。
よくアンケートフォームなどで名前や住所などを入力して送信すると、リクエストに
名前や住所のデータがくっついてきます。これがパラメータになります。
また、クライアントが送るリクエストは、GETリクエストとPOSTリクエストに分ける
ことができます。
プログラムを作成する人にとって、GET送信とPOST送信の違いは常に認識して
おかなくてはなりませんが、詳しく説明すると長いので、ここでは簡単に説明
します。
ユーザが単純に、このページが見たいというリクエストの場合は、通常、GET送信に
なり、アンケートフォームなど、ユーザが入力したデータを送信する場合は、通常、
POST送信となります。
GETかPOSTかはホームページ作成者が自由に決められますが、ただ単に
<A HREF="・・・">でリンクしたものをクリックした場合は、GETリクエストに
なります。同様に、ブラウザのアドレスバーにURLを直接入力した場合も、GET
リクエストになります。
POSTリクエストを送らせるには、
<FORM ACTION="・・・" METHOD="POST">・・・</FORM>
というように、フォームタグを使用することでPOST送信になります。
GETやPOSTについては、レッスンを進めていくうちに理解していっていただければ
と思います。
■パラメータの渡し方
先にパラメータの渡し方を説明しておきます。
パラメータを渡すには、通常、HTMLの<FORM>タグを使用します。このページは
.htmlの普通のHTMLファイルで構いません。
-----------------------------------------------------------------
<FORM action="test.php" method="post">
<INPUT name="text1" type="text" value="test1">
<INPUT name="text2" type="text" value="test2">
<INPUT type="submit" value="送信">
</FORM>
-----------------------------------------------------------------
この場合、POST送信になりますが、<FORM>タグのmethod="get"とすれば、
GET送信になります。
GET送信の場合、テキストボックスに"test1"、"test2"と入力して「送信」ボタンを
押すと、ブラウザのアドレスバーに
http://127.0.0.1/test.php?text1=test1&text2=test2
のような感じで、表示されると思います。(ページがなくても構いません)
この、"?"から後ろの文字がパラメータになります。
パラメータは、nameとvalue値に分けることができます。
nameは、<INPUT>タグ内のnameになります。value値は入力した値になります。
アドレスバーは、
(URL)?(name)=(value値)&(name)=(value値)&・・・・
と表示されています。
見て分かる通り、パラメータが複数ある場合は、"&"によって区切られます。
これに対し、POST送信の場合は、ブラウザのアドレスバーにパラメータは
表示されません。
POST送信のメリットは、大量のデータをクライアントから送ってもらうことが
できます。GETの場合は、パラメータの量に制限があります。
■パラメータの受け取り
PHPにおけるパラメータの取得方法は非常に簡単です。
$_GET[パラメータ名]
$_POST[パラメータ名]
で取得できます。
GETで送られてきたものは、$_GETに、POSTで送られたものは$_POSTで取得します。
これはハッシュ配列になっていますので、パラメータ名をキーとすれば、値を
取得できます。
-----------------------------------------------------------------
print $_POST["text1"];
print $_POST["text2"];
-----------------------------------------------------------------
上記のように、HTML側の<INPUT>タグで指定したNAMEがキーとなり、<INPUT>タグの
VALUEの値を取得することができます。
GET送信だった場合は、$_POSTが$_GETになります。
★今日のまとめサンプルプログラム
index.html
-----------------------------------------------------------------
<HTML>
<BODY>
<FORM action="test.php" method="post">
<INPUT name="text1" type="text" value="test1">
<INPUT name="text2" type="text" value="test2">
<INPUT type="submit" value="送信">
</FORM>
</BODY>
</HTML>
-----------------------------------------------------------------
test.php
-----------------------------------------------------------------
<HTML>
<BODY>
<?
print $_POST["text1"];
print $_POST["text2"];
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
Perlの場合は難しいですが、PHPの場合は特に解説が必要ないくらい簡単ですね。
GETにした場合なども試してみてください。
★課題
1. 以下のテキスト情報をPOSTで受け取って、HTML上に受け取ったデータを表示する
プログラムを作成してください。また、()の条件に合わない場合は、エラー
メッセージを表示するようにしてください。
・名前 (50バイトまで)
・郵便番号 (8バイトまで、半角数字・ハイフンのみ)
・住所 (255バイトまで)
・電話番号 (13バイトまで、半角数字・ハイフンのみ)
・メールアドレス (50バイトまで、"@"と"."が含まれている)
・コメント (255バイトまで)
2. 1の問題で受け取った情報をファイルに追加書き込みしていくプログラムを作成
してください。(カンマ区切り)
★前回の課題の解答
1. 以下の処理を行うプログラムを作成してください。
(1) "test.tmp"ファイルの存在を判別
(2) "test.tmp"が存在する場合は、"エラー"を表示して終了
(3) "test.tmp"に現在時刻を書き込む(yyyy/mm/dd hh:mm:ss)
(4) "test.tmp"のファイルサイズが 0 かどうかを判別
(5) "test.tmp"のファイルサイズを取得
(6) "test.tmp"を削除する
→下のサンプルを参照してください。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
$filename = "test.tmp";
// ファイルの存在を判別
if (file_exists($filename)) {
print "エラー";
exit;
}
// 書き込みモードでファイルオープン
$fh = fopen($filename, 'w');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}
// 現在時刻をファイルに書き込む
fwrite($fh, date("Y/m/d H:i:s"));
// ファイルクローズ
fclose($fh);
// ファイルサイズの判別
if (filesize($filename) > 0) {
print filesize($filename);
}
else { exit; }
// ファイルの削除
unlink($filename);
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
エラー発生時に、exit()のみにしていますが、エラー処理をきちんと行う方が
もちろん良いです。
ファイルハンドラは、必要のなくなった時点で、すぐにクローズするようにして
ください。
このプログラムは、ファイルを作成してすぐに削除していますが、ファイルが
作成されているかを確認するには、unlinkの行をコメントアウトします。
ファイルが存在していると、エラーとなることも確認してください。
2. 前回作成したアクセスカウンタのプログラムを変更し、ファイル書き込み時に
ファイルロックを行うように変更してください。
→下のサンプルを参照してください。
-----------------------------------------------------------------
<HTML>
<BODY>
<?
$filename = './count.txt';
// 読み込みモードでファイルオープン
$fh = fopen($filename, 'r');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}
// ファイル読み込み
while (!feof($fh)) {
$cnt = fgets($fh);
}
// ファイルクローズ
fclose($fh);
if ($cnt == "") {
$cnt = 0;
}
$cnt = $cnt + 1;
// 追加書き込みモードでファイルオープン
$fh = fopen($filename, 'a');
if (!$fh) {
print "ファイルオープンに失敗しました。 ".$filename;
exit;
}
// ファイルロック
flock($fh, LOCK_EX);
// ファイルの中身を削除
ftruncate($fh, 0);
// ファイル書き込み
fwrite($fh, $cnt);
// ファイルロック解除
flock($fh, LOCK_UN);
// ファイルクローズ
fclose($fh);
print $cnt;
?>
</BODY>
</HTML>
-----------------------------------------------------------------
■解説
ファイルを書き込みモードでオープンするやり方でもOKですが、上記の処理の
方が安全と言えます。
もっと安全やり方でトランザクション管理というものがありますが、これに
ついては、また別の機会にご説明します。
|