ここまで、こんなフォームを使ってきました。
<form method="post">
<input type="text" name="name">
<button type="submit">送信</button>
</form>
そしてPHPでは、
$name = $_POST['name'] ?? '';
として、入力された名前を受け取っていました。
たとえば入力欄に、
みのり
と入力して「送信」。
PHPでは、
$_POST['name']
から、
みのり
を取り出せる。
ここまでは、もうなんとなく分かります。
でも――。
そもそも「みのり」は、どうやってHTMLからPHPまで移動したのでしょう?
今回は、このデータを追いかけてみます。
まずHTML側を見てみよう
もう一度フォームを見ます。
<form method="post">
<input type="text" name="name">
<button type="submit">送信</button>
</form>
今回注目するのは、
method="post"
です。
今まで何となく書いていましたが、この post。
実はPHP側の、
$_POST
と関係しています。
つまり、
method="post"
で送ったものを、
$_POST
で受け取っていたわけです。
ちょっとつながってきました。
「送信」を押すと何が起こる?
フォームに、
みのり
と入力します。
そして「送信」を押します。
するとブラウザは、フォームに入力されたデータをWebサーバーへ送ります。
今回ならイメージとしては、
name = みのり
というデータです。
PHPはその送られてきたデータを、
$_POST
から確認できます。
流れにすると、
フォームへ入力
↓
「送信」を押す
↓
ブラウザがデータを送る
↓
Webサーバーが受け取る
↓
PHPが $_POST から読む
こんな感じです。
だから、
$_POST['name']
は、
POSTで送られてきたデータの中から、nameという名前のデータを取り出す
という意味になります。
じゃあ「name」はどこから来た?
ここでもう一つ疑問です。
なぜ、
$_POST['name']
なのでしょう?
PHPが勝手に name と名付けたわけではありません。
答えはHTML側にあります。
<input type="text" name="name">
ここです。
name="name"
と書かれています。
この name 属性が、
送信するときのデータの名前
になります。
たとえば、
<input type="text" name="email">
なら、PHPでは、
$_POST['email']
として受け取れます。
つまり、
name="email"
と、
$_POST['email']
が対応しているわけです。
ここで、わざと間違えてみる
HTMLをこうします。
<input type="text" name="username">
でもPHPは、
$name = $_POST['name'] ?? '';
のまま。
するとどうなるでしょう?
HTMLから送られてくるのは、
username = みのり
です。
ところがPHPは、
$_POST['name']
を探しています。
名前が違います。
そのため、欲しい値を取得できません。
正しく対応させるなら、
$name = $_POST['username'] ?? '';
ですね。
フォームが動かないとき、
HTMLの
nameとPHPの$_POST['○○']が同じになっているか
を見る。
これだけでも原因を一つ探せるようになります。
今日の合格ライン
今回はこれです。
HTMLに、
<form method="post">
があれば、
POSTという方法でデータを送る。
入力欄に、
name="email"
があれば、
emailという名前で送る。
PHP側の、
$_POST['email']
は、
POSTで送られてきたemailを取り出す。
これが分かれば合格です。
つまり、
HTML
name="email"
↓ POSTで送信
PHP
$_POST['email']
というつながりです。
全部暗記しなくても、この関係がなんとなく分かれば十分です。
ところで「GET」って何?
ここで本題がもう一つあります。
フォームには、
method="post"
だけではなく、
method="get"
という書き方もあります。
POSTがあるならGETもある。
では何が違うのでしょう?
実際にやってみるのが一番早いです。
POSTをGETに変えてみよう
先ほどのフォームを、
<form method="get">
<input type="text" name="name">
<button type="submit">送信</button>
</form>
に変更します。
そして、
みのり
と入力して送信。
するとブラウザのアドレス欄が、環境によってはこんな感じになります。
https://example.com/form.php?name=みのり
後ろに、
?name=みのり
が付きました。
入力した文字がURLに出てきました。
GETはURLからも見える
GETで送信すると、データはURLのクエリ文字列として付加されます。
たとえば、
?name=みのり
なら、
name
という名前のデータに、
みのり
という値が入っているイメージです。
PHPでは、
$_GET['name']
として取得できます。
つまり、
<form method="get">
なら、
$_GET
です。
POSTと同じようにつながっています。
GETとPOST、どっちを使えばいい?
ここで、
GETとPOSTはどっちが正解なの?
と思いますよね。
どちらかが上位というわけではありません。
用途が違います。
かなりざっくり分けると、
GET
情報を取得したい・条件を指定したいとき
POST
データを送信して処理してほしいとき
という使い分けがよくあります。
GETが向いている例
分かりやすいのが検索です。
たとえば、
https://example.com/search?keyword=php
のようなURL。
検索条件がURLに残っています。
これは便利です。
URLをコピーすれば、
「PHPで検索した結果」
という状態を他の人へ渡せます。
ブラウザの戻る・進むやブックマークとも相性がいい。
商品の絞り込みなどでも、
?category=book
のようなURLを見かけます。
こうした用途ではGETが便利です。
POSTが向いている例
一方で、
- お問い合わせフォーム
- 会員登録
- ログイン
- データの登録
- 設定変更
など、
何かを送信して処理してもらう
場面ではPOSTがよく使われます。
今回の名前フォームなら、
<form method="post">
ですね。
じゃあパスワードはPOSTなら安全?
ここは大事です。
GETの場合、送信した値がURLに現れます。
だったら、
POSTならURLに出ないから安全!
と思ってしまいそうです。
でも、
POSTにしただけで安全になるわけではありません。
POSTのデータも通信として送られています。
重要な情報を扱うなら、HTTPSを使うことや、サーバー側で適切に処理することなど、別の安全対策が必要です。
今は、
GETよりURLに見えにくい=何でも安全
ではない。
これだけ覚えておきましょう。
AIに聞くときも、かなり具体的になってきた
ここまで知らない状態なら、
フォームが動きません。
とAIに聞くしかなかったかもしれません。
でも今なら、
HTMLフォームをPOSTで送信しています。
入力欄はname="email"です。
PHPでは$_POST['mail']で受け取っていますが、値が取得できません。原因を教えてください。
と聞けます。
これを見れば、
HTMLは
PHPは
なので、名前が一致していないことに気付けます。
AIも原因を見つけやすくなります。
人間が少し分かるようになるほど、AIも使いやすくなる。
この感覚が大事です。
ブラウザの開発者ツールでも見られる
もう一歩進めてみましょう。
ブラウザには、Web制作で非常に便利な**開発者ツール(DevTools)**があります。
ChromeやEdgeなどでは、Windowsなら一般的に F12 キーなどで開けます。
その中の、
Network
という場所を見ると、ブラウザがサーバーへ行った通信を確認できます。
フォームを送信すると、
「本当にPOSTで送られている?」
「どこへ送っている?」
「どんな応答が返ってきた?」
といったことを調べられます。
今すぐ全部使いこなす必要はありません。
でも、
ブラウザとサーバーの間で何が起きているかを見る道具がある
ということは覚えておきましょう。
これ、後々かなり役立ちます。
ワンポイント:actionって何?
フォームを見ていると、こんなコードも出てきます。
<form method="post" action="send.php">
また知らないものが出ました。
でも、ここまで来れば想像できます。
method は、
どうやって送る?
でした。
では、
action="send.php"
は?
これは、
どこへ送る?
です。
つまり、
<form method="post" action="send.php">
なら、
POSTという方法で、send.phpへ送ってね。
ということです。
フォームを見るときは、
method → どうやって送る?
action → どこへ送る?
name → 何という名前で送る?
この3つを見る。
これだけでも、かなりフォームが読めるようになります。
5話で「謎のコード」がつながってきた
最初は、
$_POST['name']
を見ても、
なんだこれ?
だったと思います。
でも今なら、
<form method="post">
を見て、
POSTで送るんだな。
<input name="name">
を見て、
nameという名前で送るんだな。
そして、
$_POST['name']
を見れば、
そのnameをPHPで受け取っているんだな。
とつながります。
これがコードを読むということです。
全部自分で書けなくてもいい。
正確な文法を忘れてもいい。
AIに、
「POSTでフォームを作りたい」
と頼んでもいい。
でも、AIが出してきたコードを見て、
「ああ、こうやってつながってるのか」
が分かる。
それで十分です。
次回は「フォームを送ったのに、違うPHPへ飛んだ?」
さて。
今回、
action="send.php"
という新しいものが出てきました。
送信先を指定するものでした。
では、
<form action="send.php" method="post">
と書いたのに、
- 404になった
- 違うページへ飛んだ
- PHPが見つからない
/send.phpとsend.phpで動きが違う
となったら?
ここで登場するのが、
相対パスと絶対パスです。
第6話は、
「send.phpが見つからない!」相対パスと絶対パスって何?
にしましょう。
フォームだけではなく、
<img src="">
<a href="">
<script src="">
<link href="">
にも全部つながります。
ここを理解すると、Web制作の「ファイルはあるのに見つからない!」が一気に減りますw
