KAKUTA TECH BLOG

Blog Article

PHP のフォーム送信を理解しよう! GET ・ POST ・ スーパーグローバル変数 の基礎からフォーム処理まで徹底解説

はじめに

Web サイトには、「ログイン」「会員登録」「お問い合わせ」「検索」など、ユーザーが情報を入力する場面が数多くあります。

これらの入力した情報は、ブラウザの中だけで処理されるわけではありません。入力した内容は Web サーバーへ送信され、 PHP が受け取って処理を行います。

この記事では、単にコードを書くだけではなく、「なぜその仕組みが必要なのか」「内部では何が起きているのか」まで順番に説明していきます。

参考にしたリンク

ブラウザからサーバーへ情報を送る仕組みを理解しよう

PHP はサーバー側で動作するプログラミング言語です。つまり、ブラウザに表示されている画面の中で PHP が動いているわけではありません。

例えば、お問い合わせフォームで次のように入力したとします。

名前 : 山田太郎
メールアドレス : test@example.com

入力が終わり、「送信」ボタンを押した瞬間、ブラウザは入力された内容をまとめて Web サーバーへ送信します。サーバーはその情報を受け取り、 PHP を実行します。

PHP は受け取ったデータを利用して、

  • データベースへ保存する
  • メールを送信する
  • 計算する
  • ログイン判定を行う

など、さまざまな処理を実行します。

つまり、フォーム送信とは「ブラウザからサーバーへデータを届ける仕組み」のことです。

もしこの仕組みが存在しなければ、ユーザーが入力した名前やパスワードを PHP が知る方法はありません。PHP はサーバー側で動いているため、ブラウザの入力欄を直接見ることはできないからです。そのため、「入力内容をサーバーへ送る」という処理が必要になります。

フォーム送信の流れ

  1. ユーザーがフォームへ入力する
  2. 「送信」ボタンを押す
  3. ブラウザが HTTP リクエストを作成する
  4. サーバーへ送信する
  5. PHP がリクエストを受け取る
  6. PHP が処理を実行する
  7. HTML を返す
  8. ブラウザが画面を表示する

✅️ この一連の流れを理解しておくと、これから学ぶ GET や POST が何のために存在しているのかが分かりやすくなります。

GET と POST はデータを送る方法の違い

🔰 一言で言うと、GET と POST は、ブラウザからサーバーへデータを送る方法が異なります。

ブラウザからサーバーへデータを送る方法にはいくつかありますが、その中でも最もよく使われるのが GET と POST です。重要なのは、「どのようにデータを送るか」という違いです。

GET

GET は、送信するデータを URL の末尾に付け加えてサーバーへ送信します。

💡 例えば GET は、

<https://example.com/search.php?keyword=php>

という URL があったとします。この URL の ? より後ろにある keyword=php という部分が送信されたデータです。ブラウザは URL にデータを付けた状態でサーバーへアクセスします。

そのため、検索結果ページを更新しても同じ検索結果を表示できたり、URL をコピーして他の人へ共有できたりします。

POST

一方、POST は URL にデータを付けません。送信するデータは HTTP リクエストの本文に格納され、サーバーへ送られます。そのため、住所やパスワード、メールアドレスなどのように URL に表示したくない情報を送る場合は POST が使われます。

⚠️ ここで注意したいのは、「POST は暗号化される」という意味ではありません。 POST は URL に表示されないだけであり、通信自体を安全にするのは HTTPS の役割です。

つまり、

  • GET は URL にデータを付けて送る
  • POST はリクエスト本文にデータを入れて送る

という違いがあります。

内部ではどう処理される?

内部では、 ブラウザがフォームの method 属性を確認し、その値が get なら URL にデータを付加し、post なら HTTP リクエスト本文へ格納して送信します。

サーバー側では、送られてきた HTTP リクエストを PHP が解析し、送信方法に応じて $_GET または $_POST にデータを格納します。

つまり、PHP はフォームの入力欄を直接見ているわけではありません。ブラウザが送信した HTTP リクエストを受け取り、その中に含まれるデータを取り出しやすいようにスーパーグローバル変数に用意してくれているのです。

だからこそ、「GET と POST は単なる書き方の違い」ではなく、「ブラウザがサーバーへデータを送る方法そのものの違い」と理解することが重要です。

スーパーグローバル変数とは何かを理解しよう

ここまでで、ブラウザは GET や POST を使ってサーバーへデータを送信することが分かりました。では、サーバーへ送られてきたデータは、PHP のプログラムからどのように取得するのでしょうか。その役割を担っているのが スーパーグローバル変数 です。

