formタグのactionとmethod…
HTML/CSSの学習をしていた頃、一体これらに何の意味があるのか全く分かりませんでしたよね。
今夜、ついにその謎が明らかに!
形だけだったフォームが、ついに動き出す…!
まずはフォームを作りましょうか
まずは「index.php」という名前のファイルを作成し、適当にフォームを作りましょうか。
そして用意したものがこちらです。
<p>GETで送信</p>
<form action="jump.php" method="GET">
<input type="text" name="hey" placeholder="何か適当に入力">
<button type="submit">送信</button>
</form>
<p>POSTで送信</p>
<form action="jump.php" method="POST">
<input type="text" name="hey" placeholder="何か適当に入力">
<button type="submit">送信</button>
</form>
フォームでのGETとPOSTの記述の違いは、method部分だけ。
あとは全く同じです。
フォームタグ action=”” とは
action=”パス”は、フォームを送信した際にジャンプするリンク先を設定する場所です。
今回のサンプルでは action=”jump.php” と設定されている。
つまり、同階層(index.phpと同じフォルダ内)の jump.php へジャンプします。
フォームタグ method=””とは
method=””は、フォームに入力された情報を、どのような方法で入力した情報を送信するのかというもので、””の中には「GET」か「POST」が入ります。
デフォルトがGETなので、GETの場合 method=”GET” は省略してもOK
サンプルは見分けがつきやすいように記入しました。
GETとPOSTの違いについては、ジャンプ先のページを作って実際に体験してみよう。
GETとPOSTを体験する
「index.php」が入っているフォルダに「jump.php」を作成して、下記をコピペしてみよう。
<!-- GETで値が送信された場合 -->
<?php if(!empty($_GET['hey'])): ?>
<p>GETで情報が届きました!</p>
<p>「<?php echo htmlspecialchars($_GET['hey'], ENT_QUOTES); ?>」</p>
<!-- GETが空の場合 -->
<?php else: ?>
<p>GETでは何も届いていません。</p>
<?php endif; ?>
<!-- POSTで値が送信された場合 -->
<?php if(!empty($_POST['hey'])): ?>
<p>POSTで情報が届きました!</p>
<p>「<?php echo htmlspecialchars($_POST['hey'], ENT_QUOTES); ?>」</p>
<!-- POSTが空の場合 -->
<?php else: ?>
<p>POSTでは何も届いていません。</p>
<?php endif; ?>
これで、index.php で入力した値がしっかりと jump.php へ送信されているのが確認できます。
GETで送った時のURLに注目
GETでフォームを送信した場合、URLの末尾が
?hey=入力した値
となっていますね。
つまり、GETはURLに情報を載せて送るのです。
そしてフォームに頼らずとも、URLの値を書き換えるだけで結果も変わります。
それに対し、POSTの場合末尾に何もつかないですね。
POSTは見えないところでこっそりと情報を送っています。
GETとPOSTの使い分け
GETとPOSTの違いがわかったところで、どのようにして使い分けるのでしょうか?
GETは結果のブックマークやシェアができる
GETはURLに情報を載せて結果を表示するため、URLさえわかっていればいつでもどこでも誰でも全く同じ結果を見ることができます。
最も目にする用途としては検索フォームが挙げられますね。
このホームページのサイドバーに検索フォームがあるので、実際に検索して検索結果のURLを見てみましょう!
基本的にはPOSTを使う
GETは良くも悪くも情報が丸見えになり、シェアまでできてしまいます。
そのためパスワードや個人情報など、大切な情報を扱う場合は必ずPOSTを使いましょう。
そのため、ログインや問い合わせフォームにはPOSTが使われます。
GETを使う理由がない限りは、POSTを優先して使うのがベターです。
取得方法とポイント
GETやPOSTで送られてきた情報の取得方法を紹介します。
$_GET['inputのname属性']
$_POST['inputのname属性']
これだけで取得ができ、あとは echo で出力するだけです。
ただいくつか大切なポイントがあります。
<!-- POSTで値が送信された場合 -->
<?php if(!empty($_POST['hey'])): ?>
<p>POSTで情報が届きました!</p>
<p>「<?php echo htmlspecialchars($_POST['hey'], ENT_QUOTES); ?>」</p>
<!-- POSTが空の場合 -->
<?php else: ?>
<p>POSTでは何も届いていません。</p>
<?php endif; ?>
① 空でフォームが送信されたときのために結果を分岐させる
絶対にしなければエラーが〜というわけではないのですが、よく使われる処理です。
empty(値)
これは、値が空っぽかどうかを判定してくれます。
値が空っぽなら真となり、空でなければ偽となります。
ちなみに0も真と判定されるので注意が必要です。
PHPで分岐させずとも、inputタグ自身にrequiredをつけ、必須項目にして回避することもできます。
他にも例えば「正しい電話番号を入力してください」といった、入力値の内容によって分岐させたりもします。
この場合は正規表現を活用します。
② プログラミング言語を無効化する【超大事】
htmlspecialchars(値, ENT_QUOTES)
で、値部分を純粋な文字列に変換することができます。
はて一体なんのことやら…。
実際のところ、
<?php echo$_POST['hey']; ?>
これだけでも受け取った情報を出力することはできます。
しかし、フォームにJSやPHPなどのプログラミング言語を記述して送信すると、その記述が処理されてしまうという大問題を秘めている。
試しに、
<?php echo htmlspecialchars($_POST['hey'], ENT_QUOTES); ?>
の部分を
<?php echo $_POST['hey']; ?>
に変更して、
フォームから下記を送信してみましょう!
<script>alert('うぇい');</script>
ねえ、すごいでしょう?
これによる不正を回避するため、
htmlspecialchars(値, ENT_QUOTES)
を使って、全てを文字列に変換します。
仕込まれた言語を言語として処理するのではなく、文字列として出力するということなんですね。