[HTML]formのmethodによる挙動の違い

Read More

formのmethodにはpostかgetかを指定することができる。


指定した値によって挙動に違いが出てくるので以下にまとめる。


まずmethodにpostを指定しているとactionのURIにクエリ文字列としてget値を付与することができる。


■method="post"の例
<form action="http://example.com?m=hoge" method="post">
 <input type="submit" name="btn_submit" value="submit" />
</form>



■実行結果
GET:
array (
  'm' => 'hoge',
)

POST:
array (
  'btn_submit' => 'submit',
)


このようにmethod=postの状態だとpostとgetの2種類の値を受け取ることができる。




一方、methodにgetを指定しているとURIにget値を付与してもその値は渡されない。
# methodが無指定でもgetとなる

■method="get"のダメな例
<form action="http://example.com?m=hoge" method="get">
 <input type="submit" name="btn_submit" value="submit" />
</form>



■実行結果
GET:
array (
  'btn_submit' => 'submit',
)

POST:
array (
)


実行結果を見てもらえばわかるようにm=hogeの値がどこにもない。

これはinputなどのform内のコントロールから渡される値が、
GETパラメータとしてURIの末尾に付与されることと関係する。


m=hogeをget値として渡したい場合は以下のようになる


■method="get"の正しい例
<form action="http://example.com" method="get">
 <input type="hidden" name="m" value="hoge" />
 <input type="submit" name="btn_submit" value="submit" />
</form>



■実行結果
GET:
array (
  'm' => 'hoge',
  'btn_submit' => 'submit',
)

POST:
array(
)





あとpostとgetでは扱えるデータ量も違う。

getはブラウザ、Webサーバソフトによるバイト制限があるのに対し、
postにはその制限がない。

getのデータ制限についてはこちらのサイトがイイ感じ↓
http://d.hatena.ne.jp/Kazumi007/20090921/1253501500

ちなみにLimitRequestLine ディレクティブを使えば制限値を変更できるとあるが、変更する時はよほど大きなシステムで、かつ利用者、使うブラウザ、サーバ環境が固定されている状態の場合のみ。

そうでないのなら基本的に与えられたデフォルト環境で努力すべきであると思う。


つまりtextareaのような大容量のデータを送信する必要がある場合は、
問答無用でpostの方が良いというわけことになる。


またinput=fileとする場合はenctype=multipart/form-dataを指定するが、これが有効になるのはmethod=postの時だけだというのを忘れてはならない。






■まとめ
・methodが無指定の時はデフォルトでgetとなる
・method=post時にはactionのURIにget値を付与することができる
つまりmethod=post時にはpost値の他にget値を渡すことができる
・method=get時にはactionのURIにget値を付与しても無意味
・method=get時にpost値を渡すことはできない
・大容量のデータを送る可能性がある時はmethod=postにする
・fileアップロードが使えるのはmethod=postの時だけ


Category "HTML・JS・CSS" の最新記事