form文の基本
GETとPOST
GETとPOSTの違いを説明する前に、method="get"とした場合、どのように記述すればいいのかを説明します。
method="get"とした場合は、PHP側で受け取る連想配列名が$_GETになります(図2-1)。これだけです。前述のPOSTを使った方法が理解できていれば、GETを使った方法は、受け取る連想配列名が違うだけで、プログラムの記述方法は全く同じとなります。
それでは、GETとPOSTの違いについて説明していきましょう。図2-2にGETとPOSTの主な違いを記述しました。
まず、連想配列です。こちらは、既に説明していますように、PHPで受け取る連想配列がそれぞれ、GETが「$_GET」、POSTが「$_POST」になります。
送信方法は、GETの場合、URLで送ります。URLで送るということは、ファイル名(プログラム名)の後に「?」を付けて、データが続くということを意味しています。つまり、「ファイル名?名前1=値1&名前2=値2&名前3&値=3・・・」といったURLになります。
図2-2の場合、送信ボタンを押すと以下のようなURLになって、page1.phpにデータが送られます。
page1.php?txt=test&btn=%E9%80%81%E4%BF%A1
name属性(txt,btn)が名前1、名前2に相当し、入力された値("test"の文字と"送信"の文字がエンコーディングされた値)が値1、値2に相当します。
入力された値とは、厳密にはvalue属性の値になるので、"btn="の値は、"送信"の文字がエンコーディングされた値である「%E9%80%81%E4%BF%A1」が入ります。日本語をそのままURLに入れることはできないので、自動でエンコーディングされた値が入るようになっています。
POSTで送る場合は、URLは「page1.php」のみになり、送った文字がどのようなものか一般の人には見ることができません。
データ量に関しては、GETの方がURLに入る文字数に制限があるために、長いデータが入ると途中で切れてしまう可能性があります。大きなデータを送信する場合は、データ量に制限の無いPOSTを使うことになります。
POSTの場合は送信するページが必ず必要ですが、GETの場合はURLでデータを送ることができるので、送信データをURLに入れることができれば、送信ページは必要なくなります。
例えば、Googleでflowerの検索結果を表示するには、URLの「q=」の後に検索キーワードを入れてあげればいいので、URLは「http://www.google.co.jp/search?q=flower」となります。
セキュリティーの面から見ると、URLに入力文字が見えてしまうGETは、重要な情報(例えばパスワードや個人情報など)を送るのに適していません。この場合は、POSTを使うようにします。
また、method属性を省略すると、自動的にGETで送信することになります。
日本語送信の場合、GETを使うと前述のように自動でURLエンコーディングされますので、エンコーディングのことは意識する必要が無いのですが、先ほどの例のように、「送信」の文字が「%E9%80%81%E4%BF%A1」のようになることは知っておくとよいでしょう。
テキストエリア、リストメニュー
ここからは、formの要素の受け渡しについて説明していきます。今までの話が理解できていれば、これ以降は容易に理解できます。
ポイントは、「フォームの部品に出てくるname属性がPHPで受け取る時の連想配列($_POST,$_GET)のキーになり、value属性が連想配列の値になる」というところです。
まずは、テキストエリアから説明しましょう。テキストエリアを作成する時のHTMLは下記のようになります。
<form action="page1.php" method="post">
<textarea name="txt2"></textarea>
<input type="submit" name="btn" value="送信" />
</form>
データを受け取るpage1.phpは次の通りです。
<?php
$a2 = $_POST["txt2"];
?>
ブラウザ表示は図2-3となります。
前述のテキストフィールドが単一行しか入力できないのに対して、テキストエリアは、複数行のテキストを入力することができます。PHPでは、上で示したpage1.phpのように、テキストの入力値を$_POST["txt2"]で受け取ることができます。
リストメニューも同じように考えることができます(図2-4)。
<form action="page1.php" method="post">
<select name="country">
<option value="Japan">日本</option>
<option value="China">中国</option>
<option value="Korea">韓国</option>
</select>
<input type="submit" name="btn" value="送信" />
</form>
HTMLの記述は、上記のように<select>にname属性を設定し、<option>タグにはvalue属性を設定します。リストメニューでは、複数の<option>タグを設定しますが、選択されたvalue属性の値が、下記のpage1.phpに送信されます。
<?php
$a3 = $_POST[" country "];
?>
つまり、図2-4のように日本が選択されたら、該当する<option>で設定されたvalue属性の値が送信されるので、PHP側では、$_POST["country"]という連想配列に「Japan」という値がセットされるのです。