🔰 一言で言うと、スーパーグローバル変数とは PHP があらかじめ用意している特別な変数 のことです。

通常、PHP では変数を使う前に自分で作成する必要があります。

💡 次のコードでは name という変数を自分で作成しています。

<?php

$name = "田中";

echo $name;

このように、通常の変数は自分で作成してから利用します。

一方、スーパーグローバル変数は、PHP が自動的に用意してくれるため、自分で作成する必要がありません。

ブラウザから送信されたフォームのデータは、$_GET や $_POST に格納されます。PHP はブラウザから送られてきた HTTP リクエストを解析し、その内容を開発者が扱いやすい形にしてくれます。

なぜスーパーグローバル変数が必要なのか

スーパーグローバル変数がなければ、HTTP リクエストからデータを自分で取り出して解析する必要があります。

GET の場合、例えば次のような URL が送られてきます。

https://example.com/search.php?keyword=php&page=1

このデータを利用するには、

  • ? の位置を確認する
  • & でデータを区切る
  • = の前後を分ける
  • URL エンコードを元に戻す

といった処理が必要になります。

POST の場合も、HTTP リクエスト本文からデータを読み取り、送信形式に応じて解析する必要があります。

そこで PHP は、HTTP リクエストを解析したデータを、開発者がすぐに利用できる形で用意する仕組みを提供しています。それがスーパーグローバル変数です。

HTTP リクエストを PHP が解析した結果を、すぐに利用できる形で提供してくれる仕組み と考えると理解しやすいでしょう。

スーパーグローバル変数が用意される流れ

内部では、次のような流れで処理が行われています。

  1. ブラウザが HTTP リクエストを送信する
  2. Web サーバーがリクエストを受け取る
  3. PHP が実行される
  4. PHP が HTTP リクエストを解析する
  5. GET のデータは $_GET に格納される
  6. POST のデータは $_POST に格納される
  7. Cookie の情報は $_COOKIE に格納される
  8. セッション情報は $_SESSION に読み込まれる
  9. サーバー情報は $_SERVER に格納される
  10. プログラムの処理が始まる

つまり、$_GET や $_POST を使う頃には、PHP がすでに必要な情報を整理しています。そのため、開発者は HTTP の解析処理を自分で書くことなく、用意された変数からデータを取得できます。

スーパーグローバル変数は、PHP が HTTP リクエストから取得した情報を、プログラムから利用しやすい形で提供する仕組みです。PHP のフォーム処理や Web アプリケーション開発では、この仕組みを利用してブラウザから送られてきたデータを扱います。

スーパーグローバル変数 は配列としてデータを管理している

スーパーグローバル変数 のもう一つの特徴は、配列としてデータを管理していることです。

検索フォームから次のデータが送信されたとします。

keyword = php
page = 1

PHP はこれらのデータを、それぞれ独立した変数として管理しているわけではありません。代わりに、配列の中へ「キー」と「値」の組み合わせで保存しています。

イメージすると、次のような状態です。

$_GET
├── keyword => php
└── page => 1

そのため、keyword の値を取得したい場合は、配列から取り出すように記述します。

<?php

echo $_GET['keyword'];

実行結果

php

page を取得したい場合は、キーの名前を変更するだけです。

<?php

echo $_GET['page'];

実行結果

1

このように、スーパーグローバル変数 は通常の配列と同じような書き方でデータを取得できます。これは、送信されるデータの数が毎回変わる可能性があるためです。

一方、検索フォームでは検索キーワードだけを送信することもあります。もし PHP が固定の変数だけで管理していたら、送信項目が増えるたびに新しい変数を用意しなければなりません。

しかし、配列で管理していれば、送信される項目が増えても、その分だけキーが追加されるだけです。この仕組みによって、フォームの種類が変わっても柔軟にデータを扱えるようになっています。

だからこそ、$_GET['keyword'] や $_POST['email'] のような書き方になっているのです。

「配列だからこの書き方になる」のではなく、「送られてくるデータの数や内容が毎回変わるため、配列で管理するのが最も適している」と理解すると、今後さまざまなフォームを作成するときにも応用しやすくなります。

よく使う スーパーグローバル変数 の役割を理解しよう

PHP には複数の スーパーグローバル変数 が用意されていますが、初学者が最初に覚えるべきものは次の 5 つです。

スーパーグローバル変数

主な役割

$_GET

GET で送信されたデータを取得する

$_POST

POST で送信されたデータを取得する

$_SERVER

サーバーやリクエストに関する情報を取得する

$_SESSION

