KAKUTA TECH BLOG

Blog Article

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

はじめに

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

例えば、お問い合わせフォームでは名前やメールアドレスを入力し、検索ページでは検索したいキーワードを入力します。これらの入力した情報は、ブラウザの中だけで処理されるわけではありません。入力した内容は Web サーバーへ送信され、 PHP が受け取って処理を行います。

この「ブラウザからサーバーへ情報を送る仕組み」を理解するために欠かせないのが、 GETPOST、そして スーパーグローバル変数 です。

PHP を学び始めたばかりの方は、

  • 「 GET と POST の違いが分からない」
  • 「なぜ $_GET$_POST が存在するのか分からない」
  • 「フォーム送信の仕組みがよく分からない」

という疑問を持つことが少なくありません。しかし、これらは PHP を使った Web アプリケーション開発では毎日のように使う知識です。

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

この記事を読み終える頃には、次の内容を説明できるようになることを目標としています。

  • GET と POST の違い
  • スーパーグローバル変数 が何なのか
  • $_GET$_POST$_SERVER$_SESSION$_COOKIE の役割
  • PHP で簡単なフォーム送信処理を書く方法

参考にしたリンク

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

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

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

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

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

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

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

つまり、フォーム送信とは「ブラウザからサーバーへデータを届ける仕組み」のことです。もしこの仕組みが存在しなければ、ユーザーが入力した名前やパスワードを PHP が知る方法はありません。

PHP はサーバー側で動いているため、ブラウザの入力欄を直接見ることはできないからです。そのため、「入力内容をサーバーへ送る」という処理が必要になります。

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

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

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

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

ブラウザからサーバーへデータを送る方法にはいくつかありますが、その中でも最もよく使われるのが GETPOST です。一言でいうと、どちらも「ブラウザからサーバーへデータを送る HTTP メソッド」です。

重要なのは、「どのようにデータを送るか」という違いです。GET は、送信するデータを URL の末尾に付け加えてサーバーへ送信します。

例えば、

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

という URL があったとします。この URL の ? より後ろにある

keyword=php

という部分が送信されたデータです。

ブラウザは URL にデータを付けた状態でサーバーへアクセスします。そのため、検索結果ページを更新しても同じ検索結果を表示できたり、 URL をコピーして他の人へ共有できたりします。

一方、 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 は単なる書き方の違い」ではなく、「ブラウザがサーバーへデータを送る方法そのものの違い」と理解することが重要です。

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

ここまでで、ブラウザは GETPOST を使ってサーバーへデータを送信することが分かりました。

では、サーバーへ送られてきたデータは、PHP のプログラムからどのように取得するのでしょうか。その役割を担っているのが スーパーグローバル変数 です。

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

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

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

ファイル名:sample.php

<?php

$name = "田中";

echo $name;

このように、通常の変数は自分で作成しなければ存在しません。

一方、スーパーグローバル変数 は違います。PHP がプログラムの実行開始時に、自動的に用意してくれる特別な変数です。

そのため、自分で作成しなくても最初から利用できます。

例えば、ブラウザから送信されたフォームのデータは、自動的に $_GET$_POST の中へ格納されています。つまり、PHP はブラウザから送られてきた HTTP リクエストを解析し、その内容を開発者が扱いやすい形へ変換してくれているのです。

もし スーパーグローバル変数 が存在しなかったらどうなるでしょうか。ブラウザから送られてきた HTTP リクエストは、文字列として送信されます。

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

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

PHP は、この URL を受け取っただけでは、どこがデータなのか分かりません。

そのため、

  • ? の位置を探す
  • & で区切る
  • = の前後を分割する
  • URL エンコードを元に戻す

といった処理を毎回自分で書かなければならなくなります。POST の場合はさらに大変です。HTTP リクエスト本文の中からデータを読み取り、送信形式に応じて解析しなければなりません。このような処理は、フォームを作るたびに必要になるため非常に面倒です。

そこで PHP は、「受け取ったデータを最初から配列へ整理しておこう」という仕組みを用意しました。それが スーパーグローバル変数 です。つまり、スーパーグローバル変数 は単なる便利な変数ではありません。

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 のフォーム処理や Web アプリケーション開発において欠かせない存在なのです。

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

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

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

keyword = php
page = 1

PHP はこれらのデータを、それぞれ独立した変数として管理しているわけではありません。

代わりに、配列の中へ「キー」と「値」の組み合わせで保存しています。

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

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

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

ファイル名:search.php

<?php

echo $_GET['keyword'];

実行結果

php

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

ファイル名:search.php

<?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 を学習していく上で非常に重要です。

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

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

フォーム送信とは、一言で言うとユーザーが入力したデータをブラウザからサーバーへ送る仕組みです。この仕組みがあることで、ログインや会員登録、お問い合わせ、検索などの機能を実現できます。PHP は入力欄を直接見ているわけではなく、ブラウザから送られてきた HTTP リクエストを受け取り、その内容を $_GET$_POST に格納しています。そのため、私たちは スーパーグローバル変数 から値を取得するだけで、入力内容を利用できます。

HTML でフォームを作成する

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

ファイル名:form.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 で受け取って表示してみましょう。

ファイル名:result.php

<?php

$name = $_POST['name'];

echo $name;

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

実際のアプリケーションでは、取得したデータを表示するだけではありません。データベースへ保存したり、ログイン認証を行ったり、メールを送信したりと、さまざまな処理に利用します。まずは「フォームで送信した値を PHP が取得できる」という基本を理解することが大切です。

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

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

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

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

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

チャレンジ問題

理解度チェック

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

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

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

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

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