php

入力した文字はどこへ行く?PHPのGETとPOSTを追いかけてみよう

ここまで、こんなフォームを使ってきました。

<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は email
PHPは mail

なので、名前が一致していないことに気付けます。

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

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。

☆ この授業をあとで見返す

学生登録(無料)すると、お気に入りに保存できます。授業は登録しなくても読めます。