セッションに保存したデータを取得する

$_COOKIE

Cookie に保存されたデータを取得する

これらはすべて「何らかの情報を取り出す」という点では共通していますが、取得する情報の種類が異なります。$_GET と $_POST は、ユーザーがフォームから送信したデータを取得するために使用します。

  • $_SERVER はユーザーが入力した情報ではありません。現在アクセスしている URL、使用している HTTP メソッド、ブラウザの情報など、リクエストそのものやサーバーの状態に関する情報が格納されています。
  • $_SESSION は、一時的にユーザーごとの情報を保存しておくために使用します。

    例えば、ログインに成功したユーザーの情報を保存しておくことで、別のページへ移動しても「このユーザーはログイン済みである」と判定できます。

  • $_COOKIE は、ブラウザに保存されている情報を取得するために使用します。

    「ログイン状態を一定期間保持する」「前回選択した表示設定を記憶する」といった機能で利用されることがあります。

このように、すべて同じ スーパーグローバル変数 ではありますが、それぞれ担当している役割は異なります。

重要なのは、「どの スーパーグローバル変数 を使うか」は、どこから送られてきた情報なのかによって決まるということです。ブラウザから GET で送信されたなら $_GET、POST なら $_POST、Cookie に保存された情報なら $_COOKIE というように、情報の保存場所や送信方法に応じて使い分けます。

PHP でフォーム送信処理を実装してみよう

ここまでで、ブラウザは GET や POST を使ってサーバーへデータを送信し、PHP は スーパーグローバル変数 を使ってそのデータを受け取ることを学びました。ここからは、実際にフォームを作成し、送信されたデータを PHP で受け取る流れを確認していきます。

フォーム送信とは、ユーザーが入力したデータをブラウザからサーバーへ送る仕組みです。この仕組みがあることで、ログインや会員登録、お問い合わせ、検索などの機能を実現できます。

1. HTML でフォームを作成する

まずは、ユーザーが名前を入力するフォームを作成してみましょう。

<form action="result.php" method="post">
    <label for="name">名前</label>
    <input type="text" id="name" name="name">

    <button type="submit">送信</button>
</form>

<form> タグは、フォーム全体を表します。action 属性には送信先のファイルを指定し、この例では result.php にデータを送信します。また、method="post" は POST メソッドでデータを送信することを意味しています。

ここで特に重要なのが name 属性です。PHP は id を見てデータを受け取るのではなく、name の値をキーとして受け取ります。そのため、この入力欄に入力された内容は、name という名前で送信されます。

PHP で送信されたデータを受け取る

次は、送信されたデータを PHP で受け取って表示してみましょう。

<?php

$name = $_POST['name'];

echo $name;

$_POST は配列なので、$_POST['name'] と書くことで、name というキーに対応する値を取得できます。例えばフォームで「山田 太郎」と入力して送信すると、画面にはそのまま「山田 太郎」と表示されます。

フォーム送信では内部で何が起きているのか

送信ボタンを押すと、ブラウザはフォームに入力された内容をまとめて HTTP リクエストを作成します。そして、action 属性で指定された result.php へリクエストを送信します。

サーバーでは PHP がそのリクエストを受け取り、送信されたデータを解析します。今回は POST で送信しているため、PHP は受け取ったデータを自動的に $_POST へ格納します。その後、プログラムが実行されるため、$_POST['name'] と書くだけで入力された名前を取得できます。

フォームへ入力
      │
      ▼
送信ボタンを押す
      │
      ▼
ブラウザが HTTP リクエストを送信
      │
      ▼
PHP がリクエストを解析
      │
      ▼
$_POST にデータを格納
      │
      ▼
プログラムで値を取得

このように、フォーム送信は HTML がデータを送信し、HTTP がデータを運び、PHP が スーパーグローバル変数 に格納するという流れで実現されています。この仕組みを理解しておくと、今後ログイン機能やお問い合わせフォームなどを作成するときも、「ブラウザから送られてきたデータを PHP が受け取って処理している」という共通の考え方で理解できるようになります。

チャレンジ問題

理解度チェック

学んだ内容を確認してみましょう。各問題の選択肢から正しい答えを選んでください。

フォームで POST メソッドを使用した場合、送信されたデータはどのスーパーグローバル変数で取得しますか。

フォームで入力した値を PHP に送信するとき、PHP が値を識別するために使用する属性はどれですか。

次のうち、フォームで入力された name の値を取得するコードはどれですか。

次の処理のうち、フォーム送信後にユーザーへ入力内容を表示するコードとして正しいものはどれですか。